Linux网络排查“兵器谱”:从tcpdump、eBPF到内核日志的深度探索

在Linux的世界里,网络问题就像幽灵,时隐时现。作为多年的运维老兵,我经历过无数次深夜被报警叫醒,只为追踪一个飘忽不定的网络丢包或延迟。今天,我想和你分享我的“兵器谱”——一套从传统到前沿,从应用层到内核层的网络问题排查实战路径。这不仅仅是工具列表,更是我踩过无数坑后总结出的侦查逻辑。
第一件兵器:tcpdump – 网络世界的“听诊器”
当问题出现,我的第一反应往往是:“到底有哪些包在飞?” tcpdump就是我的听诊器,直接监听网卡的“心跳”。它经典、直接,几乎无处不在。
实战踩坑提示:别一上来就抓所有包,那会瞬间产生巨量数据,让你迷失方向。一定要先“圈定战场”。
# 错误示范:在繁忙网卡上直接运行,日志瞬间爆炸
# tcpdump -i eth0
# 正确姿势:精准过滤,例如只抓取与特定目标IP的HTTP(80端口)流量
tcpdump -i eth0 -nn 'host 192.168.1.100 and port 80' -w http_capture.pcap
# 更进阶的,查看TCP标志位,排查连接问题,比如只抓SYN包看握手
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0'
抓包后,用Wireshark图形化分析更直观。但tcpdump的局限在于,它看到的是经过协议栈处理后的结果,如果包在内核里就丢了,它也无能为力。这时,我们需要更深入的武器。
第二件兵器:eBPF/BCC – 内核态的“实时追踪系统”
如果说tcpdump是在网卡门口看进出的人,那么eBPF(Extended Berkeley Packet Filter)就是在大楼(内核)的各个关键通道安装高清摄像头和传感器。它可以安全、高效地在内核中运行沙盒程序,实时收集网络栈任意层面的数据。
实战感受:这是排查复杂内核网络问题的“神器”。我第一次用BCC(eBPF的工具集)的tcplife追踪TCP连接生命周期时,那种对整个系统网络连接状态了如指掌的感觉,简直像开了上帝视角。
# 使用BCC工具集,通常需要先安装:apt-get install bpfcc-tools
# 1. 追踪TCP连接建立与关闭,显示持续时间、吞吐量
sudo tcplife
# 2. 追踪内核中TCP的重传事件,这是排查延迟和丢包的黄金指标
sudo tcpretrans
# 3. 按进程统计TCP收发包量,快速定位哪个进程最“费流量”
sudo tcptop -C 1
你甚至可以编写自定义的eBPF程序,来追踪特定的内核函数(如tcp_drop或ip_forward)。但请注意,生产环境使用需要格外谨慎,避免影响性能。
第三件兵器:内核日志与网络统计信息 – 系统的“黑匣子”
当网络异常涉及驱动、硬件或内核协议栈本身时,dmesg和/proc/net/下的统计文件就是最重要的“黑匣子”数据。
操作步骤:我通常会按以下顺序检查:
# 1. 首先查看内核环形缓冲区日志,寻找任何网络相关的错误或警告
sudo dmesg -T | grep -E "(eth|net|drop|error|firmware)" | tail -50
# 2. 检查网络接口的详细统计信息,关注`errors`, `dropped`, `overruns`
cat /proc/net/dev
# 或者用更易读的方式
ip -s link show eth0
# 3. 查看协议层统计,这里藏着魔鬼
# 查看TCP的关键统计,如主动/被动打开、重传、错误等
cat /proc/net/snmp | grep Tcp
# 重点关注 `TCP` 行中的 `RetransSegs`(重传段)和 `InErrs`(入错误)
一个经典案例:我曾遇到服务器间歇性丢包,tcpdump抓不到,但/proc/net/dev里对应网卡的`dropped`计数器持续增长。最终结合`dmesg`发现是网卡驱动的一个bug,在特定流量模式下会丢包,更新驱动后解决。没有这些内核统计信息,这个问题几乎无法定位。
组合技:一套实战排查流程
光有兵器不会用等于零。下面是我典型的排查思路:
- 现象定位:先用`ping`、`traceroute`、`ss`(替代netstat)确定问题范围(延迟?丢包?端口不通?)。
- 流量监听:用`tcpdump`在客户端和服务端同时抓包,对比分析,确定包在哪个环节出了问题。
- 内核洞察:如果抓包显示包到达了主机但应用没收到,立刻祭出`tcpretrans`等BCC工具,并检查`/proc/net/snmp`中的重传计数。
- 深挖日志:检查`dmesg`和`/var/log/syslog`/`journalctl`,寻找内核、驱动或防火墙(如iptables/nftables)的异常记录。
- 性能剖析:若怀疑是性能瓶颈,使用`sar -n DEV`看历史流量,用`ethtool -S eth0`查看网卡硬件计数,用`perf`或eBPF工具分析内核调用栈。
网络排查是一场从外到内、层层递进的侦探游戏。掌握这套“兵器谱”,意味着你拥有了从数据链路层到应用层,从用户态到内核态的完整视野。希望这些带着实战汗水和踩坑伤痕的经验,能让你在下一次面对网络幽灵时,从容不迫,一剑封喉。


tcpdump用多了都快成肌肉记忆了,不过还是得提醒自己别乱抓全量包😅