当前位置:首页 > 知识

网站能ping通但是用浏览器打不开

能ping通,网站浏览器却打不开——这事我遇到过不下十次,但用每次原因都不一样。浏览最典型的器打一次是帮朋友看他的博客,命令行里ping www.example.com 延迟稳定在30ms,不开丢包率0%,网站但Chrome转圈转了半天,但用最后甩出一句“ERR_CONNECTION_TIMED_OUT”。浏览ping通只证明网络层通了,器打ICMP包能来回,不开不代表TCP 80或443端口能建立连接。网站这就像你能打通对方小区的但用门禁电话,但走到单元门口发现门锁换了。浏览

先查端口。器打用telnet或者nc试一下:telnet example.com 443。不开如果卡住不动,说明TCP握手没完成。我见过最隐蔽的情况是服务器防火墙只放行了ICMP,把80和443全挡了。运维图省事,iptables规则写了个DROP,ping走的是ICMP协议,浏览器走的是TCP,两套规则各管各的。这时候你ping一辈子都通,浏览器一辈子打不开。

DNS解析是另一个坑。ping的时候系统可能走了hosts文件或者缓存,浏览器却老老实实去问DNS服务器。有一次我本地hosts里写了个测试域名指向内网IP,ping通得飞快,浏览器却解析到了公网一个不存在的地址。查nslookup和dig的结果跟ping的IP对不上,问题就露馅了。浏览器有自己的DNS缓存,Chrome里敲chrome://net-internals/#dns能清掉,但很多人不知道这个入口。

代理设置也经常捣乱。系统代理开着,ping不走代理,浏览器走。代理服务器挂了或者规则写错了,浏览器就卡死。我有次在Mac上开了Surge,规则里把某个域名扔进了不存在的代理组,ping通得毫无障碍,Safari却一直白屏。关掉代理立刻正常。这种问题在Windows上更常见,IE代理设置和系统代理是分开的,Chrome默认跟着系统走,但有些国产浏览器自己有一套。

还有一次是MTU的问题。ping默认包大小32字节,能通。浏览器要传完整的HTTP请求头,包大了,路径上某个设备MTU设小了,分片被丢弃。症状是ping小包通,ping大包ping -l 1472就不通。这时候浏览器加载一个纯文本页面可能勉强能开,带图片的立刻超时。把本机MTU从1500调到1400,问题消失。这个坑我调了整整一个下午,最后用ping -f -l逐步试出来的。

服务器端的问题也不少。Nginx或者Apache挂了,但系统还在跑,ping当然通。或者服务监听的IP不对,只绑了127.0.0.1,外部访问不到。我见过一个Docker容器,端口映射写错了,宿主机ping容器IP通,浏览器访问宿主机端口死活连不上。还有SSL证书过期的情况,浏览器直接拦截,ping毫无感知。这时候用curl -v https://example.com能看到证书报错,浏览器只是把错误藏在了“无法建立安全连接”后面。

排查顺序我一般这样走:先curl -v看TCP连不连得上,连不上查防火墙和端口监听;连得上但没响应,查服务进程和日志;有响应但浏览器报错,查DNS和代理;都正常但页面加载不全,查MTU和SSL。别一上来就重启网卡,那是最没用的动作。ping通只是最底层的一张通行证,上面每一层都可能设卡。

分享到: