|
昨晚十二点,网站老张在群里炸了锅。访问他新买的网站NAS死活连不上,ping得通,访问IP地址回包四个“时间<1ms”,网站浏览器却转圈转到天荒地老。访问这不是网站他一个人遇到过的事,八成搞过网络的访问人都被这玩意儿折磨过——ping通,端口不通,网站最经典的访问网络假死症状。 ping用的网站是ICMP协议,它只负责探路,访问不负责开门。网站你拿ping当敲门砖,访问人家ICMP说“路通着呢”,网站可你要访问的HTTP服务(80端口)或HTTPS(443端口)可能压根没启动,或者被防火墙拿枪顶着脑门。就像你打电话能打通总机,但分机没人接,急死你也没用。 我上个月帮朋友排查一个公司网站,ping得欢快得很,浏览器报“无法访问此网站”。远程登录服务器一看,Nginx进程挂了,服务没起来。这种情况ping当然通——服务器操作系统活着,但web服务死了。你得用telnet或者nc去测具体端口,比如telnet 192.168.1.10 80,黑屏光标一闪,那就是端口通;要是提示“无法连接”,端口就是死的。 还有一种更隐蔽的情况,域名解析出问题。你ping域名能通,因为DNS解析出了IP,但浏览器访问时可能走了代理,代理服务器那边解析不了内网域名。我见过一个案例,浏览器设置了PAC脚本,脚本规则把内网地址强行扔给了外网代理,结果代理服务器根本不认识这个内网IP,直接拒绝。ping走的是系统DNS,浏览器走的是代理逻辑,两条路,两个结果。 防火墙策略也爱插一脚。Windows防火墙默认禁止ICMP回显请求,但很多服务器为了方便监控,会放行ICMP。于是出现这种局面:ICMP放行了,80端口却没放行。你ping得通,以为服务器一切正常,其实HTTP请求被防火墙拦在门外。Linux的iptables更常见,规则写得不严谨,入站规则只放行了ICMP和SSH,web服务忘了加白名单。 路由器端口映射错位也常干这种事。你从外网ping路由器公网IP,通,因为路由器本身响应ICMP。但你要访问内网那台web服务器,得靠端口映射把公网80转到内网192.168.1.10的80。映射没做对,或者内网服务器IP变了,映射还指向老地址——ping通的是路由器,访问的却是空气。 最后说个邪门的。有一次我遇到ping通但访问不了,查了半天,发现是MTU问题。网络链路中某个设备MTU设置太小,HTTP这种大包被分片后丢失,而ICMP包小,刚好能挤过去。这情况少见,但真碰上了能让你怀疑人生。解决办法是降低本机网卡MTU值,或者改路由器MTU设置。 所以,下次再遇到ping通不能访问,别急着砸电脑。先测端口,再查服务,然后看防火墙,最后检查路由映射。按这个顺序来,八成能找到病根。要是都排查完了还不行,那可能是运营商在搞鬼——你ping的是DNS服务器,但访问的网站被运营商DNS污染了。换公共DNS试试,立竿见影。 网络这东西,表面上是一条路,实际上是个迷宫。ping只告诉你迷宫入口开着,可你要找的那个房间,可能门锁了,可能房间不存在,也可能你手里拿的是别人家的钥匙。 |