Featured image

Kein Internet im Flixzug unter Linux

Ich sitze gerade im Flixzug und habe wieder das Problem, dass das Internet nicht funktioniert. Auf dem Handy klappt es wie immer problemlos. Was nicht klappt ist die AGBs vom Flixzug zu akzeptieren, um das Internet freigeschaltet zu bekommen. Auf dem Handy poppt einfach ein Browser-Fenster auf, in dem ich auf Akzeptieren klicken kann. Los ging die Debug-Session:

Firefox erkennt, dass es im WLAN ein Captive Portal gibt.

Dazu ruft Firefox eine vordefinierte URL auf, die normalerweise keinen Redirect (302) zurückgibt:

GET /canonical.html HTTP/1.1
Host: detectportal.firefox.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:107.0) Gecko/20100101 Firefox/107.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Pragma: no-cache
Connection: keep-alive

HTTP/1.1 302 Found
Server: squid
Date: Thu, 24 Nov 2022 11:51:09 GMT
Content-Length: 0
Location: https://media.flixtrain.com/redirect?url=http%3A%2F%2Fdetectportal.firefox.com%2Fcanonical.html
X-Cache: MISS from IMP-redirect
X-Cache-Lookup: MISS from IMP-redirect:3129
Via: 1.1 IMP-redirect (squid)
Connection: close

Alle Requests Richtung Internet geben einen Redirect auf https://media.flixtrain.com/redirect?url=<ursprünglich_angefrage_url> zurück. Allerdings finde ich dort nirgends einen Button zum Akzeptieren der AGBs, nur das Media-Center. Hmm. Wie/Warum klappt das bei Android? Nach kurzem Googeln bin ich auf eine mögliche Lösung gestoßen: RFC 8910 (Captive-Portal Identification in DHCP and Router Advertisements (RAs):

Und das war es dann auch tatsächlich. Bei RFC 8910 sendet der DHCP Server die Captive Portal URL über eine DHCP Option mit:

Beim Aufrufen der URL wird ein json mit der URL des eigentlichen Captive Portals zurückgegeben:

kmille@linbox:~ curl 'https://media.flixtrain.com/services/cna/capport'
{"captive":true,"user-portal-url":"https://media.flixtrain.com/services/cna/landing?type=capport"}
kmille@linbox:~
kmille@linbox:~ curl -v 'https://media.flixtrain.com/services/cna/landing?type=capport'
*   Trying 10.101.8.121:443...
* Connected to media.flixtrain.com (10.101.8.121) port 443 (#0)
...
< Location: https://media.flixtrain.com/landing-nocopy.html
< Connection: keep-alive
< Strict-Transport-Security: max-age=63072000; includeSubDomains
<
<html>
<head><title>302 Found</title></head>
<body>
<center><h1>302 Found</h1></center>
<hr><center>nginx</center>
</body>
</html>
* Connection #0 to host media.flixtrain.com left intact

Am Ende zeigt https://media.flixtrain.com/landing-nocopy.html das Fenster zum Akzeptieren der AGBs an und das Internet tut wieder. Übrigens unterstützt systemd-networkd aktuell RFC 8910 nicht. Ich habe dazu mal ein Feature Request erstellt. Trotz 276 Minuten Verspätung und Endhaltestelle in Erfurt statt Berlin immerhin mal wieder was technisches gemacht und gebloggt \o/.

Fun fact: jetzt sitze ich in der DB um nach Berlin zu kommen und habe das nächste Captive Portal vor mir:

kmille@linbox:~ curl -v heise.de
*   Trying 193.99.144.80:80...
*   Trying [2a02:2e0:3fe:1001:302::]:80...
* Immediate connect fail for 2a02:2e0:3fe:1001:302::: Network is unreachable
* Connected to heise.de (193.99.144.80) port 80 (#0)
> GET / HTTP/1.1
> Host: heise.de
> User-Agent: curl/7.86.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 302 Found
< Server: squid
< Date: Thu, 24 Nov 2022 15:19:49 GMT
< Content-Length: 0
< Location: http://wifi.bahn.de?url=http%3A%2F%2Fheise.de%2F
< X-Cache: MISS from IMP-redirect
< X-Cache-Lookup: MISS from IMP-redirect:3129
< Via: 1.1 IMP-redirect (squid)
< Connection: close
<
* Closing connection 0