标题: 一次离奇的DHCP故障排查 创建: 2018-06-18 15:30 更新: 2019-06-19 18:00 链接: https://scz.617.cn/windows/201806181530.txt 本文非严肃技术文章,纯扯淡,纯备忘,生人勿近。 端午之前,媳妇的大学同学联系我,说是她的笔记本有毛病,在医院上网时,可以访 问公网网站,可以上PC版微信,独独不能访问她们院内一个内部网站。 远程指挥她初步排查了一番。确认是x64/Win7,一周前还没这事,中途该电脑带回家 中上过网,当时有些网络设置方面的提示,由于她完全外行,已经无法精确复述当时 所见提示。再后来回到医院上网,就出现前述故障。找过一些院内同事,排查未果。 考虑到能上公网,不像是什么特别大的故障,更像是防火墙一类的安全设置在起作用。 远程间接排查,很不方便。怀着万分之一的希望问了一句,你知道啥是cmd吗?她果断 地反问我,这是啥?我默默地忘掉这个问题。还好,比起媳妇,这位属于蛮有点天赋 的那种,我是说电脑方面。我经常这样写操作步骤"A->B->C->...",她能不需要我说 第二遍的情况下顺利操作完成,这次我居然没有吐血一次。而我在别人那里碰上过太 多反例,比如,"我找到了A,但没看到B啊,C又是什么鬼"。后来我跟媳妇说,XX还 真行,比你强,你能配合着远程处理电脑故障,是我训练了多年的结果,她可没有这 经历,看得出来人很聪明,让她截几张图,只需要用自然语言描述一下大意,她就能 理解你要什么东西。 让她暂时卸载某电脑管家、关闭Win7自带防火墙等等。第一个是因为她说看到过右下 角提示"检测到敏感词",第二个就更直白了,PFW有入站规则,也有出站规则,比如 对付奇葩的Adobe Flash Player安装流程,可以利用PFW的出站规则。我怀疑那个不 能访问的院内IP在出站规则中被禁了。由于不会cmd,不能指望ping、telnet等等, 索性指挥她关闭PFW。她平时用360浏览器,让她用IE测试,现象依旧。截了IE属性里 局域网设置的图,确认没有错误的代理设置。至此,已经不是远程排查能搞掂的了。 媳妇把XX的笔记本背回家,我检查了一番,没看到什么明显的设置问题,能够正常访 问公网。这在意料之中,如果想排查解决,只能带着电脑回到XX所在医院的内网。不 过我还是提前在家中给她装了Firefox,万一是个浏览器设置问题呢。 端午,闷热的下午,老砖家小四背上XX的笔记本,在媳妇和陈北雁殷切目光的注视中 离开了家门,前往XX医院,大有风萧萧兮兮易水寒的味道;呃,不对,应该是不破楼 兰终不还的味道。 到了XX医院,TNND,门诊大楼的南门、东门全关,嗯,人家医务工作者也是要过端午 的,我想在门诊大厅吹空调的愿望破灭了。只好缩坐在东门的石台上,给XX发了个微 信,说我在哪哪哪等她,南门已关云云。其实,这是提醒XX,本怪已到,你丫快点从 家里赶过来。若干时辰过后,终于见面了。且说本怪在XX带领下穿堂越院行至X楼医 生办公室,哇,别有洞天,一屋子医生护士? 按下废话不表,开始排查。XX没有骗我,症状描述到位,可以反复重现。是台Home版 的x64/Win7,DHCP分配IP,公网没问题,院内服务器连不上,IE、Firefox都连不上。 在cmd里ping院内服务器的IP,居然可达!本想手工GET、HEAD一下,但没有telnet可 用。想想,还是去下载wireshark,抓包看看。她们这儿的网速实在不敢恭维,龟速 下载的间隙,让XX去借几台同事的笔记本来,最好是Win7。不幸只借到了XP和Win10。 XP、Win10也是DHCP分配IP,访问院内IP、公网均无问题。肯定是XX的这台Win7有个 很细小的设置与它们不同,导致这种局面。期间XX问我,重装是不是能解决。我对这 种为了拍死苍蝇而引爆核弹的行为表示无奈。 既然XP、Win10正常,那就来玩"找不同"吧。各开一个cmd,"ipconfig /all",有些 人可能喜欢用"netsh interface ipv4 show address"。三者得到的IP设置差得有点 大,示意数据如下: XP 192.168.57.54/23 192.168.57.254 114.114.114.114 Win10 192.168.87.54/23 192.168.87.254 114.114.114.114 Win7 192.168.54.255/23 192.168.54.254 114.114.114.114 不管这三台机器重启多少次,它们总是各自得到上述配置。按我理解,DHCP没这么静 态啊。好奇为什么子网网段都不同,DHCP Server识别了DHCP Client的某种属性,分 配不同的子网网段?掩码不是255.255.255.0,而是255.255.254.0。Win7得到的动态 IP相当诡异,192.168.54.255,这个IP居然可以ping通网关,可以正常上公网。我有 一个猜测,Win7少了某种Agent或其他配置,致使DHCP Server分配的IP位于不可信范 围,从而不能访问可信的院内IP,可能这是XX医院的安全措施之一。前面说了,XX无 法精确复述Win7带回家中时遭遇的设置提示,我只能乱试。 netsh winsock reset 这个没用,DHCP仍然给重启后的Win7分配192.168.54.255。 索性流氓一把,给Win7设置静态IP。先是设成192.168.87.55/23/192.168.87.254, 结果ping不通192.168.87.254。然后设成192.168.54.54/23/192.168.54.254,暂时 没有发现IP冲突,可以ping通192.168.54.254;用Firefox访问院内IP,哇哦,成功 打开网页;访问公网,正常。至此确认是DHCP惹的祸。不知道DHCP出了什么幺蛾子, 看上去像是DHCP Server配置有问题。安慰XX,说可能不是你的错,估计这一周内你 们网管动过DHCP Server的配置,你运气不好,摊上了。 现在有了一个临时不完美解决方案,静态设置IP。让XX用手机拍了IPv4的设置界面, 另截了一张图存在桌面上。XX可以通过GUI来设置静态IP,但她如何知道 192.168.54.54/23/192.168.54.254这种信息呢?开个cmd执行"ipconfig /all"对她 有点困难。而且,还有更要命的IP冲突等着她,现在是端午,周二都上班了可就不好 说了。老砖家小四陷入了新的沉思,此处自行脑补现场影像。 XX突然多了一句嘴,说她好像设过192.168.54.255这个IP。我满心狐疑,不可能吧, 这是DHCP动态分配的,怎么着也不会正常蹦出个界面让你设它。事后复盘,这只是一 名医务工作者的癔症,确无其事。但在彼时,刹那间,怀疑之余我想到一种可能,该 不是她在家中碰到的那个提示让她设置过这个IP,可能是我二十多年专业生涯中从未 碰上过的某种提示。基于这个猜测,我决定去注册表里找找蛛丝马迹。当时我想的是, DHCP动态分配的IP信息只应出现在内存中,而不应该出现注册表中,如果在注册表中 找到192.168.54.255,就能解释这个诡异IP的来源何在。regedit,搜,还真搜到了。 -------------------------------------------------------------------------- Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces\{......}] "EnableDeadGWDetect"=dword:00000001 "EnableDHCP"=dword:00000001 "DhcpServer"="..." "IPAddress"=hex(7):00,00 "SubnetMask"=hex(7):00,00 "DhcpIPAddress"="192.168.54.255" "DhcpSubnetMask"="255.255.254.0" "DhcpNameServer"="114.114.114.114" -------------------------------------------------------------------------- 一看到这个,心就凉了,这明显是DHCP动态分配的IP信息,之前我的猜测不成立。有 点不甘心,仔细查看了这个子键,发现其下有些键值不是动态出现的,应该是静态存 在的。反复对比XP和Win7的这个子键,找到多处不同的键值,其中包括IPAddress。 这个键值是REG_MULTI_SZ类型,那台一切正常的XP,此处有个值,0.0.0.0,这台不 正常的Win7此处为空。不知道这个键值本意是啥,抱着消除差异性的态度,给Win7这 个键值手工设置0.0.0.0。禁用网卡,重新启用网卡,"ipconfig /all"检查DHCP分配 的IP信息,奇迹般看到192.168.54.54/23/192.168.54.254,不再是192.168.54.255。 用三种浏览器访问院内IP、公网,皆正常,故障消除。旁边的XX长松了一口气。 不是DHCP Server的问题,就是这台Win7自身配置的问题。通过修改IPAddress键值, 至少从症状上彻底消除了故障。仍然不知道最初发生了什么,我问XX,你再想想,当 时发生了啥,她是不可能手动修改注册表的。她说,我啥也没干。我打断了她的话, 这就跟病人上门来看病,大夫让TA把情况介绍一下,TA说我啥也没干,就这样了,你 信吗?算了,先这样吧。XX估计这拨被折腾怕了,说以后再也不带这台Win7回家上网 了。 老砖家小四在XX那儿表现得很淡定,解决完问题立马走人,一分钟不带停留的,实则 内心得意洋洋。这个故障,我从未见过,平生第一次,事后看,真是属于我专业生涯 中少有的疑难杂症。最后的解决有其必然性,但也有其偶然性,从刷经验值的角度看, 我赚到了。回到家中,赶紧跟媳妇一通狂吹,你想啊,在外面得装谦虚,不好意思吹, 回家了不得可劲地吹。媳妇问我,那你跟XX说这些了吗?我说,那哪能,不能够,我 是一个谦虚的人。不过,突然想起一件事来,我很严肃地跟媳妇说,你跟XX说说,她 让我这种老砖家顶着闷热缩在她们东门石阶上等她,这合适吗?我要不发微信,估计 她还能来得再晚些。让她们姐俩开玩笑去。 想想挺悲催的,我在媳妇的同学、同事圈里,属于踏实能干的修电脑老师傅,你跟她 们说计算机、说程序员、说网络安全、说这个那个,全白扯。 花开两朵、各表一枝,事后我查了一下IPAddress这个键值。 -------------------------------------------------------------------------- TCP/IP and NBT configuration parameters for Windows XP https://support.microsoft.com/en-us/help/314053/tcp-ip-and-nbt-configuration-parameters-for-windows-xp Win32_NetworkAdapterConfiguration class https://msdn.microsoft.com/en-us/library/aa394217(v=vs.85).aspx -------------------------------------------------------------------------- Value Type : REG_MULTI_SZ - List of dotted-decimal IP addresses Default : None Description : This parameter specifies the IP addresses of the IP interfaces to be bound to the adapter. If the first address in the list is 0.0.0.0, the primary interface on the adapter will be configured from DHCP. A computer with more than one IP interface for an adapter is known as "logically multihomed." There must be a valid subnet mask value in the SubnetMask parameter for each IP address that is specified in this parameter. -------------------------------------------------------------------------- 本以为这就是终级真相。我手贱,本着大胆假设、小心求证的专业习惯,检查了一台 x64/Win7虚拟机,用的是NAT模式,VMnet8上启用了DHCP。很不幸,这台Win7的 IPAddress为空,但DHCP分配的IP正常,没有幺蛾子。有几种可能,一是我这台Win7 与XX那台Win7还是有很多不一样的,比如我的是专业版,她的是家庭版,我的补丁安 装情况与她肯定也不一样;二是设置IPAddress可能只是对症解决了问题,并不是真 正的"root cause"。 尽管我们非正常人类研究中心的被研究对象们永远充满着好奇心,但我们也信奉某种 程度的视而不见,尤其在这世界杯的日子里。就这样不求甚解吧。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 后面是其他人看到本文的反馈或讨论,虽然不可能再去现场,但有些内容或许对读者 另有启发。 2018-06-19 18:25 bluerust 如果我在现场,要是能看出IP的异常,我会"ipconfig /release",然后 "ipconfig /renew",抓包对比DHCP请求差异。如果协议没差异,那猜测换个MAC地址 应该也能解决问题,但部分无线网卡不支持修改MAC地址。 看完这文章,没看到DHCP协议上的差异分析,搞得我心痒痒得难受。要是当时有包留 存,拿udp raw socket或者winpcap发包测试,应该能精准定位出差异域。 scz: 如果在自有实验环境中多台主机出现这种差异,用wireshark抓包分析比较可行,在 火星地带,不作他想。 -------------------------------------------------------------------------- Dkvven_: 192.168.54.255/23严格说来也是它所在网段里一个正常的IP吧?因为/23,所以这个 网段正常IP区间是54.1-55.254,这个IP只是位于中间,不是特殊IP,所以连通公网 不奇怪。问题就在于为什么这个正常IP不能访问内网,而与它地位相同且同网段的 54.54可以?而且你提到255可以ping通却不能打开网页,说明路由没问题,那可能是 内网的WEB服务器将这个IP发的包丢弃了?还有为什么第一次手动设置的87.55不能连 通网关呢?除了IP冲突还有什么可能? scz: 255是合法IP,这点毋庸置疑,但这个逻辑上合法的IP并非DHCP分配下来的。 前文中的XP、Win7、Win10在接入同一无线AP的情况下被分配到不同的子网,比较少 见。 其他问题的回答需要太多工具及权限,比如wireshark最后也没有装,她们的网络设 备、拓扑一无所知,在一个火星地带处理一个非我刚需的问题。我能猜测的是她们有 与DHCP联动的访问控制设备,但这些猜测没有意义。稍微有点意义的事,用 wireshark抓DHCP的报文,但考虑到已经满足了她的原始需求,走人。 -------------------------------------------------------------------------- king_die: 我还以为(是)DNS(的问题) scz: HTTP访问院内IP,用的就是IP,不是FQDN,跟DNS挨不着。 -------------------------------------------------------------------------- xiaohaili: 以前XP注册表可以修改、添加MacAddress键值,现在Win10是不是不允许了?网上搜 到一些方法,好像不起作用。 scz: 你是想改MAC地址?那个键值是NetworkAddress,不是MacAddress,在x64/Win10上仍 然有效。 --------------------------------------------------------------------------