Hilfe: Captive Portal

Schnell mal bei Starbucks ins W-LAN. Ist schließlich kostenlos. Egal ob man sich mit seinem MacBook als Stammkunde an den Lieblingsplatz setzt oder im Potsdamer Sterncenter als Jugendlicher mit dem Billig-Androiden in der Nähe des Hotspots lungert: Bevor die Reise ins ungedrosselte Web los gehen kann, kommt immer diese eine lustige Seite, auf der man auf „Verbinden“ klicken muss.

Wie heißt diese Seite? Richtig: Captive Portal.

So etwas wollte ich auch mal machen. Erste Frage am Rande: Wie weiß das iOS-Device oder der Mac, dass es bzw. er sich an einem Hotspot aufhält und lädt eine Website? Das funktioniert so: bei einer neuen WiFi-Verbindung rufen die Apple-Gerätehttp://www.apple.com/library/test/success.html“ auf. In einem gewöhnlichen WiFi kann die originale Apple-Seite aufgerufen werden und es kommt ein „Success“ zurück. In Hotspots wird dieser Request vor erfolgter Auth(oris|entifiz)ierung an einen Server umgeleitet, der einen 302-Redirect zur Hotspot-Seite zurückgibt.

Wie macht man so etwas also selbst? Da ich so etwas gern Internet-ungebunden auf einem Raspberry Pi realisieren würde, käme es gar nicht so weit, dass die oben genannte Apple-Domain aufgelöst würde. Man müsste an den Pi also erst mal ein WiFi-Interface anschließen und dies als Access-Point laufen lassen. Damit der von mir verwendete WiFi-Adapter mit dem verwendeten „hostapd“ funktioniert, waren außerdem noch Modifikationen vonnöten. Da das Ganze nachher nicht am Internet hängen soll, brauche ich jetzt noch folgendes:

  • Einen DHCP-Server (habe es schon erfolgreich mit dem „ISC DHCP Server“ probiert, bin aber offen für Alternativen), der neuen Clients eine IP-Adresse, die Gateway-IP (in dem Fall die IP des Pi) und den DNS-Server (auch der Pi) zuweist.
  • Einen einfachen DNS-Server (also wohl nicht BIND), an den Apple-Devices ihre obige Anfrage stellen können, der darüber hinaus aber alle DNS-Anfragen mit einer nichtigen IP-Adresse beantwortet.
  • Irgendeine iptables-Konfiguration, damit die an die nichtige IP gestellten HTTP-Requests an einen Server umgeleitet werden. Dort beispielsweise an Port 8080.
  • Einen Webserver (zum Beispiel nginx), der so konfiguriert ist, dass er bei Anfragen auf Port 8080 einen 302-Redirect auf sich selbst, allerdings auf Port 80 zurück gibt, damit der Browser die Captive-Website anzeigt.

Wer weiß, wie ich diese Dinge umsetzen kann, möge sich per Kommentar, Mention oder sonst wie bei mir melden. <3