Zu den ärgerlichen Folgen des Irrsinns vom „geistigem Eigentum“
gehören Captive Portals, also Webseiten, auf die mensch in öffentlichen
WLANs erstmal umgeleitet wird. Erst, wer Familienpackungen Javascript
ausführen lässt und schließlich per Häkchen lügt, er_sie habe die
Nutzungsbedingungen gelesen und anerkannt, darf ins Netz. Allein fürs
Öffnen dieser Sicherheitslücke („gehen Sie in irgendein unbekanntes
Netz und lassen Sie ihren Browser allen Code ausführen, der da
rauskommt, und dann ziehen Sie noch megabyteweise Bilder – vielleicht
ist ja in einem der Bilder-Decoder auch noch ein Buffer Overflow“)
verdient die Geistiges-Eigentum-Mafia Teeren und Federn.
Na ja, und erstaunlich oft ist der Mist einfach kaputt. Eine besondere
Kränkung für die Ingenieursabteilung meines Herzens ist, wenn die ganze
aufregende Hi-Tech, mit der mensch in fahrenden Zügen ins Netz kann,
prima geht, aber trotzdem kein Bit durch die Leitung zu kriegen ist,
weil ein „Web-Programmierer“ im doofen Captive Portal gemurkst hat.
Kaputt sah das WLAN für mich heute in einem Zug von Go-Ahead aus.
Die Geschichte, wie ich mich dennoch ins Netz vorgekämpft habe,
finde ich im Hinblick auf manuelles Fummeln an IP-Netzen instruktiv, und
so dachte ich mir, ich könnte im nächsten Zug (betrieben von der Bahn
und deshalb noch nicht mal mit kaputtem Internet ausgestattet)
zusammenschreiben, was ich alles gemacht habe. Das Tooling, das ich
dabei verwende, ist etwas, öhm, oldschool. So sollte ich statt ifconfig
und route heute wohl lieber ein Programm mit dem schönen Namen ip
verwenden. Aber leider finde ich dessen Kommandozeile immer noch
ziemlich grässlich, und solange die guten alten Programme aus grauer
Vorzeit immer noch auf eigentlich allen Linuxen rumliegen, kann ich mich
einfach nicht zur Migration durchringen.
Am Anfang stand die einfache ifupdown-Konfiguration für das Zug-Netz:
iface roam inet dhcp
wireless-essid freeWIFIahead!
in /etc/network/interfaces.d/roam. Damit kann ich sudo ifup
wlan0=roam laufen lassen, und der Kram sollte sich verbinden (wenn ihr
die Interface-Umbenamsung der systemd-Umgebung nicht wie ich
abgeschaltet habt, würde vor dem = einer der kompizierten
„vorhersagbaren“ Buchstabensuppen der Art wp4e1 oder so stehen).
Nur: das Netz kam nicht hoch. Ein Blick nach /var/log/syslog
(wie gesagt: etwas altbackenes Tooling; moderner Kram bräuchte hier eine
wilde journalctl-Kommandozeile) liefert:
Jan 2 1████████ victor kernel: wlan0: associate with be:30:7e:07:8e:82 (try 1/3)
Jan 2 1████████ victor kernel: wlan0: RX AssocResp from be:30:7e:07:8e:82 (capab=0x401 status=0 aid=4)
Jan 2 1████████ victor kernel: wlan0: associated
Jan 2 1████████ victor kernel: IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
Jan 2 1████████ victor dhclient[18221]: Listening on LPF/wlan0/█████████████████
Jan 2 1████████ victor dhclient[18221]: Sending on LPF/wlan0/█████████████████
Jan 2 1████████ victor dhclient[18221]: Sending on Socket/fallback
Jan 2 1████████ victor dhclient[18221]: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6
Jan 2 1████████ victor dhclient[18221]: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 14
Jan 2 1████████ victor dhclient[18221]: DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 1
Jan 2 1████████ victor dhclient[18221]: No DHCPOFFERS received.
Das bedeutet: Das lokale „Router“ (Access Point, AP) hat mich ins Netz
gelassen („associated“; das ist quasi das Stecken des Netzkabels), aber
dann hat der DHCP-Server, der mir eigentlich eine IP-Adresse hätte
zuteilen sollen (mit der ich dann übers lokale Netz hinauskommen
könnte), genau das nicht getan: „No DHCPOFFERS received“.
Wenn das so ist – der Rechner ist Teil von einem Ethernet-Segment, sieht
mithin Netzwerkverkehr, bekommt aber keine IP-Adresse und kann also mit
niemandem über TCP/IP reden –, lohnt sich ein Blick in die Pakete, die
im Netzwerksegment unterwegs sind. Das geht mit fetten Grafikmonstern
wie wireshark, aber für einen schnellen Blick tut es tcpdump
allemal. Da wir aber noch keine Internet-Verbindung haben, können wir
sicher keine IP-Adressen („192.168.1.15“) zu Namen („blog.tfiu.de“)
auflösen. Tatsächlich würde der Versuch tcpdump schon zum Stehen
bringen. Deshalb habe ich per -n bestellt, Adressen numerisch
auszugeben:
tcpdump -n
Ich sehe dabei einen Haufen ARP-requests, also Versuche, die lokalen
Adressen von Ethernet-Karten für IP-Adressen herauszufinden, von denen
der Router meint, sie müssten im lokalen Ethernet-Segment sein, etwa:
12:█████████383626 ARP, Request who-has 10.1.224.139 tell 10.1.0.1, length 28
Aus dieser Zeile allein kann ich schon mal raten, dass das Gateway, also
der Router, über den ich ins Internet kommen könnte, wohl die Maschine
10.1.0.1 sein wird. Dabei sind Adressen aus dem 10er-Block leicht
magisch, weil sie nicht (öffentlich) geroutet werden und daher (im
Gegensatz zu normalen IP-Adressen) im Internet beliebig oft vorkommen
können. Sie sind deshalb für relativ abgeschottete Unternetze wie hier
im Zug populär (ins richtige Netz gehts dann per Network Address
Translation NAT) – und Maschinen mit .1 hinten dran sind konventionell
gerne Router.
Wenn ich mit dem Gateway reden will, brauche ich immer noch selbst eine
IP-Adresse. Ohne DHCP-Server bleibt mir wenig übrig als mir selbst eine
zu nehmen. Das ist normalerweise ein unfreundlicher Akt, denn wer eine
Adresse wiederverwendet, die jemand anders in dem Teilnetz schon hat,
macht die Verbindung für den anderen Rechner im Effekt kaputt.
Insofern: Wer etwas wie das Folgende tut, sollte erstmal für eine Weile
dem tcpdump zusehen und sicherstellen, dass sonst niemand mit der
gewählten Adresse unterwegs ist. Wer öfter zu Stunts dieser Art
genötigt ist, möge sich arping ansehen – damit kann mensch kontrolliert
nachsehen, ob eine Adresse frei ist.
In meinem Fall war es ruhig im Netz – es hat ja vermutlich auch kaum
jemand sonst eine Verbindung bekommen. Ich fühlte mich also hinreichend
sicher, irgendwas zu probieren, das der Router wohl als „im eigenen
Netz“ akzeptieren würde. Die so geratene Adresse habe ich versuchsweise
auf meine Netzwerkschnittstelle geklebt:
sudo ifconfig wlan0 inet 10.1.0.105 up
Ein guter erster Tipp für diese Zwecke ist eine Adresse, bei der
nur das letzte Byte anders ist als in der Router-Adresse (in antikem
Jargon: „im selben Klasse C-Netz“). In diesem Fall wäre es denkbar,
noch mehr zu ändern, denn im antiken Jargon ist 10.0.0.0 ein A-Netz
(„die Netzmaske ist 255.0.0.0“), was mit dem Kommando oben (das nicht
explizit eine andere Netzmaske gibt) den lokalen Rechner Pakete, die
an eine 10.irgendwas-Adresse gehen, an wlan0 schicken lässt.
Allerdings macht fast niemand mehr Routen nach diesen Regeln, und so ist
es nicht unwahrscheinlich, dass der Router allzu weit entfernte Adressen
routen will oder jedenfalls nicht einfach wieder ins lokale Netz-Segment
zurückschickt. So in etwa ist die Logik, die mich auf die IP-Adresse
oben gebracht hat.
Wenn meine Vermutungen richtig waren, hätte ich nach dem ifconfig mit
dem vermuteten Router bei 10.1.0.1 IP sprechen können. Der Klassiker
zur Konnektivitätsprüfung ist ping, und wirklich:
ping 10.1.0.1
kriegte brav Paket für Paekt zurück. Wow! Immerhin schon IP!
Ein DHCP-Server konfiguriert als nächstes normalerweise die
„Default-Route“, also das, was der Rechner mit Paketen tun soll, für die
er nichts anderes weiß. Rechner am Rande des Netzes (und wir
ungewaschenen Massen sind eigentlich immer mehr oder weniger am Rande
des Netzes) schicken in der Regel alle Pakete, die nicht ins lokale Netz
gehen, an einen (und nur einen) Router, nämlich ihr Gateway. Dieses
Gateway legt mensch mit meinen alten Werkzeugen so fest:
sudo route add default gw 10.1.0.1
Damit könnte ich im Netz sein. Ein schnelles ssh auf eine meiner
Maschinen im Netz führt aber zu nichts: meine Maschine kann keine Namen
auflösen. Ach ja, das ist noch etwas, das normalerweise ein DHCP-Server
macht: der lokalen Maschine Adressen geben, an denen sie Namen auflösen
kann (die DNS-Server). Über (inzwischen potenziell sehr komplizierte)
Umwege enden diese Adressen in gewissem Sinn in der Datei
/etc/resolv.conf; dort erwartet sie jedenfalls die C-Bibliothek.
Nun ist aber der DHCP-Server gerade kaputt. Die Namen von DNS-Servern,
die aus einem bestimmten Netz heraus funktionieren, kann mensch jedoch
nicht raten. Manchmal – typisch bei privaten Netzen – tut es der Router
selbst. Andererseits betreibt Google unter 8.8.8.8 einen DNS-Server,
und so ungern ich Google-Dienste empfehle: Die 8.8.8.8 verwende ich in
Notsituationen wie dieser. Nur bin ich ja immer noch im Captive Portal,
und der Router mag meine Versuche, mit dem Google-DNS zu reden,
unterbinden. Viele Captive Portals tun das nicht (aus relativ guten
Gründen). Und wirklich:
ping 8.8.8.8
kommt gut zurück. Andererseits kann mir das Captive Portal natürlich
alles vorspielen. Ist da wirklich ein DNS-Server?
Das Tool der Wahl zum Spielen mit DNS-Servern ist dig . Im
einfachsten Fall bekommt dig einen Namen als Parameter, das wird hier zu
nichts führen, denn noch hat mein Rechner ja kein DNS. Eine Stufe
komplizierter übergibt mensch noch eine Nameserver-Adresse hinter einem
@, also:
dig blog.tfiu.de @8.8.8.8
Und das kommt zurück! Mit der richtigen Information, nicht irgendeinem
Mist, den sich das Captive Portal ausdenkt. Damit kann ich für meine
temporäre Netzverbindung mein /etc/resolv.conf ändern zu:
nameserver 8.8.8.8 …