Laden...

Eigener Hotspot - Captive Portal

Letzter Beitrag vor 9 Jahren 6 Posts 3.959 Views
Eigener Hotspot - Captive Portal

Hallo zusammen,

es gibt da ein Szenario, für dessen Lösung ich mir schon seit einigen Tagen den Kopf zerbreche (und irgendwie keinen richtigen Ansatz finde): Es soll ein (unverschlüsselter) WLAN-Hotspot bereit gestellt werden. Wenn man sich in dieses WLAN eingewählt hat, kann man darüber nur eine einzige Webseite erreichen.
Ein Use-Case wäre z.B., dass man in eine Kantine kommt, sich mit seinem Smartphone in das Kantinen-WLAN einwählt und das komplette Menüangebot für die aktuelle Woche angezeigt bekommt.

Das Erstellen eines WLAN-Netzwerkes mit Windows 7/8-Boardmitteln ist kein Problem. Ebensowenig das Bereitstellen der Webseite. Was mir das Kopfzerbrechen macht, sind die folgenden beiden Wünsche:*Es soll - egal welche Web-Adresse im Browser eingegeben wird(!) - immer auf die eine Portal-Webseite umgeleitet werden (läuft oft unter dem Begriff "captive portal"). *Nach dem Verbinden zum WLAN soll die Portal-Webseite sofort geöffnet werden.

Diese beiden Funktionen kenne ich z.B. von Hotel-WLANs. Man kann sich ins WLAN einwählen, wird aber (zunächst) immer auf die WiFi-Login-Seite umgeleitet; oder man muss zunächst die AGBs für die freie Internetbenutzung bestätigen (wie es z.B. oft bei populären Restaurants/Cafés angeboten wird). Ebenso kenne ich es vom Smartphone, dass gleich nach dem Verbinden zum WLAN die entsprechende Login/AGB/...-Seite geöffnet wird.

Kann ich diese Funktionen irgendwie unkompliziert und mit Boardmitteln umsetzen? Zielsystem ist Windows 7/8; der Webserver (IIS) läuft auf dem gleichen Rechner, der den Hotspot bereit stellen soll; eine Freigabe der Internetverbindung ist nicht notwendig (und auch nicht gewünscht).

Es wäre schön, wenn mir jemand einen Stups in die richtige Richtung geben könnte 😃

dN!3L

Ahnung hab ich keine aber eine Idee 😃
Dein WLAN braucht ein DNS System. Wenn du das so aufsetzen kannst dass es alles an den lokalen Rechner weiterleitet hast du schon das gröbste geschafft.
Im Webserver leitest du dann alles was nicht deinen Wünschen entspricht an eine neue URL um.

Eigener DNS Server, der auf alle Anfragen mit der lokalen IP antwortet klingt vernünftig.

Die automatische Umleitung auf die Startseite wird meist mit einem versteckten HTTP-Request realisiert.

Bei iOS sieht das wie folgt aus:

GET /library/test/success.html HTTP/1.0
Host: [URL]www.apple.com[/URL]
User-Agent: CaptiveNetworkSupport/1.0 wispr
Connection: close

Apple erwartet, dass hier mit StatusCode 200 geantwortet wird. Wenn hingegen ein HTTP-Redirect zurückkommt (StatusCode 302), sollte sich magisch der Browser mit dieser Seite öffnen.

Google/Android fragt nach http://clients3.google.com/generate_204 und erwartet StatusCode 204, also auch hier einfach mit redirect (302) antworten.

Windows fragt nach http://www.msftncsi.com/ncsi.txt und erwartet StatusCode 200 mit der exakten Antwort "Microsoft NCSI".

Der Post How to create WiFi popup login page hilft dir vielleicht auch weiter.

Diese Anfrage-Pattern müsstest du anhand von Host/Domain/User-Agent eigentlich gut herausfiltern können, beispielsweise mit URL rewrite rules. Oder einfach auf alles mit nem 302-Redirect antworten, was nicht deiner normalen Kantinen-Url entspricht.

Stichwort hast du ja eigentlich schon genannt: "Captive Portal Detection"

beste Grüße
zommi

Hallo,

so spontan fallen mir 2 Wege ein:

  1. statisches Routing (alle Adressen werden auf den Webserver geroutet, und der catcht alle Zugriffe und zeigt das Portal an, entspricht dem Vorschlag von chilic)
  2. ein transparenter Proxy, der alle Anfragen auf das Portal weiterleitet.

Im Prinzip ist es immer das selbe: Musst halt auf jeden Fall alle Anfragen abfangen, ob das nun der Webserver oder der Router oder eben ein Proxy macht, ist eine Implementierungsfrage.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Das "Ahnung hab ich keine aber eine Idee" ist genau das Problem, was ich habe 😃

Die beiden Möglichkeiten, die gern genutzt werden, sind:*HTTP-Redirect. Die Umleitung an sich ist trivial, wie allerdings komme ich an die Stelle, an der man alle HTTP-Requests - egal an welche IP - manipulieren kann? *DNS-Redirect. Man macht quasi ein DNS-Poisoning (mit TTL=0, damit die Auswirkungen nicht so groß sind). Aber auch hier wieder - wie bekomme ich denn die Hotspot-User davon überzeugt, dass ich der zu verwendende DNS-Server bin? Und wie implementiere ich den am besten?

Wie gesagt, Ideen habe ich auch, aber wie würde eine konkrete Implementierung aussehen? Kann ich einfach so alle HTTP-Requests abfangen? Kann ich einfach einen eigenen DNS-Server implementieren? Wie mache ich möglichst wenig "kaputt" (wie kann ich das Server-System einfach in den Ursprungszustand versetzen und funktionieren die Clients nach einem Disconnect vom Netzwerk wieder normal)?

Um TTL=0 müsstest du dir meines Wissens keine Sorge machen.

Alle Clients sollten bei einem disconnect/reconnect ihre DNS-caches so oder so leeren. Wenn da Leichern übrig bleiben würden, würde da irgendwie einfach alles schief laufen.

Du musst beide Möglichkeiten kombinieren!
Ohne den DNS-Server und ne gescheite Antwort sendet der Client ja kein einziges HTTP-Paket los.

wie bekomme ich denn die Hotspot-User davon überzeugt, dass ich der zu verwendende DNS-Server bin

Der Hotspot verteil über DHCP an die Clients IP-Adressen und DNS-Server Adressen. Hier trägst du die IP deines DNS-Servers ein.

Kann ich einfach so alle HTTP-Requests abfangen? Ja, machen alle so 😉 (HTTPS hingegen geht nicht)

Kann ich einfach einen eigenen DNS-Server implementieren? Ja klar, das Protokoll ist einfach. Aber ich würde da nach einem kleinen Tool suchen.

Wie mache ich möglichst wenig "kaputt" Auf den Clients kannst du wenig kaputt machen.

wie kann ich das Server-System einfach in den Ursprungszustand versetzen DNS-Server abschalten. Bzw vielmehr musst du beim DHCP-Server den dort hinterlegten DNS-Server anpassen.