Um zu prüfen ob ihr nicht nur eine IP-Adresse vom Router bekommen habt, sondern dass auch tatsächlich eine Verbindung zum Internet besteht, führt Android einen Captive Portal Check durch. Android sendet zur Prüfung eine Anfrage an connectivitycheck.gstatic.com. Wird diese Anfrage mit dem HTTP Response-Code 204 beantwortet, besteht Zugang zum Internet.
Ich blockiere die URL „connectivitycheck.gstatic.com" über Pi-Hole bzw. Blokada ( Beitrag über bei Kuketz Blog). Daher wird bei mir beim WLAN-Symbol in der Menüleiste ein kleines Kreuz angezeigt. Mit jeder Anfrage an die URL „connectivitycheck.gstatic.com" werden etliche Informationen über das System an Google übermittelt.
Verbindet euer Smartphone/Tablet via USB-Kabel mit eurem Rechner. ADB muss hierfür aktiviert sein. Über ein Terminal am Rechner ändert ihr nun die Einstellungen:
# Android 7 adb shell 'settings put global captive_portal_http_url "http://captiveportal.canox.net"' adb shell 'settings put global captive_portal_https_url "https://captiveportal.canox.net"'# Android 8 & 9 adb shell 'settings put global captive_portal_http_url "http://captiveportal.canox.net"' adb shell 'settings put global captive_portal_https_url "https://captiveportal.canox.net"' adb shell 'settings put global captive_portal_fallback_url "http://captiveportal.canox.net"' adb shell 'settings put global captive_portal_other_fallback_urls "http://captiveportal.canox.net"' # Prüfen ob die URLs angepasst wurden adb shell 'settings get global captive_portal_https_url'
Da Android als Antwort den HTTP Response-Code 204 erwartet, könnt ihr an einem Rechner überprüfen, ob diese Antwort gesendet wird.
curl -I http://captiveportal.canox.net
Antwort:
HTTP/1.1 204 No Content [...]
Den Connectivity-Check-Service kann jeder selbst hosten. Theoretisch könnt ihr hierfür auch einen Raspberrry Pi verwenden. Hier meine Konfiguration. Diese weicht von der Konfiguration von Kuketz Blog im Abschnitt „HTTPS" ab, da ich TLS 1.2 & TLS 1.3 verwende. Hinweis: Die Zeile „ssl_ciphers" wird von WordPress aufgrund der Länge umgebrochen, es gehört aber alles in eine Zeile
## SITE HANDLING HTTP ## server { ## INIT ## listen 80; server_name captiveportal.canox.net; root /var/www/captiveportal.canox.net; ## LOGS ## access_log off; error_log off; ## SECURITY HEADER ## add_header Content-Security-Policy "default-src 'none'"; ## ENTER HERE ## location / { # Let's encrypt location location ^~ /.well-known/acme-challenge { default_type text/plain; } location = /.well-known/acme-challenge/ { return 444; } ## CAPTIVE PORTAL RESPONSE location / { return 204; } } } ## SITE HANDLING HTTPS ## server { ## INIT ## listen 443 ssl; server_name captiveportal.canox.net; root /var/www/captiveportal.canox.net; ## LOGS ## access_log off; error_log off; ssl_protocols TLSv1.3 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256; ssl_certificate /etc/letsencrypt/live/apt.canox.net/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/apt.canox.net/privkey.pem; # managed by Certbot ssl_ecdh_curve secp384r1; ssl_dhparam /etc/nginx/dhparams-4096.pem; ssl_stapling on; ssl_stapling_verify on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 5m; ssl_session_tickets off; add_header Content-Security-Policy "default-src 'none'"; ## CAPTIVE PORTAL RESPONSE location / { return 204; } }