抓包前须确认网卡与权限:默认监听首个up接口,需用ip link show或tcpdump -d查看;lo回环口需显式指定;非root用户需sudo或setcap授权。

抓包前必须确认网卡和权限
不指定网卡或用错接口,tcpdump 很可能什么也抓不到——它默认只监听第一个 UP 状态的接口(通常是 eth0 或 ens33),但容器、云主机、多网卡环境里这个“第一个”未必是你想监控的那个。
- 先用
ip link show或tcpdump -D列出所有可用接口,注意看UP状态和描述(比如是否带docker、veth、lo) -
lo(回环口)要单独抓:很多本地服务调用(如 curl localhost:8080)根本不出物理网卡,不指定-i lo就等于没抓 - 非 root 用户执行会失败:提示
tcpdump: lo: You don't have permission to capture on that device;要么加sudo,要么用setcap cap_net_raw+ep /usr/sbin/tcpdump授权(生产环境慎用)
过滤表达式写错,90% 的包都白抓
tcpdump 的过滤语法不是 shell 通配,也不是正则,而是 pcap-Filter 表达式;少一个括号、漏一个反斜杠转义、逻辑顺序不对,结果就完全跑偏。
- 主机 + 端口组合必须用
and连接:host 192.168.1.100 and port 8080,写成host 192.168.1.100 port 8080会被当成“host 是 192.168.1.100 port 8080”这种非法域名解析 - 否定操作要用
!或not,且优先级高:想排除 ssh 流量,port ! 22是对的,但! port 22会否定整个表达式(等价于“非 TCP/udp 22 端口的所有包”,范围大得多) - 涉及 or/and 混用时,必须用反斜杠转义括号:
host a and ( b or c );否则 shell 会提前截断或报错 - 别信“-n 就够了”:想彻底避免 DNS 和端口名解析,得用
-nn;只用-n还会把 80 解成http,干扰判断
保存文件时 -s 0 不是可选项,是必选项
默认只抓前 68 字节,HTTP header、TLS SNI、mysql 查询语句……全被截断。你看到的 Flags [P.] 后面空空如也,不是没数据,是被砍掉了。
-
-s 0表示“抓完整包”,这是分析应用层协议(HTTP、DNS、gRPC)的前提 - 但要注意:-s 0 会显著增大文件体积和磁盘 I/O,高频流量下建议配合
-c(限制包数)或-G(按时间轮转)使用 - 保存为
.pcap格式(如-w trace.pcap),确保 wireshark / tshark 能直接打开;.cap也可,但部分旧工具兼容性差 - 别用
ctrl+c中断后才发现没加-w:屏幕输出无法回溯重放,也没法过滤重分析
iptables 规则不影响入向抓包,但会影响出向可见性
很多人以为 “封了 iptables 就抓不到包”,其实只对一半:数据包进网卡后、进 netfilter 前,tcpdump 就能捕获;但发出去的包,如果被 OUTPUT 或 POSTROUTING 链 DROP,那 tcpdump 根本看不到它离开主机。
- 入向(inbound)包:无论 iptables 是否允许,只要到达网卡,
tcpdump都能抓到(例如被 DROP 的扫描包) - 出向(outbound)包:如果在 OUTPUT 链被拒绝,
tcpdump抓不到;如果只是 SNAT/MASQUERADE,在tcpdump里看到的是转换前的源 IP - 验证方法:在目标机器上同时运行
tcpdump -i any port 80和iptables -L -v -n,对比计数器增长和抓包数量是否匹配
最常被忽略的一点:tcpdump 看不到虚拟网卡内部转发(如 bridge、macvlan、CNI 插件中间链路)的包,除非你明确指定对应 veth 或 cni0 接口——而这些接口名每次重启可能都变。