🌐 第07章 · 网络故障排查

连不上/慢/DNS 错误的排查

网络故障排查

这一章给出一套"从现象到根因"的网络排查思路和一组配套命令。网络问题千变万化,但排查顺序是固定的:从上到下(应用 → 传输 → 网络层 → 物理链路),或从 OSI 的分层角度一层层剥。遇到"连不上/很慢/时好时坏",按这套来基本都能定位。

先定性:是"没到"还是"到了却失败"?

分两类大问题:

  1. 完全连不上:可能是 DNS 解析失败、ARP 不通、路由不通、防火墙拦截、目标未监听。
  2. 能连上但异常:慢(丢包/拥塞/带宽)、偶发断、握手失败(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" 测响应耗时。