必须用sudo、指定完整包长-s 0、避免dns解析加-nn:tcpdump初学者三大痛点是权限不足报错、默认截断payload、卡在dns解析;需先sudo tcpdump -d确认网卡名,-i指定up接口,-s 0抓全包,-nn禁用解析,expression置于命令末尾且带空格。

没权限、抓不到包、看不懂输出——这三个问题占了 tcpdump 初次使用的 90%。核心就一条:必须用 sudo,不加直接报错 You don’t have permission to capture on that device;默认只抓前 68 字节,关键 payload 被截断;不加 -n 或 -nn,会卡在 DNS 解析上,导致延迟甚至失败。
tcpdump 抓不到包?先检查权限和网卡名
非 root 用户运行 tcpdump 必然失败,错误信息是 You don’t have permission to capture on that device。别试普通用户加 sudo tcpdump 就完事——得确认目标网卡是否真实存在且 UP 状态:
-
sudo tcpdump -D列出所有可用接口(如ens33、lo、any) -
ip link show | grep -A1 "state UP"确认哪个接口正在收发流量 - 别盲目用
-i eth0:现代发行版多用ens33、enp0s3等命名,eth0很可能不存在 - 想抓本机所有进出流量?用
-i any,但注意它不支持部分过滤器(比如port在某些内核版本下会失效)
为什么抓到的包里看不到 HTTP 内容?
默认 tcpdump 只捕获每个包前 68 字节(-s 68),而 HTTP 请求头通常在 100+ 字节之后。不显式指定长度,-A 或 -X 输出全是省略号或乱码:
- 加
-s 0强制抓完整包(推荐,兼容性最好) - 加
-A以 ASCII 显示载荷(适合看 HTTP/HTTPS 明文,但注意 HTTPS 本身加密,只能看到 TLS 握手) - 加
-nn避免解析端口名(否则port 443会显示成https,影响脚本匹配) - 组合示例:
sudo tcpdump -i ens33 -nn -s 0 -A port 80,能清晰看到 GET / HTTP/1.1 和 Host 头
过滤表达式写不对,结果全是噪音
tcpdump 的 expression 不是参数,是独立语法块,位置在命令末尾,且不加引号容易被 shell 拆解出错。常见误写包括把 host 192.168.1.100 放在选项中间、漏掉空格、混淆 src/dst 限定词:
- 正确写法:
sudo tcpdump -i ens33 src host 192.168.1.100 and port 8080 -
src host和dst host是原子表达式,不能拆开;and/or/not全是小写,且前后必须有空格 - 端口过滤优先用
port(TCP/UDP 通用),不用tcp port或udp port——除非你明确只想抓某一层协议 - 抓回环流量?必须用
-i lo,localhost或127.0.0.1在其他接口上根本不会出现
保存抓包文件后无法用 Wireshark 打开?
-w 保存的是原始 pcap 格式,但若未指定完整路径或权限不足,文件可能为空或损坏:
- 务必用绝对路径写入,例如
-w /tmp/capture.pcap,避免当前目录不可写 - 别用
-w同时加-A或-X:二者互斥,-w会静默丢弃文本输出 - 文件生成后,用
file /tmp/capture.pcap确认类型是tcpdump capture file,不是empty或data - Wireshark 打不开?大概率是文件没写完就被 Ctrl+C 中断——加
-c N限制包数,或用-G定时轮转(如-G 60 -w /tmp/cap_%Y-%m-%d_%H:%M:%S.pcap)
真正难的不是记住所有参数,而是理解 expression 是独立语法、-s 0 是保命操作、以及每次执行前先 sudo tcpdump -D 确认接口名——这些细节不踩一遍坑,很难信。











