Dein Android Smartphone frägt bei jedem neuen Aufbau einer Netzwerkverbindung, den Captive Portal Server von Google, ob ein freier Internetzugriff möglich ist, oder ob du dich z.B. in einem Gäste-WLAN anmelden musst.
Dabei werden laut Sicherheitsforschern Informationen wie die aktuelle IP-Adresse, Betriebssysteminformationen und Browserinformationen an Google übertragen.
Daraus lässt sich auch in etwa dein Standort bestimmen.
Ein Auszug des Logs, welches mit dieser Anleitung erstellt wurde, sieht z.B. so aus:
IPv4_oder_IPv6-Adresse - - [13/Aug/2023:00:16:27 +0000] "GET / HTTP/1.1" 204 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.32 Safari/537.36"
Wer das nicht möchte, kann mit etwas Aufwand ein eigenes Captive Portal betreiben.
Besser gesagt, ein 0815-Webserver der auf Anfragen mit dem Code 204 antwortet. Also “du hast Internet”.
Falls dir die Anleitung schon beim Überfliegen zu viel Arbeit ist, nutze doch einfach mein öffentliches Captive Portal!
Dies ist über http(s)://captiveportal.hoerli.net erreichbar. Die notwendigen Befehle gibts unten ab Schritt 6.
Es ist hochverfügbar aufgestellt, mit aktuell 4 Servern in Deutschland.
Was brauchen wir dafür?
– Am besten einen Linux-Server (Windows würde auch gehen)
– Zugriff auf die Konfiguration des Webservers (root-Account ggf. notwendig)
– Eine (Sub-)Domain
– Ein SSL-Zertifikat (z.B. ein kostenloses von Let’s Encrypt)
– Port 80 und 443 muss vom Internet aus erreichbar sein
Diese Anleitung basiert auf einem Linux-System mit nginx als Webserver und einem Let’s Encrypt-Zertifikat.
1. Webserver installieren
Wir installieren nginx als Webserver. Das bekommen wir mit diesem Befehl hin:
# apt install nginx -y
2. Die Konfiguration anlegen
Zuerst solltest du die Standardkonfiguration löschen:
# rm /etc/nginx/sites-enabled/default
Dann legen wir eine neue an
# nano /etc/nginx/sites-enabled/captiveportal
Diese befüllen wir mit folgendem Inhalt:
server { listen 80; listen [::]:80; access_log off; # access_log /var/log/nginx/captiveportal.DEINE-DOMAIN.DE.access.log; # error_log /var/log/nginx/captiveportal.DEINE-DOMAIN.DE.error.log crit; server_name captiveportal.DEINE-DOMAIN.DE; root /var/www/captiveportal.DEINE-DOMAIN.DE; location / { location ^~ /.well-known/acme-challenge { default_type text/plain; } location = /.well-known/acme-challenge/ { return 444; } ## CAPTIVE PORTAL RESPONSE location / { return 204; } } } server { listen 443 ssl http2; listen [::]:443 ssl http2; access_log off; # access_log /var/log/nginx/captiveportal.DEINE-DOMAIN.DE-ssl.access.log; # error_log /var/log/nginx/captiveportal.DEINE-DOMAIN.DE-ssl.error.log crit; server_name captiveportal.DEINE-DOMAIN.DE; ssl_certificate /etc/letsencrypt/live/captiveportal.DEINE-DOMAIN.DE/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/captiveportal.DEINE-DOMAIN.DE/privkey.pem; add_header Content-Security-Policy "default-src 'none'"; ssl_stapling on; ssl_stapling_verify on; root /var/www/captiveportal.DEINE-DOMAIN.DE; server_tokens off; index index.html; location / { return 204; } }
ACHTUNG: Wir sind mit der Konfiguration noch NICHT fertig!
3. Lege ein leeren Root-Ordner an
So haben wir zur Not ein Verzeichnis, indem absolut nichts drin ist.
# mkdir /var/www/captiveportal.DEINE-DOMAIN.DE
4. ACME installieren
Da wir kein Verzeichnis bereitstellen, kann der Certbot nicht arbeiten.
Deshalb nutzen wir ACME.sh, um ein Let’s Encrypt-Zertifikat erstellen zu können.
Eine Anleitung wie du ein Zertifikat ausstellen kannst, findest du hier:
>> ACME.sh – Let’s Encrypt Zertifikate per DNS-Eintrag ausstellen
Sobald du das Zertifikat hast, können wir weiter machen.
5. SSL-Zertifikate hinterlegen
Öffne erneut die nginx-Konfiguration und passe die Parameter für die SSL-Zertifikate an
ssl_certificate /etc/letsencrypt/live/captiveportal.DEINE-DOMAIN.DE/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/captiveportal.DEINE-DOMAIN.DE/privkey.pem;
Je nach dem wo du mit Hilfe von ACME das Zertifikat und den privaten Schlüssel abgelegt hast, musst du den gesamten Pfad anpassen und nicht nur die hervorgehobene Stelle!
6. nginx-Konfiguration prüfen und übernehmen
Nun prüfen wir, ob alles passt:
# nginx -t
Ist kein Fehler aufgetreten, können wir nginx neu starten lassen:
# service nginx reload
Du kannst auch über ein Terminal (egal ob Linux oder Windows) einmal die Seite aufrufen lassen. Nutze dazu folgenden Befehl:
curl -I http://captiveportal.DEINE-DOMAIN.DE
Sollte etwa so aussehen:
>> curl -I https://captiveportal.hoerli.net HTTP/1.1 204 No Content Server: nginx Date: Sat, 29 Jul 2023 15:28:34 GMT Connection: keep-alive Content-Security-Policy: default-src 'none'
7. Android-Smartphone mit dem Captive-Portal ausstatten
Allgemeiner Hinweis: Dein Smartphone muss nicht gerootet sein. Dein Android-System an sich bleibt unangetastet. Dies ist nur eine “versteckte” Option, welche über die normalen Einstellungen nicht ersichtlich ist. Alles lässt sich bei Bedarf rückgängig machen.
7.1 Öffne die Einstellungen und aktiviere USB-Debugging
Einstellungen -> Entwickleroptionen -> USB-Debugging
7.2 Lade dir die aktuellen ADB-Tools HIER herunter und entpacke sie
7.3 Verbinde dich mit deinem Smartphone via ADB
Öffne dazu auf Windows eine PowerShell-Instanz als Administrator und navigiere dich in den Ordner der ADB-Tools.
Nutzt du Linux, werde dort root-Benutzer (su – / sudo su) und navigiere dich in einem Terminal zum ADB-Tools-Ordner.
Setze darin folgenden Befehl ab:
# adb devices
Auf dem Smartphone nun auf “Erlauben” klicken.
7.4 Setze folgende Befehle ab:
FÜR ANDROID 7.X UND NIEDRIGER:
adb shell 'settings put global captive_portal_http_url "http://captiveportal.DEINE-DOMAIN.DE"' adb shell 'settings put global captive_portal_https_url "https://captiveportal.DEINE-DOMAIN.DE"'
Ersetze dabei die Domain, mit deiner Captive-Portal-Domain.
FÜR ANDROID 8.X UND HÖHER:
adb shell 'settings put global captive_portal_http_url "http://captiveportal.DEINE-DOMAIN.DE"' adb shell 'settings put global captive_portal_https_url "https://captiveportal.DEINE-DOMAIN.DE"' adb shell 'settings put global captive_portal_fallback_url "http://captiveportal.DEINE-DOMAIN.DE"' adb shell 'settings put global captive_portal_other_fallback_urls "http://captiveportal.DEINE-DOMAIN.DE"'
Ersetze dabei die Domain, mit deiner Captive-Portal-Domain.
7.5 Prüfen, ob die Einstellungen übernommen wurden mit:
adb shell 'settings get global captive_portal_https_url'
Es sollte deine Domain erscheinen.
Willst du lieber mein öffentliches Captive Portal nutzen? Hier sind die passenden Befehle dafür:
FÜR ANDROID 7.X UND NIEDRIGER:
adb shell 'settings put global captive_portal_http_url "http://captiveportal.hoerli.net"' adb shell 'settings put global captive_portal_https_url "https://captiveportal.hoerli.net"'
FÜR ANDROID 8.X UND HÖHER:
adb shell 'settings put global captive_portal_http_url "http://captiveportal.hoerli.net"' adb shell 'settings put global captive_portal_https_url "https://captiveportal.hoerli.net"' adb shell 'settings put global captive_portal_fallback_url "http://captiveportal.hoerli.net"' adb shell 'settings put global captive_portal_other_fallback_urls "http://captiveportal.hoerli.net"'
Aktuell gibt es 4 Server in Deutschland, welche für deine Anfrage zur Verfügung stehen.
IPv4 und IPv6-Adressen sind ebenfalls vorhanden.
Du solltest also von jeder Ecke des Landes aus gut Angebunden sein.
Viele Informationen für diese Anleitung stammen aus dem Blog-Beitrag von Mike Kuketz.
Er stellst selbst ebenfalls ein Captive Portal bereit.
Kann man, wenn man WLAN zuhause nutzt, einfach die Adresse des routers angeben, um die externe Abfrage, ob mein lokales Netz über einen funktionierenen Internetzugang verfügt, zu umgehen? ..da ich ja weiß, dass mein router Netzzugang hat. Ist der Router aus, gibt’s ja eh kein WLANetz.
Für Netz unterwegs habe ich bisher mit der app trackercontrol den Internetzugang für captive portal und gps-Dienste untersagt und als captive-Adresse mangels Wissen einfach via adb 127.0.0.1 zugewiesen. Ich bekomme vom WLAN-modul auf dem Handy nun stets die Meldung, dass kein Internet besteht, kann aber web-Seiten problemlos aufrufen und apps, die einen Internetzugang benötigen, laufen.
Funktioniert das auch oder brauche ich unbedingt eine Gegenstelle im Netz?
Das macht wenig Sinn / Funktioniert unter Umständen nicht. Die Gegenstelle muss mit Code “200” antworten, was dein Router ggf. nicht einfach so macht.
Du willst ja eine Adresse im Internet aufrufen, um zu prüfen, ob Internet an sich verfügbar ist.
Die Anmelde-Portale von HotSpots merken dies und leiten diese Anfragen bei Bedarf auf deren Anmelde-Seiten weiter.
Wenn du das immer unterbindest, musst du – wie bereits geschrieben – alles von Hand eingeben.
Kann dadurch auch der Internetzugriff nicht erkannt werden, können Apps ihren Dienst verweigern, sofern sie Internet brauchen.