tcpdump 默认不保存包,需用 -w 写入 pcap 文件分析;必须加 -s 0 截全包、指定正确网卡(如 lo 回环)、root 权限,过滤用 BPF 语法,iptables 不影响抓包时机。

tcpdump 默认不保存包,只输出到终端;要分析真实流量,必须用 -w 写入文件,再配合 -r 或 Wireshark 查看——直接终端滚动看几万行包,基本没法定位问题。
抓包前必须确认网卡和权限
运行 tcpdump 需要 root 权限,普通用户会报错:tcpdump: ens33: You don’t have permission to capture on that device。别急着加 sudo 就开抓,先查清楚目标网卡是否 UP、是否有流量:
-
ip link show看哪些接口状态是UP(比如ens33、eth0或lo) -
tcpdump -D列出所有可捕获的接口,注意any是伪接口,能抓所有网卡但不含链路层信息 - 回环流量(如
localhost:8080)必须指定-i lo,否则在物理网卡上根本看不到
写入文件比实时打印更可靠
终端输出容易丢帧、缓冲溢出,且无法回溯或过滤重放。真正用于分析的抓包,几乎都走文件路径:
- 用
-w file.pcap保存原始二进制包(推荐.pcap后缀,Wireshark 兼容性最好) -
-s 0必须加上,否则默认只截前 68 字节,HTTP header、TLS handshake 等关键内容全被砍掉 - 加
-nn避免 DNS 反解拖慢速度,也防止因解析失败导致抓包中断 - 示例命令:
sudo tcpdump -i ens33 -nn -s 0 -w debug.pcap port 8080
过滤表达式写错就抓不到想要的包
过滤不是拼凑关键词,而是按 BPF 语法组合原语。常见错误包括:
- 把
host 192.168.1.100 and port 22写成host 192.168.1.100 port 22(缺逻辑连接词,会被忽略后半段) - 想抓响应包却用了
src host A,结果只看到本机发出去的请求,漏掉对端返回的 reply - HTTP 流量混在 TLS 中?
port 443能抓到包,但-A看不到明文——因为加密了,别指望tcpdump解密 - 需要方向控制时,优先用
dst host/src port,比笼统的host更精准
iptables 规则不影响 tcpdump 抓包时机
这是个高频误解:很多人以为 DROP 规则会让 tcpdump 抓不到包。其实不是。
- 进入方向:包到达网卡 →
tcpdump捕获 → 才进入iptables PREROUTING链 → 最终是否被 DROP,不影响已捕获的内容 - 出去方向:应用发包 → 经过
iptables OUTPUT→ 若被 DROP,则tcpdump在POSTROUTING后捕获不到该包 - 所以,若怀疑是 iptables 导致连接不通,应重点抓
OUTPUT和FORWARD链前后的包,而不是只盯INPUT
-s 0 和网卡选择。一个没加 -s 0 的抓包文件,可能让你反复抓三次才意识到 payload 被截断;而抓了 eth0 却在查 lo 上的服务,等于在错误的地方找钥匙。

















