随着 Windows 8 消费者预览版的发布,我第一时间把它安装到了自己的两台电脑中,体验其带来的最新特性,不想却遇到了家中局域网内部不能共享资源的奇怪问题,而让人郁闷的是,导致这一问题的竟然是互联网服务提供商在进行DNS劫持。
首先,两台电脑情况如下:
台式机:主机名 W8,Win8消费者预览版,家中IP 192.168.137.1,位于家中
工作笔记本:主机名 HJW,Win8消费者预览版,家中IP 192.168.137.68 已加入公司AD域,每天也会带回家使用
家中网络使用的是
北京联通 ADSL 宽带。基于上述情况,在两台电脑间共享文件、互相访问几乎是每天的必备操作。使用 Windows 7 时没有遇到什么问题,但升级到 Windows 8 消费者预览版之后却莫名其妙的出现 HJW 无法访问 W8 的问题,但同时 W8 却可以正常访问 HJW:
尝试1:在 HJW 上访问 \\W8 上的共享文件夹,提示找不到目标主机:
尝试2:通过ping和远程桌面连接,同样无法发现 W8 的身影:
尝试3:通过 Windows 8 建立家庭组来共享,在检测到 W8 上创建的家庭组之后点击加入,并输入密码,但提示无法加入:
尝试4:通过 W8 访问 HJW,则完全没有问题,ping、共享文件夹、远程桌面连接均能正常访问:
遇到这样的问题,首先怀疑是 W8 上没有打开网络发现和文件和打印机共享的功能,但查看相关选项和防火墙之后,排除了这一可能,相关服务显示是正常开启的。在再次排除路由器兼容性的可能性之后,又想想,既然ping不通,而W8一方实际上是正常运行的,那是否是因为 DNS 没能正确解析呢?
想到这里,再一次在 HJW 上对 W8 进行的 ping 尝试让我发现了蛛丝马迹:
由于 HJW 加入了公司的AD域,在进行 ping 时,程序会首先尝试查询公司域中的 W8 主机(W8.domain.com),由于在家中没有连接到公司内网,它向公网上的 DNS 服务器进行了查询。经了解,公司域中并没有一台名为 W8 的计算机,并且即使存在,在公网上也是不能访问的。 像这种找不到目标主机的情况,DNS解析将提示“找不到主机 XXX”:
而此例中,公网上的该 DNS 竟然还返回了一个IP地址,只不过该主机没有响应 ping 操作,因此我看到了“请求超时”的提示,误认为是 W8 的服务或端口没有打开导致的。
在浏览器中尝试打开带有公司域名的该主机路径,出现的画面终于让真相有了眉目:
原来,之所以ping的时候会解析出IP地址,是由于联通在帮我返回数据,完成了这次DNS解析!在百度上查询 202.106.199.35 的确可以看到这是北京联通的域名访问错误提示页面的IP。
找到原因之后,我手动将 HJW 上网络的 DNS 地址指向第三方的公用服务器,终于顺利ping通W8:
再输入 \\w8 来访问共享文件夹,以及通过 Windows 8 的家庭组进行共享也毫无问题了:
到此得出的初步结论是(至少在我的Win8下是这样):
如果 Windows 加入了AD域网络,在笔记本连接到其他网络时可以正常访问其他网络中的主机及共享资源,因为在域范围进行DNS解析失败后会自动在当前局域网内进行查询;而如果运营商进行DNS解析劫持,在尝试获得域内相关主机的IP时,运营商返回的IP地址让系统认为找到了目标主机,但实际上需要的资源是无法访问的,你在访问的只是运行商的网站主机!
我们使用DNS查询软件对一个不存在域名进行测试,可以更清楚的看到两种情况的差异:
合理的解析结果(得到该结果后,程序会自动尝试在内网查找需要的资源):
联通DNS解析劫持下的解析结果(程序会把202.106.199.35当作要访问的资源,结果是无法访问):
到此为止,问题似乎可以用更改DNS服务器的方式迎刃而解,但其实仍然存在问题,如果笔记本接入到公司的域网络中,为了正常访问AD中的资源,又需要把 DNS 设置回默认的状态。当然,在这种域名解析存在歧义的情况下,可以使用 .local 后缀来访问内网中主机(W8.local),避免上述无法访问的问题,但这毕竟不是治本的办法,我们希望相关企业能够合理的使用自己手中的资源,遵守社会上和技术上的标准,不要为了自身发展而不顾公共准则,给支持自己的广大用户造成麻烦。
本文出自 “wbpluto的技术日志” 博客,转载请与作者联系!