首页/网络/抓包与流量分析速查/tcpdump -i 指定抓包接口

tcpdump -i 指定抓包接口

用 -i 指定从哪块网卡或伪接口抓包:物理网卡、lo、any(全部接口)、docker0 与 veth 都可用;接口选错是抓不到包的首要原因。

-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 / nfqueuenetfilter 投递的报文与 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)要单独抓,抓父接口看到的是带标签的原始帧
同一个故障常有多个抓包点可选:出入口网卡、网桥、容器内。抓包点不同,看到的地址与方向都不同,选定之后要在结论里写明,否则别人无法复现判读。

易错点

  • 接口名写错会直接报错退出,但接口名正确而流量不走这块网卡时是静默无输出,两种现象要分开判断
  • 容器流量在宿主机 eth0 上看不到,需用 ip link 找到对应 veth 或进入容器网络命名空间抓
  • 本机进程间通信只走 lo,抓物理网卡永远看不到 127.0.0.1 的报文
  • 用 any 抓到的文件缺少以太网头,事后无法判断源 MAC,链路层问题必须用物理接口重抓
  • 虚拟机多网卡或 bonding 环境中抓了备接口会一无所获,先确认活动接口再抓

数据来源与参考

  • man 8 tcpdump(-i 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌