必须指定网卡、加 -nn 禁用解析、用 -s 0 捕全载荷、用单引号包裹 BPF 过滤表达式、保存为 .pcap 文件供后续分析——这是 tcpdump 高效抓包的四大核心原则。

怎么快速抓到想要的包,而不是满屏乱飞
默认不加任何参数跑 tcpdump,它会把所有经过网卡的包全打出来——包括 ARP、DHCP、本机 loopback 流量,甚至你自己 ssh 的回显。这不是分析,是信息轰炸。
- 必须指定网卡:
sudo tcpdump -i ens33(先用ip link show确认真实接口名,别硬写 eth0) - 禁用 DNS 和端口解析,避免卡顿和干扰:
-nn是刚需,否则你会看到一堆www.google.com.https这种带点的字符串,还可能因 DNS 查询失败中断抓包 - 想看实时内容?加
-A(ASCII)或-X(十六进制+ASCII),但注意:这会让输出变慢、占屏,且只适合小流量调试;大流量下建议先保存再分析 - 别信“默认长度够用”——
-s 0才能捕获完整载荷,否则 HTTP body、TLS 握手细节全被截断,显示为[|tcp]
怎么精准过滤,而不是靠眼睛扫几千行
靠肉眼从原始输出里找某个 IP 或端口,效率极低,还容易漏。tcpdump 的过滤器本质是 BPF 表达式,不是 grep,语法错一点就啥也不出。
- 目标 IP + 端口组合最常用:
sudo tcpdump -i ens33 -nn 'dst host 192.168.1.100 and port 8080'(注意单引号包裹,避免 shell 解析空格和 and) - 排除干扰流量更实用:
port not 22能跳过你自己的 ssh 会话,not arp能干掉广播噪音 - 协议判断要分清:
tcp、udp、icmp是独立关键字,必须放表达式开头或用括号明确优先级,比如'(tcp or udp) and port 53' - 写复杂条件前,先用
tcpdump -d编译验证语法:tcpdump -d 'src net 10.0.0.0/8 and tcp port 443',输出汇编级 BPF 指令无报错才真正有效
怎么保存和复用抓包数据,而不是当场看完就丢
现场看几秒就 Ctrl+C,等于没抓。真要排查问题,得把原始字节流存下来,供后续用 Wireshark 细查或多人协作分析。
- 保存为标准 pcap 格式:
sudo tcpdump -i ens33 -nn -s 0 -w capture.pcap port 80,这个文件可直接双击用 Wireshark 打开 - 限制大小防磁盘爆掉:
-C 10(每个文件最多 10MB)、-G 300(每 5 分钟轮转),组合起来就是循环抓包:sudo tcpdump -i ens33 -w dump- -C 10 -G 300 'tcp port 3306' - 读取已保存文件不用 root:
tcpdump -r capture.pcap -nn,还能叠加过滤:tcpdump -r capture.pcap -nn 'http.request.method == "POST"'(注意:此语法需较新版本支持,老版只认基础 BPF) - 别用
.cap当扩展名——虽然 Wireshark 能认,但部分工具(如 tshark 脚本)默认只识别.pcap,统一用后者省事
为什么抓不到包?常见权限和配置陷阱
报错 You don't have permission to capture on that device 不一定是 sudo 没加,还有更隐蔽的原因。
- 容器或云主机环境里,
ens33可能根本不是你的业务网卡,得用tcpdump -D列出所有可用接口,重点关注any(抓所有接口)或lo(抓本地回环,比如调试 localhost 服务) - 某些系统启用了 eBPF 或 cgroup 网络隔离,普通用户即使加了 sudo 也无权访问特定接口,此时要检查
/proc/sys/net/core/bpf_jit_enable和容器 runtime 配置 - 防火墙或 SELinux 可能拦截 raw socket 创建,CentOS/RHEL 上可临时测试:
sudo setsebool -P cap_net_raw_admin 1(仅限调试,勿长期开启) - 虚拟机里抓不到宿主机发来的包?确认网卡模式是 bridged/NAT,而不是 host-only;KVM/QEMU 用户还要留意
vhost=on是否导致部分包绕过 tap 设备
抓包不是一锤子买卖,关键在“存得准、滤得稳、看得清”。最常被忽略的是 -s 0 和 -nn 的组合——少了它们,你看到的很可能只是半截 TCP 包和一堆无法复现的主机名解析失败。

















