tcpdump抓不到包主因是网卡名错误、网卡未启用或权限不足;需用ip link show查真实网卡名并确认up状态,非root用户必须加sudo;过滤时注意引号包裹、逻辑运算符优先级及and/or语义区别。

tcpdump -i 指定网卡但抓不到包?先确认网卡名和状态
常见现象是 tcpdump -i eth0 什么都没输出,或者只看到广播/ARP包。根本原因往往是网卡名不对、网卡没启用、或当前用户没权限。
- 用
ip link show或ifconfig -a查真实网卡名(比如可能是ens33、enp0s3,而非习惯性写的eth0) - 确认网卡处于
UP状态:ip link show ens33 | grep "state" - 非 root 用户必须加
sudo,否则内核会静默丢弃所有捕获请求(不会报错,但没数据) - 虚拟机中若用 NAT 模式,宿主机流量通常不经过客户机网卡,需切到桥接或 host-only 模式再试
按端口过滤:port、portrange 和方向控制很关键
port 80 看似简单,但默认匹配源或目的端口任一为 80 的包,常导致结果混杂。实际调试时更需要明确方向或排除干扰。
- 只抓目的端口是 80 的 HTTP 请求:
tcpdump -i ens33 'dst port 80' - 只抓源端口是 22 的 SSH 响应:
tcpdump -i ens33 'src port 22' - 抓某范围端口(如 Docker 常用 30000–32767):
tcpdump -i ens33 'portrange 30000-32767' - 排除某个端口(比如跳过 DNS):
tcpdump -i ens33 'port 80 and not port 53'
注意单引号必须包裹整个过滤表达式,否则 shell 会提前解析 >、& 等符号。
组合协议、IP 和端口:避免“看似对实则漏”的写法
想抓某台机器的 HTTPS 流量,写成 tcpdump -i ens33 host 192.168.1.100 port 443 是常见错误——它等价于 (host 192.168.1.100) or (port 443),逻辑是“或”不是“与”。
- 正确写法(且关系):
tcpdump -i ens33 'host 192.168.1.100 and port 443' - 限定协议+IP+端口(减少误匹配):
tcpdump -i ens33 'tcp and host 10.0.2.15 and dst port 3306' - 抓某 IP 的所有 TCP 包但排除常见服务端口:
tcpdump -i ens33 'tcp and host 192.168.1.5 and not (port 22 or port 80 or port 443)'
tcpdump 过滤语法里 and/or/not 优先级固定,括号不能省;不加引号或括号错位,结果往往和预期差很远。
进阶:抓应用层关键字、避免截断、控制输出大小
单纯看包头不够,有时得确认 payload 是否含特定字符串(如 API 路径),但默认 tcpdump 会截断包内容,且不解析上层协议语义。
- 防止截断(显示完整 payload):
-s 0(-s是 snaplen,0表示不限制) - 搜索 HTTP 请求中的路径:
tcpdump -i ens33 -s 0 'tcp and port 80' -A | grep -a '/api/v1/users'(-A以 ASCII 显示,grep -a强制文本搜索二进制流) - 限制抓包数量防卡死:
-c 100(抓满 100 个包自动退出) - 保存到文件后续分析:
tcpdump -i ens33 -s 0 'port 5432' -w pg.pcap,之后可用wireshark pg.pcap或tshark -r pg.pcap
注意 -A 和 -X 会显著降低捕获性能,线上环境慎用;而 -w 写磁盘模式几乎无开销,适合长时间监听。









