これは本当に厄介だ:)
私のモデムは ZTE ZXHN H108L で、Linux ファイアウォール/ルーター/ゲートウェイに接続されています。ゲートウェイは Slackware 14.0 システムで、DNS、DHCP、VPN、透過プロキシが実行されます。ゲートウェイには 2 つのハードウェア NIC があります。eth1
モデム (192.168.231.117) に接続され、eth0
イントラネット (192.168.112.0/24) に接続されています。
私は DNS を使用して、複数のイントラネットおよび VPN ホストに名前を付けています。モデムには、便利な名前「modem.skails.office」(または、このイントラネット上の PC を使用している場合は単に「modem」) が付けられています。送信元/var/named/skails.office.hosts
:
modem A 192.168.231.117
nslookup
イントラネットのすべての PC からモデム アドレスを正しく解決します。
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
そのため、ゲートウェイのブラウザ (Firefox) からモデムにアクセスしようとすると、 と入力しますhttp://192.168.231.117/
。資格情報を入力すると、正常にログオンできます。
アドレスhttp://modem/
またはを発行して同じことを実行しようとするとhttp://modem.skails.office/
、ログオン ウィンドウは表示されますが、資格情報は受け入れられません。ここで何が問題なのか本当にわかりません。
tcpdump -i eth1 host modem and port 80
以前は、ログオンしてステータス ページを取得しようとして成功した試行と失敗した試行を記録していました。
- 成功したtcpdump
wget --user admin --password 1234 "http://192.168.231.117/status/status_deviceinfo.htm" -O -
192.168.231.117:80 に接続しています...接続されました。HTTP
要求が送信され、応答を待っています... 401 権限がありません
192.168.231.117:80 への既存の接続を再利用しています。HTTP
要求が送信され、応答を待っています... 200 OK
長さ: 未指定 [text/html]
...
- 失敗した tcpdump
wget --user admin --password 1234 "http://modem/status/status_deviceinfo.htm" -O -
モデム (modem) を解決しています... 192.168.231.117
モデム (modem)|192.168.231.117|:80 に接続しています... 接続されました。HTTP
要求が送信され、応答を待っています... 401 権限がありません
既存の接続を再利用していますモデム:80
HTTP リクエストが送信され、応答を待機しています... 401
権限がありません。認証に失敗しました。
そこから何かわかりますか? 私が含めるつもりがなかった他のデータが必要ですか? この問題をさらに調査するにはどうすればよいでしょうか?
答え1
モデムの Web サーバーは、HTTP ヘッダー内の IP 以外のものを処理するように設計されていないHost
ため、未定義の動作が発生します。この場合、そのヘッダーで IP 以外のものを送信すると認証が失敗することを意味しますHost
。
通常、仮想ホスト (同じ IP を指す複数のドメインで複数のサイトをホストし、そのHost
ヘッダーを使用してどのサイトが要求されたかを伝えることを可能にする) を使用しない限り、そのヘッダーを完全に無視することになっていますが、そのファームウェアの開発者は明らかにそれをしませんでした。彼らが実際に仮想ホストを (不必要に) を使用していたとしても驚きません。そのため、Host
ルーターの IP に設定された特定のヘッダーのみが認証を許可します。他のすべてがその仮想ホストと一致しないからです。
名前はこれとは何の関係もありません。curl/wget が DNS 名に基づいて正しいホスト ヘッダーを自動的に設定するだけです。そのヘッダーを削除または上書きしてモデムの IP に設定し直すことができれば、問題なく動作します (wget --header="Host:" ...
ヘッダーを削除するには を使用します)。