🌐 第07章 · 网络故障排查
连不上/慢/DNS 错误的排查
网络故障排查¶
这一章给出一套"从现象到根因"的网络排查思路和一组配套命令。网络问题千变万化,但排查顺序是固定的:从上到下(应用 → 传输 → 网络层 → 物理链路),或从 OSI 的分层角度一层层剥。遇到"连不上/很慢/时好时坏",按这套来基本都能定位。
先定性:是"没到"还是"到了却失败"?¶
分两类大问题:
- 完全连不上:可能是 DNS 解析失败、ARP 不通、路由不通、防火墙拦截、目标未监听。
- 能连上但异常:慢(丢包/拥塞/带宽)、偶发断、握手失败(TLS/协议)、被限流。
第一步永远是确认目标 IP 和端口:
# 域名有没有解析到正确 IP?用系统 DNS 与公共 DNS 各查一次,排除解析问题
dig +short learn.bangdream.xyz
getent hosts learn.bangdream.xyz # 本机解析(可能命中缓存/不同 DNS)
分层排查命令速查表¶
| 排查项 | 命令 | 期望/判断 |
|---|---|---|
| 解析是否正常 | dig +short <域名> / nslookup |
应返回正确 IP |
| 到 IP 是否可达(ICMP) | ping -c 4 <IP> |
有回复=网络层通;无回复=可能有主机禁 ping,不一定是断 |
| 到目标端口的 TCP 是否通 | nc -zv <IP> <端口> |
succeeded 通;refused=端口没监听;超时=被墙/防火墙丢包 |
| 沿途哪一跳断 | traceroute <IP> |
看 * * * 出现在哪一跳 |
| 本机端口/连接状态 | ss -tlnp / ss -tanp |
看 LISTEN 与 ESTABLISHED |
| 有没有被防火墙挡 | ufw status / iptables -L -n |
确认规则 |
| 路由表 | ip route / route -n |
默认网关是否存在 |
排查三步法(实测命令)¶
第一步:确认基本连通性。
# 1) 解析对了吗
getent hosts bangdream.xyz
# 2) 网络层通吗(ping 不通不等于主机挂了,先记下)
ping -c 3 bangdream.xyz
# 3) 到 80/443 的 TCP 通吗
nc -zv bangdream.xyz 80
nc -zv bangdream.xyz 443
第二步:确认目标服务有没有监听、从哪监听。
# 本机角度:3.0 应用是否在跑
ss -tlnp | grep ':443\|:3000\|:3010'
# 远程角度:端口 is 不通 vs refused 的区别
# refused = 握手有回但没服务;timeout = 包被丢弃(防火墙/云安全组/运营商拦截)
nc -zv 2.25.183.241 443
第三步:沿路径与协议层细查。
# 路径哪里断
traceroute -m 30 2.25.183.241
# 是 HTTP 层还是 TCP 层
curl -v https://bangdream.xyz/ 2>&1 | head -30
# DNS 是不是到公共 DNS 才通(本地被污染就用其他递归)
dig +short bangdream.xyz @223.5.5.5
常见问题与根因对照¶
| 现象 | 大概率根因 | 进一步确认 |
|---|---|---|
| 网页一直转圈但能 ping | DNS 慢/解析污染 | dig 看返回是否异常;换 DNS |
| 能 ping 不通 80/443 | 防火墙/云安全组拦了 | 查 ufw/云控制台放行端口 |
| 外网访问内网服务不通 | 反向代理/端口没暴露到公网 | ss -tlnp 确认是否只监听 127.0.0.1 |
| HTTPS 握手就断了 | TLS 版本/证书链/SNI 问题 | openssl s_client 看握手输出 |
| 偶发超时、时好时坏 | 丢包/拥塞/上游限速 | 长 ping 看丢包率;mtr 用组合工具 |
| 某个平台能连、别的平台不能 | 地域/运营商/被墙 | 换网络(如 4G)对比;考虑代理 |
注意 |
ping只是 ICMP,很多服务器(以及本机的 fail2ban 环境)会禁 ping,所以"ping 不通"不能直接下"服务器挂了"的结论,要看 TCP 端口是不是真通。用nc/curl才是端到端的真相。
进阶:用 mtr 综合诊断丢包¶
mtr 把 ping 和 traceroute 结合,能看到每一跳的丢包率:
mtr -rwc 20 2.25.183.241 # -r 报告模式,-w 宽格式,-c 探测次数
看哪一跳 Loss% 突增,那一段就是瓶颈或丢包点。
相关命令¶
ss -tanp详细 TCP 连接表;ip -s link看网卡统计。tcptraceroute走 TCP 的 traceroute(icmp 被禁时也能看路径)。dig +trace <域名>从根到权威一路解析,判断是递归还是权威问题。curl -w "%{http_code} %{time_total}\n"测响应耗时。