一个网站打不开,你会怎么系统地排查?
简化版
别一上来乱试,用分层排查法:按「本机 → DNS → 网络连通 → 端口/TCP → 应用层」一层层往上定位。快速链路是:先 ping 网关和公网 IP(如 8.8.8.8)看基础网络通不通 → 再 nslookup/dig 看域名能不能解析 → 再 telnet/nc 测目标 80/443 端口通不通 → 最后 curl -v 看 HTTP 层返回什么。核心思想是从底层往上、逐段缩小范围,每一步都能排除一大类原因,避免瞎猜。
详细版
网络请求要经过很多环节,任何一环断了网站都打不开。系统排查就是沿着数据流的路径,逐层验证:
第 1 层·本机与本地网络
ipconfig(Win)/ip addr(Linux):本机有没有拿到 IP?ping 网关:到路由器通不通(排除本机/网线/WiFi 问题)。ping 8.8.8.8(直接 ping 公网 IP,绕过 DNS):能出公网吗?
第 2 层·DNS 解析
nslookup example.com/dig example.com:域名能不能解析成 IP?- 如果 ping IP 通、但 ping 域名不通 → DNS 问题(DNS 服务器挂了/配错/污染)。
第 3 层·到目标主机的连通性
ping 目标IP:到服务器主机通不通(注意有些服务器禁 ping,不通不代表挂)。traceroute/tracert 目标:路径在哪一跳断的(定位中间网络问题)。
第 4 层·端口 / TCP 连接
telnet 目标 443/nc -vz 目标 443:目标端口开着吗、TCP 能不能建连?- 连不上 → 服务没启动、端口没监听、或防火墙拦了。
第 5 层·应用层(HTTP)
curl -v https://example.com:看 TLS 握手、HTTP 状态码、响应头。- 4xx/5xx、证书错误、重定向循环等,都是应用层问题。
口诀:能 ping IP 不能 ping 域名 → DNS;能 ping 通不能连端口 → 服务/防火墙;端口通但 curl 报错 → 应用层。
完整版教学
一、为什么要「分层排查」而不是瞎试
一个网站打不开,背后可能是几十种原因:网线松了、WiFi 断了、DNS 挂了、域名过期、服务器宕机、端口没开、防火墙拦截、证书过期、程序 500…… 如果没有章法地一个个试,效率极低还容易漏。
分层排查的价值在于:网络请求是一条有固定顺序的链路(本机 → 出网 → 解析域名 → 连到主机 → 建立 TCP → 发 HTTP → 拿到页面),你从链路底层往上逐段验证,每验证通过一层,就排除掉一整类原因,范围不断缩小,最终锁定到具体某一环。这套方法对应着网络分层模型(物理/链路 → 网络 → 传输 → 应用),是排障的通用思维框架。
核心原则:从下往上、逐层缩小。下层不通,上层一定不通,所以先确认下层。
二、第一步:先确认「本机能不能出网」
排障要先排除自己这端的问题,从最底层开始:
- 本机有 IP 吗:
ip addr(Linux)/ipconfig(Windows)。如果 IP 是169.254.x.x(Windows)或根本没 IP,说明 DHCP 没拿到地址,是本地网络问题。 - 能到网关吗:
ping 网关IP(网关地址用ip route/ipconfig查)。ping 不通网关 → 问题在本机到路由器之间(网线、WiFi、网卡)。 - 能出公网吗:
ping 8.8.8.8——故意 ping 一个 IP 而不是域名,这样能绕过 DNS,单独验证「纯网络连通」。
这一步最关键的技巧是 ping IP 而非域名:如果 ping 8.8.8.8 通、但 ping google.com 不通,就一步锁定是 DNS 问题,而不是网络不通。这个对比是排障里最实用的分流点。
三、第二步:DNS——域名能变成 IP 吗
浏览器访问网站,第一件事是把域名解析成 IP。DNS 一出问题,后面全免谈。用工具验证:
nslookup example.com # 简单直接,看解析出的 IP
dig example.com # 更详细,看完整解析过程和记录
- 解析不出 IP → DNS 服务器不可用、域名配置错误、或本地 DNS 缓存/hosts 有问题。可换一个 DNS(如
nslookup example.com 8.8.8.8)对比:换了能解析 → 本机默认 DNS 的问题。 - 解析出的 IP 不对(被指到奇怪的地址)→ 可能 DNS 污染 / 劫持,或 hosts 文件被改。
- 解析正常但网站还是打不开 → DNS 没问题,往下一层查。
四、第三步:到目标主机通不通、路径断在哪
DNS 拿到 IP 后,验证「能不能到达那台服务器」:
ping 目标IP:通 → 主机在线、网络可达。但要注意:很多服务器出于安全禁用了 ICMP(禁 ping),ping 不通不代表服务器挂了,这是常见误判。traceroute 目标(Windows 是tracert):如果 ping 不通或很慢,用它看数据包走到第几跳断了 / 变慢了。若在中间某跳开始全是* * *,说明问题在那段中间网络(可能不归你管,是运营商链路)。
易错点:ping 不通 ≠ 服务器故障。服务器可能只是禁了 ICMP。这时要靠「测端口」来判断服务到底通不通。
五、第四步:端口 / TCP——服务在监听吗、被墙了吗
主机可达,还得看目标端口上的服务是否可连。这是 ping 查不了的(ping 只到网络层,不测端口):
telnet example.com 443 # 能连上 = 端口开着、TCP 能建连
nc -vz example.com 443 # 同样测端口,更现代
结果分三种,对应不同原因:
- 连接成功 → 端口开着、服务在监听,问题在更上层(应用/HTTP)。
- Connection refused(拒绝) → 能到主机,但目标端口没有程序在监听(服务没启动 / 挂了 / 端口配错)——主机明确回了 RST。
- Connection timed out(超时,一直卡住) → 大概率是防火墙 / 安全组把包丢弃了,或主机不可达——没有任何回应。
「拒绝」和「超时」的区分极其重要,它直接指向不同方向(服务问题 vs 防火墙问题)。
六、第五步:应用层——HTTP 到底返回了什么
TCP 能连上,最后看**应用层(HTTP/HTTPS)**发生了什么,主力工具是 curl -v:
curl -v https://example.com
-v(verbose)会打印全过程,逐项看:
- TLS 握手失败 / 证书错误(
certificate has expired)→ HTTPS 证书过期或不匹配。 - HTTP 状态码:
301/302无限重定向 → 重定向配置错。403→ 权限/防盗链/被 WAF 拦。404→ 路径/路由不对。502/503/504→ 后端服务挂了 / 网关连不到后端 / 超时。
- 响应很慢 → 后端处理慢、数据库慢等,配合
curl -w看各阶段耗时(DNS/连接/TLS/首字节)。
到这一层,问题已经从「网络」缩小到「具体是证书、还是路由、还是后端服务」了。
七、把方法论串成一条决策链
面试答这题,最好给出一条清晰的决策链,体现体系:
本机有 IP? ──否→ DHCP/本地网络问题
│是
ping 网关通? ──否→ 本机到路由器(网线/WiFi/网卡)
│是
ping 8.8.8.8 通? ──否→ 出网/运营商问题
│是
ping 域名 / nslookup 通? ──否→ DNS 问题
│是
telnet 目标端口通? ──拒绝→ 服务没起/端口错
│ └─超时→ 防火墙/安全组
│是
curl -v 正常? ──否→ 应用层(证书/状态码/后端)
│是
问题可能在浏览器缓存/前端
八、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 解析阶段 | 域名是否解析到预期 IP |
| 连接阶段 | TCP 端口是否可达、TLS 是否成功 |
| 应用阶段 | HTTP 状态码、反向代理、后端服务和日志 |
dig domain
curl -v https://domain
nc -vz domain 443
traceroute domain
check LB/backend logs
网站打不开不要只说“网络问题”,要按 DNS、TCP、TLS、HTTP、应用后端分层切开。
- 误区:浏览器打不开就是服务器宕机。 DNS、证书、CDN、LB、防火墙、浏览器缓存和本地代理都可能导致不可达。
- 误区:能 ping 通就说明网站正常。 ping 只测 ICMP,HTTP 端口、TLS 和应用状态仍可能异常。
- 误区:只从自己电脑测一次就能定性。 要多地域、多网络、直连 IP、绕 CDN 对比,排除本地和运营商问题。
- 追问:如何判断 DNS 问题? 比较本地解析、公共 DNS、权威 DNS 的结果和 TTL。
- 追问:TLS 错误常见原因? 证书过期、域名不匹配、中间证书缺失、协议/套件不兼容。
- 追问:HTTP 502/504 往哪查? 优先查反向代理到上游服务的连接、超时、健康检查和后端日志。
九、加强记忆
网站打不开用分层排查、从下往上逐段缩小:本机有 IP?→ ping 网关 → ping 8.8.8.8(绕 DNS 验出网)→ nslookup/dig 验解析 → telnet/nc 测端口 → curl -v 看 HTTP。关键分流点:能 ping IP 不能 ping 域名 = DNS;ping 不通不等于服务器挂(可能禁 ICMP);端口 refused = 服务没监听,timeout = 防火墙丢包;端口通但 curl 报错 = 应用层(证书/状态码/后端)。