本页目录

网络故障诊断方法论

分层定位——从 L1 到 L7 每次排除一层。MTU black hole(ICMP 被过滤导致 TCP 握手完成但数据传不动)、DNS 解析异常、TCP 握手超时——每种经典故障都有特定的诊断路径。mtr 比 ping/traceroute 更适合定位间歇性丢包。

概述

网络故障诊断的核心方法论是分层定位:从 L1(物理)到 L7(应用),每次排除一层。最常见的故障模式有:MTU black hole(ICMP 被过滤导致 TCP 卡死)、DNS 解析异常、TCP 连接建立后数据传输卡住(buffer/窗口问题)。mtr 比 ping/traceroute 更适合长期丢包监控——它显示了端到端每一跳的丢包率和延迟抖动。

分层诊断

L1 (物理): ip link, ethtool eth0 | grep Link
L2 (数据链): ip neigh, tcpdump arp
L3 (网络): ping -M do, traceroute, ip route
L4 (传输): ss -tlnp, tcpdump 'tcp[tcpflags] & tcp-syn != 0'
L5-6 (TLS): openssl s_client -connect host:443, tshark 'tls.alert_message.level==2'
L7 (应用): curl -v, dig, ss -tianp (Recv-Q / Send-Q)

经典故障模式

"网络通但访问不了"

ping 通 → L3 OK, L4 可能有问题

检查:
  ss -tlnp | grep <port>            服务在监听?
  iptables -L -n -v                  防火墙 block?
  tcpdump 'tcp[tcpflags] & tcp-rst != 0'  谁在发 RST?
  cat /proc/sys/net/netfilter/nf_conntrack_count  conntrack 表满?

MTU Black Hole

症状: ping 通, TCP SYN+ACK 完成, 数据传输卡住。

根因: 路径上 MTU 小于发送的包大小 + DF=1 + ICMP Frag Needed 被过滤
  → 包在路径上被丢弃, 发送方不知道

检测: ping -M do -s 1472 <target> → 失败 (但小 ping 通) → MTU black hole
缓解: iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

DNS 问题

dig <domain> +short                   返回了什么?
dig +trace <domain>                   递归路径上哪一步断了?
tcpdump -nn 'port 53'                 请求发出去了吗? 有响应吗?

间歇性超时

mtr -r -c 100 <target>               哪一跳开始丢包+抖动?
ethtool -S eth0 | grep -E 'err|drop'  网卡丢包?
cat /proc/net/dev                      软丢包?
tc -s qdisc show dev eth0              qdisc 丢包 (bufferbloat?)

参考

  • mtr: bitwizard.nl/mtr
  • iptables: netfilter.org/documentation

Keywords: network troubleshooting, L1-L7, MTU black hole, DNS, TCP RST, conntrack, bufferbloat