Das ist echt ein Miststück :)
Mein Modem ist ein ZTE ZXHN H108L, das mit einer Linux-Firewall/einem Linux-Router/einem Linux-Gateway verbunden ist. Das Gateway ist ein Slackware 14.0-System, auf dem DNS, DHCP, VPN und ein transparenter PROXY laufen. Das Gateway verfügt über 2 Hardware-NICs. eth1
ist mit dem Modem (192.168.231.117) und eth0
mit dem Intranet (192.168.112.0/24) verbunden.
Ich verwende den DNS, um mehreren Intranet- und VPN-Hosts Namen zu geben. Das Modem hat den praktischen Namen „modem.skails.office“ (oder einfach „Modem“, wenn ich an einem PC in diesem Intranet sitze). Von /var/named/skails.office.hosts
:
modem A 192.168.231.117
nslookup
löst die Modemadresse von allen PCs im Intranet korrekt auf.
root@stargaze:~# nslookup modem
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: modem.skails.office
Address: 192.168.231.117
root@stargaze:~# nslookup modem.skails.office
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: modem.skails.office
Address: 192.168.231.117
Wenn ich also versuche, über den Browser des Gateways (Firefox) auf das Modem zuzugreifen, gebe ich ein http://192.168.231.117/
. Ich gebe die Anmeldeinformationen ein und die Anmeldung funktioniert problemlos.
Wenn ich versuche, dasselbe zu tun, indem ich die Adresse http://modem/
oder eingebe http://modem.skails.office/
, wird mir zwar immer noch das Anmeldefenster angezeigt, aber meine Anmeldeinformationen werden NICHT akzeptiert. Ich weiß wirklich nicht, was hier das Problem sein könnte.
Normalerweise protokolliere ich tcpdump -i eth1 host modem and port 80
erfolgreiche und erfolglose Anmeldeversuche und rufe die Statusseite auf.
- erfolgreicher TCPdump
wget --user admin --password 1234 "http://192.168.231.117/status/status_deviceinfo.htm" -O -
Verbindung zu 192.168.231.117:80 wird hergestellt... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 401 Nicht autorisiert.
Vorhandene Verbindung zu 192.168.231.117:80 wird wiederverwendet.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK.
Länge: nicht angegeben [text/html]
...
- erfolgloser TCPdump
wget --user admin --password 1234 "http://modem/status/status_deviceinfo.htm" -O -
Modem (Modem) wird aufgelöst... 192.168.231.117
Verbindung zum Modem (Modem)|192.168.231.117|:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 401 Nicht autorisiert
Bestehende Verbindung wird erneut verwendet, umModem:80.
HTTP-Anfrage gesendet, warte auf Antwort ... 401 Nicht autorisiert
. Autorisierung fehlgeschlagen.
Können Sie damit etwas anfangen? Benötigen Sie noch weitere Daten, an die ich vielleicht nicht gedacht habe? Wie kann ich der Sache weiter nachgehen?
Antwort1
Der Webserver des Modems ist nicht dafür ausgelegt, etwas anderes als seine IP im Host
HTTP-Header zu verarbeiten. Daher erhalten Sie undefiniertes Verhalten und in diesem Fall bedeutet dies, dass die Authentifizierung fehlschlägt, wenn Sie etwas anderes als seine IP in diesem Host
Header senden.
Normalerweise sollten Sie diesen Header einfach komplett ignorieren, es sei denn, Sie verwenden virtuelle Hosts (wodurch Sie mehrere Sites unter mehreren Domänen hosten können, die auf dieselbe IP verweisen, und diesen Host
Header verwenden können, um festzustellen, welche Site angefordert wurde), was die Entwickler dieser Firmware offensichtlich nicht getan haben. Es würde mich nicht überraschen, wenn sie tatsächlich (unnötigerweise) einen virtuellen Host verwenden würden, und deshalb Host
können Sie sich nur mit einem bestimmten Header, der auf die IP des Routers eingestellt ist, authentifizieren, da alles andere nicht mit diesem virtuellen Host übereinstimmt.
Der Name hat damit nichts zu tun, es ist nur so, dass curl/wget automatisch den richtigen Host-Header basierend auf diesem DNS-Namen setzt. Wenn Sie diesen Header entfernen oder überschreiben und ihn wieder auf die IP des Modems setzen können, funktioniert es einwandfrei (verwenden Sie wget --header="Host:" ...
zum Entfernen des Headers).