多网卡抓包关键在于精准指定接口:先用ip -br link或tcpdump -d列出可用接口,再用-i指定启用的物理/虚拟接口,避免使用lo、any及未启用接口,并通过ss、ip route和实时ping交叉验证。

在多网卡 Linux 服务器上抓包,关键不是“能不能”,而是“别抓错地方”。很多问题其实不是网络不通,而是你盯着 eth0 看了半天,流量却全走 eth1 或 bond0。下面直接说清楚怎么精准指定接口、怎么确认该选哪个、以及常见踩坑点。
先确认有哪些可用网卡
别凭经验猜接口名,系统可能用 ens33、enp0s3、bond0、br0,甚至每次重启都变。用这几个命令快速列出真实可用的接口:
-
推荐首选:
ip -br link show | grep -E "UP|LOWER"—— 显示所有启用(UP)或有链路层状态的接口,简洁明了 -
tcpdump 自带检测:
sudo tcpdump -D—— 输出带编号的列表,如1.eth0[Up, Running],编号可直接用于-i 1 -
传统方式(兼容老系统):
ifconfig -a | grep "^[a-z]"或ip link show | awk '/^[0-9]+:/ {print $2}' | sed 's/://'
注意:loopback(lo)和 any 不是物理接口,any 会混入所有接口流量,调试阶段慎用。
指定接口抓包的核心写法
用 -i 参数指定接口,但要注意三类常见情况:
-
普通以太网卡:直接写接口名,例如
sudo tcpdump -i eth0 port 80 -nn -
无线网卡要监听其他设备流量:需先启用监控模式(如用
sudo airmon-ng start wlan0得到wlan0mon),再抓sudo tcpdump -i wlan0mon -c 10 -
虚拟/聚合接口:如
bond0、br0、vethxxx,只要状态为 UP,就可直接指定,无需额外操作
小技巧:如果记不清接口名,可以用编号代替,比如 sudo tcpdump -i 2(对应 tcpdump -D 输出的第 2 行)。
避免“抓不到包”的典型误操作
以下问题高频出现,往往和接口选择直接相关:
-
接口没启用:
ip link show eth1显示state DOWN,那-i eth1必然无数据,先sudo ip link set eth1 up -
流量根本不在该接口:用
ss -tuln或netstat -tuln查看服务监听在哪张卡;用ip route get 10.10.20.30查目标走哪条出口 -
权限不足导致静默失败:非 root 用户运行 tcpdump 可能看不到包,也无报错,务必加
sudo -
容器或命名空间隔离:若服务跑在 network namespace 中,需先
sudo nsenter -n -t $PID -- tcpdump -i eth0
实用组合:边抓边验证是否选对了接口
别等抓完再怀疑——边抓边交叉验证:
- 开两个终端:
终端1:sudo tcpdump -i eth0 -c 5 icmp -nn
终端2:ping -c 3 10.10.10.10(确保目标可达且走 eth0) - 对比不同接口:
sudo tcpdump -i eth0 -c 3 port 22 -q &sudo tcpdump -i eth1 -c 3 port 22 -q &
然后 ssh 连自己,看哪个终端输出了包
抓包本身不难,难的是让眼睛和命令对上同一张网卡。确认接口 → 检查状态 → 验证路径 → 小量测试,四步下来基本不会错。











