tcpdump需显式指定网卡(-i)、端口方向(src/dst port)和全包截取(-s 0),并用-n避免dns延迟;默认接口不可靠,port过滤不识别应用层协议,-w保存pcap供wireshark分析。

直接用 tcpdump -i eth0 port 80 就能抓指定网卡和端口的包,但实际执行时容易因权限、过滤逻辑或截断问题看不到完整载荷。
指定网卡必须用 -i,别依赖默认接口
不加 -i 时,tcpdump 会选系统里第一个“已配置且非回环”的接口(通常是 eth0 或 ens33),但不同发行版、云主机、容器环境的默认命名可能完全不同。一旦选错接口,就完全抓不到目标流量。
- 先用
tcpdump -D看当前可用接口列表,确认你要的网卡名(比如enp0s3、br-123abc、docker0) - 回环流量必须显式写
-i lo,-i any虽能抓所有接口,但无法区分来源,且部分内核版本不支持混杂模式下的any - 如果提示
device not found,检查网卡是否 up:ip link show,或是否在容器/namespace 里没挂载该设备
port 过滤只匹配传输层端口,不是应用层协议
port 443 抓的是 TCP/UDP 层目的或源端口为 443 的包,不管里面是 HTTPS、TLS 握手还是乱码;它不会识别 HTTP 请求里的 Host: 或 TLS 的 Server Name Indication。这意味着:
- 一个 HTTPS 流量会同时命中
port 443和tcp(因为 HTTPS 走 TCP),但port 443本身不等价于 “HTTPS 流量” - 若想排除 DNS 查询干扰,得加
and not port 53;想只看客户端发起的连接,用src port 80或dst port 80明确方向 -
portrange 8000-8080比写一堆port 8000 or port 8001 or ...更可靠
不加 -s 0 很可能丢掉关键数据
tcpdump 默认只截取前 262144 字节(旧版本是 65535,更老的是 96),对现代 HTTP/2、gRPC、TLS 1.3 握手这类带长扩展字段的协议,经常出现 [|tcp] 或 [|http] 标志——这表示包被截断了,你看不到完整的请求头或证书内容。
- 务必加
-s 0强制抓全包,尤其排查 JSON 解析失败、证书校验异常、gRPC status code 不明时 - 加了
-s 0后内存和 CPU 消耗会上升,但在单次诊断中影响极小;真要长期监听,再考虑用-C 100+-W 5循环写文件 - 配合
-A(ASCII 打印)或-X(十六进制+ASCII)才能看到应用层明文,但注意:HTTPS 的 body 仍是加密的,只能看到 TLS 记录层结构
常见错误:权限不足、DNS 卡住、输出刷屏
普通用户运行 tcpdump 会直接报 tcpdump: eth0: You don't have permission to capture on that device;而加 -n 不仅提速,还能避免因 DNS 查询超时导致第一行输出延迟数秒。
- 用
sudo tcpdump -i eth0 -n port 80 -c 10 -A是最稳妥的入门组合:带权限、禁解析、限数量、看 ASCII - 如果
Ctrl+C后没输出或卡住,大概率是 DNS 正在查反向解析,立刻补上-n - 想保存供 Wireshark 分析,用
-w output.pcap,别用重定向(> file.txt),那只会存控制台文本,不是原始帧
真正难的不是命令怎么敲,而是判断该在哪块网卡、哪个方向、截多长、要不要排除干扰流——这些取决于你正在排查的是本机服务、跨节点调用,还是 NAT 后的外部访问。抓之前花 10 秒想清楚链路路径,比多抓十次包更有用。











