Linux 网络故障根因分析与高级调试技巧
一、故障根因分析方法论(5Why + 分层排查)
通用框架:
- 分层验证:物理层 → 数据链路 → 网络层 → 传输层 → 应用层 → 外部依赖
分层排查 checklist:
- 物理/链路:ethtool、dmesg、ip -s link
- 传输层:ss、tcpdump、netstat -s
- 安全层:iptables/nftables、SELinux
二、高级调试工具链
抓包与协议分析:
# 基础tcpdump -i any -nn -c 200 "port 80 or port 443" -w capture.pcap# 高级过滤tcpdump -nn 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0'# 实时分析tcpdump -i eth0 -nn | ts# Wireshark 离线:Follow TCP Stream、Expert Information、IO Graph
命名空间调试(容器/K8s):
nsenter -t $(pidof containerd-shim) -n ip addrkubectl debug node/node-name -it --image=nicolaka/netshoot
内核追踪:
# perfperf record -e skb:kfree_skb -a -g -- sleep 10perf report# bpftrace(eBPF)bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'bpftrace tools/tcpconnect.bt
系统调用追踪:
strace -p <pid> -e trace=network
其他利器:
三、复杂故障案例深度分析
案例1:跨数据中心间歇性超时
现象:部分请求延迟 > 5s,偶发。
排查过程:
- tcpdump 两端抓包对比,发现重传但无对端 ACK
- 根因:中间设备 MTU 不一致 + ICMP Fragmentation Needed 被过滤
解决:启用 TCP MSS Clamping + 统一 MTU
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
案例2:高并发下连接 reset 激增
现象:后端日志大量 "Connection reset by peer"
排查:
- ss 显示大量 FIN_WAIT / TIME_WAIT
- 检查 iptables 规则顺序 + conntrack 表满
根因:防火墙策略 + conntrack 耗尽 + 应用未正确处理连接
解决:调大 nf_conntrack_max + 优化应用连接池 + 调整防火墙规则优先级
案例3:K8s Pod 间网络不通
排查:
- calicoctl get workloadendpoint
- 从问题 Pod 进入 netshoot 容器测试连通性
- 检查 NetworkPolicy selector
根因:NetworkPolicy 规则过严 + IP 池冲突
解决:调整 Policy + 重启受影响 Pod
案例4:DNS 解析解析慢且不稳定
排查:
- systemd-resolve --statistics
根因:上游递归服务器负载高 + 本地转发配置循环
解决:切换 Unbound 递归 + 增加缓存 + 健康检查
四、高级调试技巧
对比分析:
时间旅行:
- journalctl -S "2026-07-01" -U "2026-07-03"
压力模拟:
tc(Traffic Control)模拟延迟/丢包
tc qdisc add dev eth0 root netem delay 100ms loss 1%
内核日志:
dmesg -T | grep -E 'NET|tcp|nf_conntrack'
五、根因分析模板与复盘
模板:
复盘会议:Blame-free,关注系统性问题。