tcpdump -i 抓不到包主因是网卡名错误或接口未 up;需用 ip link show 或 tcpdump -d 查真实接口名并确认状态为 up,非 root 用户需加 sudo,port 80 匹配双向,dst port 80 仅匹配目标端口。

tcpdump -i 指定网卡时为什么抓不到包
常见现象是执行 tcpdump -i eth0 port 80 后无输出,但确认有 HTTP 流量。根本原因通常是网卡名不对或接口未 UP。
先用 ip link show 或 tcpdump -D 查真实接口名(比如现代系统常用 ens33、enp0s3,而非老旧的 eth0);再确认状态是否为 UP,否则 -i 指定无效。
- 若只记得大致前缀,可用
ip -br a | grep UP快速筛选活跃接口 -
-i any能捕获所有接口流量,但会混入 loopback 和虚拟设备数据,排查具体链路时不推荐 - 非 root 用户运行会直接失败,错误信息是
tcpdump: eth0: You don't have permission to capture on that device,需加sudo或配置cap_net_raw
port 和 dst port 的区别必须分清
port 80 是双向过滤:源端口或目的端口为 80 的包都会被捕获;而 dst port 80 只捕获目标端口为 80 的包(即服务端视角的入向请求)。
调试客户端行为时容易误用——比如你只想看谁在连你的 Web 服务,该用 dst port 80;但想看本机发出去的所有 HTTP 请求(含 curl 访问外部网站),就得用 src port 80 或更稳妥的 port 80。
- 组合条件必须用小写
and/or/not,不能用&&或||(那是 Wireshark 过滤语法) -
tcp port 443 and host 10.1.2.3表示:协议为 TCP、端口为 443、且 IP 是 10.1.2.3 的任意方向流量 - 如果目标是“只看发往 10.1.2.3:443 的包”,应写成
tcp dst port 443 and dst host 10.1.2.3
保存 pcap 文件供 Wireshark 分析的实操要点
终端里直接看 ASCII 流(如 -A)适合快速判断 HTTP 内容,但结构化分析必须导出二进制 pcap 文件。
tcpdump -i ens33 -w capture.pcap port 8080 是最简保存命令,但要注意三个易错点:
- 不加
-n会导致 DNS 解析阻塞抓包,尤其在高流量场景下可能丢包;建议固定加上-nn - 默认 snaplen 是 262144 字节,但某些内核或旧版 libpcap 会截断为 65535;如需完整载荷(比如看 TLS 握手细节),显式加
-s 0 - 文件权限继承自当前用户,若后续用普通用户在 Windows 上用 Wireshark 打开,无需担心编码或兼容性问题——pcap 格式跨平台通用
避免被 ICMP/ARP 干扰的真实工作流
线上服务排障时,port 80 抓出来的包里常混着大量 ICMP echo request 或 ARP,干扰关键业务流识别。
直接排除比事后过滤更高效:
- 排除 ARP:
not arp - 排除所有 ICMP(含 ping/traceroute):
not icmp - 只留 TCP + UDP 应用层流量:
tcp or udp(注意不是ip proto \tcp or \udp,BPF 语法不支持反斜杠转义) - 组合示例:
tcp port 9511 and not icmp and not arp—— 专为抓 hubble-transfer 服务流量设计
复杂表达式建议先用 tcpdump -i ens33 -d 'your expression' 输出 BPF 汇编,验证语法是否被正确解析,能避开 80% 的“写了却没效果”问题。











