Eigenes Captive Portal – Frag nicht immer Google nach Internet

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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.