-i 在做什么
-i 决定 tcpdump 从哪块接口收包,是抓包命令里最容易出错的一项。取值可以是物理网卡(eth0、ens192、enp3s0)、回环 lo、伪接口 any(抓所有接口)、容器相关接口(docker0、vethXXXX、cni0),以及 netfilter 的 nflog、nfqueue。Linux 上 any 使用 SLL 伪链路层,抓出来的报文没有以太网头;要分析 MAC 地址或 VLAN 标签就必须指定具体物理接口。接口写错时的现象很典型:命令能跑、没有任何报错,只是什么都抓不到。
基本信息
| 语法 | tcpdump -i <接口名 | any | lo | 编号> |
|---|---|
| 列接口 | tcpdump -D 或 ip link show(ip -br link show 更紧凑) |
| any 的语义 | 抓全部接口,Linux 上用 SLL 链路层,丢失以太网头 |
| 权限 | root 或 CAP_NET_RAW,`权限不足时列表为空或直接报错 |
| Windows 侧 | 需 Npcap,接口名形如 \Device\NPF_{GUID} |
典型使用场景
- 查物理链路与交换机侧问题:抓具体网卡,保留二层头与 MAC 信息
- 排查本机进程间通信:抓 lo,回环流量根本不出物理网卡
- 不确定流量走哪块网卡:先用 any 快速定位,再切到具体接口复抓一次
- 容器排障:在宿主机抓对应 veth,或直接进入容器网络命名空间内抓
- 多网卡与 bonding 环境:先确认实际承载流量的接口,避免抓了备接口
常用示例
常用示例
tcpdump -D # 列出可抓的接口及编号
tcpdump -i eth0 -nn -c 10 # 抓物理网卡 eth0 的 10 个包
tcpdump -i lo -nn port 8080 # 抓本机回环,看进程间通信
tcpdump -i any -nn -c 20 port 443 # 不确定接口时先全接口取样
tcpdump -i any -nn -e -c 5 # any 上加 -e,看到的是 SLL 头
ip -br link show # 对照接口名与状态,确认是否 Up
tcpdump -i 4 -nn -c 5 # 也可用 -D 给出的编号指定接口
nsenter -t 12345 -n tcpdump -i eth0 -nn # 进入容器网络命名空间内抓包接口类型与适用场景
| 接口 | 含义 | 什么时候用 |
|---|---|---|
| eth0 / ens192 / enp3s0 | 物理网卡,名称随发行版命名规则变化 | 分析链路层、与交换机镜像口对照时必须抓这类接口 |
| lo | 回环接口 | 只承载本机进程间通信,127.0.0.1 的流量只在它上面出现 |
| any | 伪接口,抓所有接口的流量 | 先快速定位流量落在哪块网卡;用它抓的文件在 Wireshark 里没有以太网头 |
| docker0 与 vethXXXX | 容器网桥与虚拟网卡对 | 抓宿主机侧的容器流量,进容器内抓通常更直观 |
| nflog / nfqueue | netfilter 投递的报文 | 与 iptables 日志对照,视角与网卡收发不同 |
| bond0 / br0 | 绑定与网桥虚拟接口 | 确认流量实际从哪个从属接口进出,必要时抓从属网卡 |
any 接口使用 SLL 伪链路层,MAC 地址与 VLAN 信息不可用。要分析二层问题时不能图省事用 any,必须指定物理接口重新抓一次。
抓不到包时先确认三件事:接口名是否正确(tcpdump -D 核对)、流量是否真的经过这块网卡(ip route get 看出口)、是否具备权限。三者症状不同,权限不足会直接报错而非静默。
确认抓包点
确认抓包点
ip route get 10.0.0.9 # 看去往该地址的流量走哪块网卡
tcpdump -i ens192 -nn -c 5 host 10.0.0.9 # 用确认过的接口复抓
ss -lnt # 目标是本机服务时,同时核对监听地址与端口容器与多接口要点
- veth 名字每次重启都会变,靠 ip link 与容器映射关系现查,不要照搬上一次的接口名
- 容器内抓包看到的是容器视角,宿主机抓看到的是转发后视角,两个位置的源地址可能不同
- bonding 与多队列网卡请确认从属接口,流量只从活动成员进出
- VLAN 子接口(eth0.100)要单独抓,抓父接口看到的是带标签的原始帧
同一个故障常有多个抓包点可选:出入口网卡、网桥、容器内。抓包点不同,看到的地址与方向都不同,选定之后要在结论里写明,否则别人无法复现判读。