做运维的人一定都经历过这种报障:用户丢过来一句话,“其他IP的电脑能访问,本机ping能通,但是访问不了目标网页,没加黑名单”。第一次听到这话,很容易被后半句劝退——既然没加黑名单,那是不是用户自己浏览器的问题?但实际上,这类问题几乎每周都能遇到,而且每次的根因都不太一样。我第一次处理时,折腾了大半天,最后发现是客户机上的一个旧代理设置没清干净。后来处理得多了,我总结出一条经验:“能ping通”只代表ICMP通了,跟“网页能打开”之间还隔着好几层。这篇文章就围绕“其他IP能访问、本机ping通、但网页打不开、且排除黑名单”这个典型故障场景,把我平时排查这类问题的完整思路、命令和抓包方法全部拆开讲一遍,从应用层一路探到网络层,保证每一步都有对应的验证手段,希望能帮你少走我当年走过的弯路。
1. 先承认一个事实:ping通不等于网页能打开
很多非网络专业的同事会下意识觉得,既然ping通了,网络就是通的,网页打不开要么是对方服务器挂了,要么是被封了。但这是对网络协议栈的一个巨大误解。处理这类问题,第一步不是去怀疑服务器,而是先把“ping通”和“网页能打开”之间的差距搞清楚。
1.1 ICMP与TCP走的是完全不同的两条逻辑链路
ping命令使用的是ICMP协议(Internet Control Message Protocol,互联网控制报文协议),它工作在IP层之上,主要目的是探测目标主机是否在线、测量往返时延。而访问网页走的是TCP协议,TCP是传输层协议,HTTP报文是封装在TCP数据段里的,TCP还要先经过三次握手建立连接,之后才能传输数据。
这两者最大的区别在于:ICMP不需要目标主机上有任何应用程序在监听端口,TCP则需要目标端口上有服务在监听。
你可以把ICMP ping想象成往一栋楼里喊一嗓子,只要楼里有人,哪怕那人正睡着觉,他也会探出头来应一声“我在”。而TCP访问网页则相当于你按了一户人家的门铃,只有这户人家醒着并且愿意开门,你才能进去交谈。如果这户人家压根没住人(端口没监听),或者门上贴着“谢绝入内”(防火墙策略限制),那你按门铃再多次,也得不到回应。
所以当你看到“ping通”却打不开网页时,先要把这个信息翻译成一句准确的技术描述:本机到目标主机的IP层路径是通的,但本机到目标端口上的TCP连接建立失败,或者连接建立了但HTTP层数据交换异常。 这个翻译能帮你把排查范围从“全网”缩小到“传输层和应用层”。
1.2 “其他IP电脑能访问”这句话能帮我们排除掉什么
“其他IP的电脑能访问,本机不能”,这句话价值很高。它能直接排除掉服务器本身宕机、服务器上的Web服务进程挂掉、目标端口对所有来源都拒绝、服务器所在机房的出口带宽打满等“全局性故障”。也就是说,服务端对外提供的服务是正常的,问题大概率出在“本机到服务端”这一段链路上,或者出在服务端对“本机这个来源IP”有特殊干预。
这里要注意区分几层含义:
- 如果"其他IP"指的是同一网段的其他电脑,那还能进一步排除交换机和路由器间的链路问题。
- 如果"其他IP"指的是另一条线路上的电脑(比如公司在另一个分支机构的电脑),那就要考虑本机所处的网络出口、出口防火墙上是否有针对本机IP的限制。
标题里提到“未加入黑名单”,这是一个很重要的排查前提,说明本机IP大概率没有被显式封禁。但“没加黑名单”不代表没有其他限制,后面第5节我会详细讲那些“不是黑名单、但效果和黑名单一样”的情况。到这一步,先确立一个基本判断:故障范围被锁定在“本机的网络配置/应用配置”与“服务端对本机的策略限制”之间,接下来要做的就是逐层剥离。
1.3 目标网页本身也可能在“应用层”出事
还有一类容易被忽略的情况是:目标网页本身是正常的,但你访问的URL有问题。比如,其他同事访问的是https://example.com/login,而你访问的是https://example.com/login?from=old,如果站点对这个参数做了访问控制,你就会被拒之门外。或者你手里的URL是历史遗留的,指向的老域名已经迁移到新服务器,新服务器对老域名的Host字段做了限制。
所以在动手查网络之前,先找那个“能访问的同事”把完整URL要过来,一个字符一个字符地对一遍。这个动作几秒钟就能完成,却经常能省下几分钟甚至几十分钟的排查时间。我遇到过不只一次,用户报“访问不了网页”,最后发现是他自己在地址栏里多敲了一个奇怪的字符。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先查本机而不是先怀疑服务器:浏览器与系统层的隐形分流
确定了排查方向后,第一步不是掏Wireshark,而是先检查本机的应用层和系统层配置。因为这类配置是“隐形”的,平时根本不会注意到,而且它们只影响当前电脑,不会影响其他电脑,和故障现象完全吻合。
2.1 代理设置与PAC脚本是最常见的“元凶”
浏览器访问网页时,请求并不总是直连目标服务器。系统里一旦配置了代理,浏览器就会把请求先发给代理服务器,由代理服务器代为转发。这时如果代理服务器本身出现故障、代理规则错误、或者代理服务器与目标网站之间的链路有问题,就会出现“ping通但网页打不开”的现象。
检查时不要只看浏览器设置,那是远远不够的。我习惯按这个顺序逐一核查:
- 打开浏览器的代理设置界面(Chrome/Edge在“设置—系统—打开您计算机的代理设置”),确认是否开启了“使用代理服务器”,尤其要看有没有勾选“跳过本地地址的代理服务器”。
- 在Windows命令行里执行
netsh winhttp show proxy,这一步很多人会漏掉。系统WinHTTP代理和用户浏览器的IE代理是两个独立配置,有些后台服务、甚至是部分软件内嵌浏览器走的是WinHTTP代理,它一旦配置异常,也会导致某些网页打不开。 - 检查系统环境变量里的
HTTP_PROXY和HTTPS_PROXY。这两个变量主要影响命令行程序和部分开发工具,但对一些使用命令行方式启动的工具、脚本或本地服务来说,它们是致命的。
如果发现代理设置是公司下发的PAC自动配置脚本,可以拿另一台“能访问”的电脑做对比,确认PAC脚本是否一致。PAC脚本里如果针对某些域名进行了分支处理,而你的电脑因为某种原因加载了旧版本,就会造成只有你这台机器访问异常的现象。
2.2 hosts文件这个“老古董”反而最容易让人白忙一场
Windows系统的C:\Windows\System32\drivers\etc\hosts文件,Linux系统的/etc/hosts文件,是一个本地DNS解析的“最高优先级”配置。只要在hosts里写了域名和IP的对应关系,系统解析该域名时就不会再向DNS服务器查询。
这个文件出问题的频率比很多人想象中高得多。常见场景是这样的:公司某内网系统曾经部署在一台服务器上,IP是10.0.0.5,后来系统迁移到了10.0.0.8,运维人员通知大家“你们把hosts里那条记录改一下”。结果你从同事那里复制了一份旧配置,或者自己改的时候只改了半截——域名映射到了旧IP10.0.0.5。这时候你会发现:ping 10.0.0.5通(因为这台机器可能还在线,比如是另一套系统的服务器),但访问网页永远打不开,因为10.0.0.5这台机器上压根没有Web服务。
排查方法很直接:
- 用
nslookup 域名看DNS解析出的IP是什么。 - 用
ping 域名看实际解析到的IP是什么。 - 如果两个IP不一样,百分之百是hosts文件里做了映射,直接打开hosts文件检查对应行,注释掉或改正即可。
这个问题的迷惑性在于,你换其他电脑时DNS解析是正常的,只有本机异常,看起来就像“网络针对你”一样,其实就是本地的解析记录在捣鬼。
2.3 IPv6优先策略引发的“假超时”
现在的系统和浏览器默认都支持IPv6。当你访问一个同时拥有IPv4和IPv6地址的网站时,操作系统通常会优先尝试IPv6连接。如果当前网络环境(比如公司内网)IPv6路由不通,或者DNS解析出的IPv6地址本身不可达,浏览器会先尝试走IPv6,等超时之后再回退到IPv4。这个回退过程在Chrome里通常需要几秒到十几秒,最终表现为“网页打不开”或者“打开非常慢”。
判断IPv6是不是罪魁祸首的方法很简单:
- 打开命令提示符,执行
ping -6 目标域名,看返回结果是不是“请求超时”或“无法访问目标主机”。 - 执行
ping -4 目标域名,如果IPv4能通,那就基本坐实了是IPv6优先策略的问题。 - 可以临时在浏览器里强制走IPv4测试一下,Chrome可以启动时加
--disable-features=UseDNSHttpsSvcb参数,或者直接在hosts里把域名强制解析到IPv4地址观察效果。
如果是公司内网且没有部署IPv6,最好的长期解决办法是在网卡属性里把IPv6协议取消勾选,或者在网络适配器高级设置里调低IPv6优先级,避免每次访问都浪费时间在无谓的IPv6探测上。
2.4 浏览器缓存、插件与WinHTTP代理
有几个细节特别容易踩,我单独列出来:
- 浏览器的HSTS缓存:如果目标站点曾经通过HTTPS访问过,并且服务器返回了HSTS头,那浏览器会强制后续所有访问都走HTTPS。万一服务端证书过期、或者当前网络里有人做了HTTPS劫持/重定向,页面就会一直报错。可以换个浏览器试访问,或者清除该站点的HSTS状态。
- 浏览器插件拦截:去广告类、隐私保护类、脚本管理类插件可能会拦截某些站点的请求。排除办法是开一个无痕窗口(通常无痕模式默认禁用扩展),或者临时禁用全部扩展再访问。
- 证书缓存:如果网站换了证书,但系统里缓存了旧证书,某些严格校验证书的客户端会拒绝连接。这个在Windows系统里表现为“该证书不受信任”或“证书链不完整”,清除一下证书缓存即可。
以上这些全部过一遍之后,如果问题还在,那就要把注意力从“应用层”往下移到“传输层”了。
3. 四层连接是否真的建立:端口探测与抓包定位法
跳过应用层的沟沟坎坎之后,接下来要回答一个核心问题:本机的TCP连接到底有没有建立成功? 如果TCP握手都完不成,那网页肯定打不开,这时问题就出现在网络层或防火墙策略上。
3.1 用telnet和curl -v确认TCP握手卡在哪一步
验证TCP连接最简单粗暴的工具是telnet。在Windows上如果没有安装telnet客户端,可以用PowerShell的Test-NetConnection代替,或者直接用curl -v。
比如目标网页是http://example.com,就先测80端口:
bash复制telnet example.com 80
如果屏幕变成全黑,只有一个光标在闪,说明TCP连接建立成功,此时你面对的就是Web服务的输入缓冲区。如果提示“无法打开到主机的连接”,说明端口不通或连接被拒绝。对于HTTPS网站,则测443端口。
curl -v提供的信息更丰富:
bash复制curl -v https://example.com
输出里会明确告诉你每一步的状态:
Trying 93.184.216.34:443...—— 正在进行TCP连接Connected to example.com—— TCP握手成功SSL connection using TLSv1.3—— TLS握手开始HTTP/1.1 200 OK—— HTTP请求已经发出并收到响应
如果curl卡在Trying ...那一步,说明TCP连接始终建立不了,此时请求包要么发不出去,要么发出去了没有回应。如果卡在SSL阶段之后,才说明问题出在TLS证书或HTTP层。
另外推荐一个常用的命令组合:nc -zv 目标IP 端口,在Linux和macOS上都可用,-z表示只扫描端口不发送数据,-v表示输出详细过程。这个工具比telnet更轻巧,脚本化调用也更方便。
3.2 Wireshark抓包的正确姿势
如果端口探测确认连接建立不了,就要上抓包工具了。Wireshark在Windows上用得最多,在Linux服务器上则常用tcpdump。抓包之前先想清楚要抓哪个网卡,这个细节很关键。笔记本通常有无线网卡和有线网卡,如果你实际走的是无线,却抓了有线网卡的包,那什么都抓不到。
抓包时设置一个比较精准的过滤条件:
text复制ip.addr == 目标IP && tcp.port == 443
然后开始访问目标网页,让故障复现一次,结束后停止抓包,直接找客户端发出的第一条SYN包。接下来分情况判断:
- 如果根本没看到SYN包发出去:说明请求被本机拦截了,可能的原因包括本机防火墙出站规则、杀毒软件的网络防护功能、或者某个安全客户端把目标IP拦了。
- 如果SYN包发出去了,但一直在重传,没有收到任何响应:说明中间链路或对端设备丢弃了SYN包,这个要结合服务端抓包结果才能进一步判定是哪一侧的问题。
- 如果SYN发出后收到了RST包:说明目标端口确实没监听,或者中途的防火墙直接发RST拒绝连接,这是“拒绝”行为而非“丢弃”行为。
- 如果三次握手完成了(SYN—SYN/ACK—ACK),但网页还是打不开:问题就不是连接建立,而是数据交互或HTTP应用层。这时候要接着看有没有HTTP请求发出、有没有响应数据返回。
这里顺便提一个容易忽略的点:抓包文件里如果看到大量TCP Dup ACK和Retransmission,说明网络上存在丢包或乱序,这虽然不一定是网页打不开的直接原因,但很可能是导致“访问缓慢”或“连接不稳定”的根源。
3.3 多网卡与路由表导致“有去无回”的典型案例
TCP连接建立失败还有一种非常隐蔽的情况——路由回程问题,常见于有多块网卡的电脑。
举个例子:一台电脑同时插着网线(内网网段192.168.1.0/24)和连着Wi-Fi(办公网10.0.0.0/24),访问目标服务器172.16.0.10时,系统按照路由表的优先级,选择了从内网网卡192.168.1.50发出SYN包。目标服务器收到SYN后回复SYN/ACK,但它回复的目标地址是192.168.1.50。问题来了,这个SYN/ACK包回到你电脑所在的路由器A时,路由器A认为192.168.1.50这台机器与它在同一个广播域内,直接把包转发给你交换机端口——但你的网线可能在此时已经松了,或者内网网卡虽然发得出包但接不住回包。最终表现就是:SYN发出去石沉大海,TCP连接永远建不起来。
排查这类问题:
- 执行
ipconfig /all,确认所有网卡的IP、网关。 - 执行
route print,查看去目标IP的路由走的哪一块网卡。 - 执行
ping 目标IP -S 源地址,分别指定不同源地址测试,看哪条链路通、哪条不通。 - 如果发现某块网卡确实是“半工半瘫”状态,直接禁用该网卡,让流量走另一块,再测试访问。
还有一种常见情况是电脑上装了虚拟机软件(VMware、VirtualBox),虚拟机网卡和物理网卡并存,导致路由表里出现多条0.0.0.0默认路由,系统选择了错误的网关。重启网卡或调整路由跃点数基本能解决,严重的可以把虚拟网卡临时禁用。
4. MTU与网卡双IP:藏在“通路”背后的隐藏破坏者
有些故障现场非常诡异:端口探测时TCP连接能建起来,小数据包也能通,但一加载网页就卡住,或者大片图片加载不出来。这种“半通不通”的状态,十有八九和MTU(Maximum Transmission Unit,最大传输单元)有关。
4.1 为什么小包能通、大包就不行
MTU定义了网络接口一次能发送的最大数据包大小,以太网标准是1500字节。如果本机发出的数据包超过路径上某个设备的MTU,而该设备又不会进行分片转发,那么数据包就会被直接丢弃。
TCP在传输数据时,如果发送的报文段比较大,IP层会将其封装成一个较大IP包。路径上的某个路由器如果发现这个包超过了自己出接口的MTU,它理论上应该给源主机发一个ICMP错误消息(“需要分片但DF标志位已设置”),让源主机减小包大小。但现实情况是,很多网络安全设备封禁了ICMP错误消息,导致源主机永远不知道应该减小包。这就是“路径MTU黑洞”——大包被悄悄丢掉,小包照常通过。
典型的表现是:浏览网页时页面打开缓慢、加载一半停住、某些资源加载失败,但ping(默认包大小32字节)是完全正常的。此时你可以用ping命令做大包测试:
bash复制ping 目标IP -f -l 1472
参数说明:
-f表示不允许IP分片-l 1472表示发送1472字节数据,加上28字节的IP和ICMP头,刚好是1500字节
如果返回“需要拆分数据包但是设置DF标志”或者直接超时,说明路径上某个设备的MTU小于1500。逐步减小-l的值,比如1450、1400、1300,直到ping通的最小值出现。用1500减去28再减去差值,就是你当前路径的实际可用MTU。
解决办法是调整本机网卡的MTU值,把它降低到实测可行的值,或者在操作系统层面调整TCP MSS(最大分段大小)参数。比如Windows可以修改注册表里的TCPGlobalParams相关项,Linux可以用ip link set dev eth0 mtu 1400命令临时调整。注意MTU改了之后,记得要验证全网的访问情况,不要只验证目标网页一个地址。
4.2 网卡出现两个IP时连接会怎样“迷路”
热词里有一条“win10网卡出现有两个IP”,这个问题在实际排查中遇到得挺多。一块网卡同时配置了静态IP和DHCP动态获取的IP时,系统会同时持有两个IP地址。
这种情况下,TCP连接发起时系统会按路由表选出一个“最优”源地址。如果选中的源地址恰好与对端网络环境不匹配(比如对端防火墙只放行了另一个IP),TCP握手就会失败。
判断方法:
ipconfig /all看这块网卡下面是不是列出了两个IP。route print确认系统使用的是哪个源地址去访问目标IP。- 用
ping -S 指定源IP 目标IP分别测试。
处理办法是把多余的IP去掉,只保留DHCP自动获取,或者只保留静态配置。这里多说一句,有些网络管理员喜欢一边开DHCP一边手填静态IP做“双保险”,但实际操作中这种配置只会给自己埋雷,不如把选择权明确交给其中一个。
4.3 路径MTU黑洞的实测判断方法
MTU黑洞很难直接观测到,因为负责丢弃的中间设备一般不会主动暴露自己。除了前面提到的ping -f -l大包探测法之外,还有一个比较实用的技巧是在抓包文件里观察:
- 如果发现TCP连接已经建立,但后续数据包有大量重传,且重传的包大小都比较大(比如接近1460字节的MSS),那基本可以怀疑是路径MTU问题。
- 如果重传的包大小都一样且持续超时,说明某个节点在持续丢大包。
- 配合抓包过滤条件
tcp.analysis.retransmission,可以快速标出所有重传包的位置和数据长度。
在Linux服务器上,可以查看内核的PMTU缓存:
bash复制ip route show cache
如果发现到目标IP的pmtu值比预期小很多,也能佐证MTU黑洞的存在。最终修复方向通常是缩小本机网络接口的MTU,以及在防火墙/路由器上放行必要的ICMP报文(至少放行packet too big类型),从根本上还原PMTUD机制的工作条件。
5. 服务端安全设备那本“看不见的黑名单”
前面第2到第4节主要是在本机范围内排查,但如果本机侧所有环节都已排除,那就要把视角切到服务端。标题里特意强调“未加入黑名单”,这反而提醒我要多留一个心眼:除了黑名单,服务端附近还有好几种机制能造成同样的效果,它们不叫黑名单,但行为上跟黑名单没什么区别。
5.1 黑名单与动态限速状态的本质区别
黑名单通常指的是防火墙或WAF(Web应用防火墙)里一条显式的拒绝规则,效果是持续且稳定的。而“动态限速”和“自动封禁”则不同:安全设备会根据源IP的访问频率、并发连接数、请求行为特征等维度,动态决定是否丢弃或拒绝该IP的新连接。这种策略属于安全设备的默认防护行为,没有一条静态规则写着“禁止这个IP”,所以在查询黑名单时自然查不到。但实际效果是,你的访问在一段时间内被拦了,等待冷却时间过后又能恢复。
这两类状态的区别在故障表现上有个明显特征:动态限速往往是有“时间窗口”的。比如你被限速了5分钟,5分钟后再访问就能打开,再过一段又打不开。如果用户报障时说“这个网页时好时坏、一阵一阵的”,基本可以朝这个方向怀疑。
还有一种常见情况是连接追踪表(conntrack)满了。正常访问网页时需要建立连接、记录状态,如果安全设备或服务器上的连接追踪表满了,新连接就无法建立,现有连接继续维持。这时你会发现ping能通(ICMP一般不走连接追踪,或者单独放行),TCP却建不起来。
5.2 在服务端抓包仍看不到SYN意味着什么
在服务端抓包是判断“请求有没有到达服务器”的金标准。如果在服务端执行:
bash复制tcpdump -i eth0 host 你的本机IP and tcp port 443 -nn
然后客户端访问目标网页,观察输出。
- 如果能看到来自你IP的SYN包:说明请求已经穿过中间网络到达了服务端。再看服务端有没有回SYN/ACK,如果回了但客户端没收到,那就是回程链路出问题。此时对比客户端抓包,能准确判断丢包发生在哪个方向。
- 如果完全没看到SYN包:说明请求被中间设备或安全设备拦截了,问题发生在“客户端到服务端”之间的某个节点。这时候可以沿着通道路径,在每个关键路由或防火墙设备上依次抓包,逐跳缩小范围。
- 如果看到了SYN包,同时也回了SYN/ACK,但客户端还在持续重传SYN:说明服务端的SYN/ACK回包在路径中被丢弃,此时多半是回程路由不对称,或者中间设备对回程的连接状态跟踪异常。
5.3 连接追踪表、并发限制与WAF自动封禁
具体到实际企业环境中,这几类情况比较常见:
- SLB/负载均衡的后端连接数限制:默认单台后端服务器对每客户端IP有最大并发连接数限制,超过之后新连接被重置或丢弃。
- WAF的源IP速率限制:比如“单IP每分钟访问次数超过60次后,自动封锁该IP 10分钟”,这种策略通常有一个可视化后台,需要登录WAF控制台查看封禁日志。页面日志里通常不会写“黑名单”,而会写“触发访问频率限制”或“触发CC防护规则”。
- CDN节点的边缘策略:如果目标站点套了CDN,CDN边缘节点也可能有类似策略。可以先通过
nslookup看目标域名解析出来的IP是不是CDN的IP,如果是,可以在CDN控制台里的“访问控制”模块查源IP封禁记录。 - 云安全组的“源地址过滤”:云服务商的安全组规则允许设置只允许/拒绝特定IP网段访问指定端口,虽然它不是“黑名单”,但有时候为了缩小白名单范围,管理员会临时把某一段IP移出放行范围,导致你被“误伤”。这个在云控制台的安全组规则里一查便知。
排查思路是:先确认访问路径图的每一跳分别是谁(本机-接入交换机-出口防火墙-运营商-DNS/CDN-源站),然后在每一层安全设备上查防护日志。如果权限够,直接看设备上有没有针对你源IP的会话记录或丢弃计数;如果权限不够,就只能靠抓包来分段定位。
6. 遇到同类故障,建议按这套命令顺序来
处理了太多次类似的报障,我把这套流程整理成了一个可以直接照着操作的命令顺序清单。下次再遇到“其他IP能访问、本机能ping通、但网页打不开”的情况,按这个顺序来就好,能省下大量无效猜测。
6.1 五步定位清单(可直接复制保存)
| 步骤 | 检查项目 | 命令/操作 | 期望结果 | 异常的话下一步做什么 |
|---|---|---|---|---|
| 1 | URL是否一致 | 向能访问的同事要完整URL逐一对比 | URL完全一致 | 用同事的URL重新访问 |
| 2 | 本机代理与系统设置 | 检查浏览器代理、netsh winhttp show proxy、环境变量、hosts文件 |
无代理或符合公司规范,hosts无过期映射 | 修正代理配置,注释hosts异常行 |
| 3 | IPv4/IPv6差异 | ping -6 域名、ping -4 域名 |
IPv4能通 | 禁用IPv6或调低优先级 |
| 4 | TCP端口连通性 | telnet 域名 443、curl -v https://域名 |
能建立连接 | 继续抓包分段定位 |
| 5 | 三段抓包确认 | 客户端Wireshark + 服务端tcpdump | 三次握手完成 | 根据丢弃点定位中间设备 |
这个表的核心原则是:从应用层往底层逐层排除,每换一层都要有明确的验证依据,而不是猜。
6.2 定位思路的复盘与几个容易忽略的细节
把整个排查过程复盘一下,有几条经验值得单独拿出来说:
第一,报障信息里的一句话往往是“结论”而不是“事实”。“未加入黑名单”这个说法大概率不是用户自己去查了防火墙策略,而是管理员查过之后告诉他的。但如果管理员只查了“黑名单”这一个模块,没查限速、没查连接追踪、没查WAF规则,那这句话并不能排除任何东西。所以不要因为报障里写了“未加入黑名单”就跳过服务端策略检查。
第二,别忽略故障的“时间特性”。用户如果说“刚才是打不开的,现在又好了”,这种间歇性的故障很大概率并不是配置错误,而是触发了某种动态限制或网络质量波动。配置错误往往是持久的,间歇性故障更偏向于动态策略。
第三,对比是最好的排查工具。在处理这种“只有本机异常”的故障时,拿一台正常的电脑与故障电脑做对比,几乎总能最快定位差异。对比项包括:浏览器代理设置、hosts文件内容、DNS解析结果、路由表、IPv6配置、系统日期时间。系统时间不对也会导致HTTPS证书验证失败,这个冷门但真实存在。
第四,抓包要抓两个点。只抓客户端容易漏掉回程问题,只抓服务端容易漏掉出站问题。有条件的话,两端同时抓是最好的,一对比就能确定丢弃点在哪一侧。即便没有服务端权限,也要保留好客户端的抓包文件作为证据,方便让网络管理员协助查中间设备。
6.3 用一次完整的排查案例把流程串起来
最后分享一个真实的例子,帮助你理解这套流程在实战中怎么用。
有一次同事报障说:开发测试环境的一台服务器,其他开发人员的电脑都能访问,只有他那台电脑打不开网页,但ping服务器IP又是通的,开发管理员说没有加黑名单。我按上面的流程走了一遍。第一步,URL对比,没问题;第二步,检查代理,发现他的电脑上的浏览器代理设置是“使用自动配置脚本”,而其他电脑是“直连”。当时没太在意,直接进第三步测试端口,telnet 服务器IP 8080,结果返回“无法打开到主机的连接”。此时基本确认TCP连接建不起来。
接着在客户端抓包,发现SYN包发出去后,中间过了几秒就收到一个RST包。这个RST包非常关键——如果是超时或丢包,通常表现为重传;只有对端主动拒绝才会发RST。既然服务器管理员说没加黑名单,那这个RST是谁发的?我顺着网络路径查了一下,发现机房出口防火墙上有一条针对该服务器的入站安全策略,策略里设置了“连接数限制”,并且把超过限制的行为设置为“重置”。那台电脑因为之前跑过一个自动化脚本,频繁向服务器发起很多TCP短连接,触发了这个限制。管理员在防火墙上把并发数限制调大之后,故障立刻消失。
这个案例里,如果一开始就相信“未加入黑名单”这句话,我可能还要多绕一个小时的弯路。最终还是抓包里的RST信号帮了大忙,快速锁定了方向。
在实际排查这类问题的过程中,我自己感受最深的一点是:耐心按步骤逐层排除,比凭经验去猜某个环节更可靠。 按照这套流程下来,大部分“能ping通、网页打不开”的问题都能定位到具体环节。而且排查过程中留下的抓包和命令记录,本身就是很好的交接文档,下次再有类似报障,排查速度会快很多。
