这是一个真正的bugger 🙂
我的调制解调器是ZTE ZXHN H108L,连接到一个linux防火墙/路由器/网关。 网关是运行DNS,DHCP,VPN和透明代理的Slackware 14.0系统。 网关有2个硬件网卡。 eth1连接到调制解调器(192.168.231.117), eth0连接到内部网(192.168.112.0/24)。
我使用dns给几个intranet和vpnnet主机的名字。 调制解调器有一个方便的名称“modem.skails.office”(或者如果我坐在这个内部网上的pc上,就是“调制解调器”)。 从/var/named/skails.office.hosts :
modem A 192.168.231.117
nslookup从内网的所有电脑上正确parsing调制解调器地址。
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)访问调制解调器时,我inputhttp://192.168.231.117/ 。 我提供的凭据,我login罚款。
如果我试图通过发送地址http://modem/或http://modem.skails.office/来做同样的事情,我仍然会出现login窗口,但它不会接受我的凭据。 我真的不知道这里可能是什么问题。
我使用tcpdump -i eth1 host modem and port 80来logging一个成功和不成功的尝试login并获取状态页面。
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]
…
wget --user admin --password 1234 "http://modem/status/status_deviceinfo.htm" -O - 解决调制解调器(调制解调器)… 192.168.231.117
连接到调制解调器(调制解调器)| 192.168.231.117 |:80 …已连接。
发送HTTP请求,等待响应… 401未经授权
重用现有连接到调制解调器:80 。
发送HTTP请求,等待响应… 401未经授权
授权失败。
你能用它做什么吗? 你是否需要我可能没有想到的其他数据? 我如何进一步调查此事?
调制解调器的Web服务器不是用来处理Host HTTP头中除IP之外的东西,因此您获得了未定义的行为,在这种情况下,这意味着当您在该Host头中发送除IP以外的内容时,身份validation将失败。
通常情况下,除非你使用虚拟主机(这允许托pipe多个域下的多个站点指向相同的IP,并使用该Host头来告诉哪个站点被请求),你应该完全忽略这个头,开发者那固件显然没有做。 如果他们实际使用虚拟主机(不必要的),我不会感到惊讶,这就是为什么只有设置到路由器IP的特定Host头允许您进行身份validation,因为其他一切都不匹配该虚拟主机。
这个名字与它没有任何关系,只是curl / wget根据这个DNS名字自动设置正确的主机头。 如果你可以删除或覆盖该标题,并将其设置callback制解调器的IP,那么它会工作得很好(使用wget --header="Host:" ...来删除标题)。