tcpdump原生支持VLAN ID过滤,使用“vlan <id>”语法即可匹配,底层由BPF自动识别802.1Q标签;COS需通过ether[14] & 0xe0 == 0xa0按偏移位匹配;标签是否可见取决于网卡是否透传VLAN。

tcpdump 直接支持基于 VLAN ID 的过滤,无需额外解析或复杂计算,只要网卡能透传 802.1Q 标签(即未被内核剥离),就能准确捕获带指定 VLAN 标签的帧。
基础 VLAN ID 过滤
使用 vlan <id> 即可匹配对应 VLAN 的数据包。该语法是 tcpdump 原生支持的关键字,底层由 BPF 自动识别 802.1Q 标签位置(以太网帧中 MAC 后、类型字段前的 4 字节)。
- 捕获所有属于 VLAN 100 的报文:
sudo tcpdump -i eth0 vlan 100 - 同时捕获多个 VLAN:
sudo tcpdump -i eth0 'vlan 100 or vlan 200'(注意加单引号防 shell 解析) - 组合 IP 条件,只看 VLAN 100 中来自 192.168.5.10 的流量:
sudo tcpdump -i eth0 'vlan 100 and src host 192.168.5.10'
过滤带 COS(优先级)的 VLAN 报文
tcpdump 没有直接的 cos 关键字,但可利用 VLAN 标签结构中的优先级字段(3 bit,位于标签第 1 字节高 3 位)。VLAN 标签格式为:[TPID=0x8100][TCI: prio(3b)|DEI(1b)|VID(12b)][EtherType],其中 TCI 起始于以太网帧偏移 14 字节(源 MAC 6B + 目标 MAC 6B + TPID 2B)。
- COS=5 对应二进制
101xxx,十六进制掩码为0xe0(即 11100000),目标值为0xa0(10100000) - 命令:
sudo tcpdump -i eth0 'ether[14] & 0xe0 == 0xa0' - 若需同时限定 VLAN ID=100 且 COS=5:
sudo tcpdump -i eth0 'vlan 100 and ether[14] & 0xe0 == 0xa0'
验证 VLAN 标签是否可见
有些系统(如启用了硬件 offload 或某些虚拟交换机)会在内核收包路径中剥离 VLAN 标签,导致 vlan 过滤失效。可通过以下方式确认:
- 加
-e显示链路层头,观察输出中是否含vlan X, p Y字样:sudo tcpdump -i eth0 -e -c 2 - 若看不到 vlan 字样,说明标签已被剥离;此时需在交换机侧配置镜像端口,或改用支持保留标签的接口(如 Linux 的
vlan子接口或禁用rx offload) - 检查 offload 状态:
ethtool -k eth0 | grep vlan,必要时关闭:sudo ethtool -K eth0 rx off tx off
抓包与保存建议
实际排查中常需保存原始帧供 Wireshark 深入分析,注意保留完整帧长和 VLAN 结构:
- 抓全包(避免截断):
-s 0 - 写入文件便于后续分析:
-w vlan100.pcap - 示例完整命令:
sudo tcpdump -i eth0 -s 0 -w vlan100.pcap 'vlan 100 and port 53'(抓 VLAN 100 中的 DNS 流量)

















