tcpdump vlan 过滤

过滤带 802.1Q 标签的流量:vlan <ID> 匹配指定 VLAN,不带参数匹配任意 VLAN 标签帧;抓包口对接 Trunk 时先确认标签是否保留。

VLAN 抓包要点

带 802.1Q 标签的帧在原以太网头之后插入 4 字节:TPID 0x8100、3 位优先级、1 位 DEI、12 位 VID。tcpdump 的 vlan 原语既做匹配,也会把后续字段的解析偏移后移,所以 vlan 10 and tcp port 443 才会去匹配标签之后的 TCP 头。抓包口必须是 Trunk 口或镜像口,Access 口发出的帧已被交换机去掉标签。

基本信息

适用平台Linux / BSD 上的 tcpdump,依赖 libpcap 的 VLAN 解封装
语法vlan [<ID>] [and <内层条件>]
匹配任意标签只写 vlan 而不带 ID
配合选项-e 打印帧头、-nn 不解析名字
双层标签QinQ 需要连续写两个 vlan 原语

典型使用场景

  • Trunk 口抓包确认某 VLAN 的流量是否真的经过该链路
  • 定位跨 VLAN 访问失败:先证明标签存在,再查三层路由
  • 验证交换机 VLAN 划分是否正确,比对双方口径
  • 排查 VLAN 内广播或组播异常

常用示例

常用示例
tcpdump -i eth0 -nn -e vlan 10 -c 20                          # 带帧头观察标签
tcpdump -i eth0 -nn 'vlan 10 and host 10.10.0.9'              # 指定 VLAN 内的主机
tcpdump -i eth0 -nn 'vlan and port 53'                        # 任意标签内的 DNS
tcpdump -i eth0 -nn -e 'vlan and vlan' -c 5                   # QinQ 双层标签

现象对照排查

现象可能原因处理办法
抓不到任何带标签帧抓包口是 Access 口,标签已被剥离换到 Trunk 口或镜像口重抓
vlan 条件命中但看不到内层协议QinQ 双层标签只写了一个 vlan再补一个 vlan 原语
能抓到期盼的 IP 流量但 vlan 条件不命中抓包点在标签剥离之后直接按 IP 或端口过滤即可
只看到单播看不到广播交换机侧 IGMP snooping 或抑制广播先在链路侧确认转发策略
主机网卡上抓包时标签通常已被内核处理,此时用 vlan 原语反而抓不到,按 IP 过滤更直接。
部分虚拟化与容器网络会在数据面剥离标签后再交给抓包点,是否可见取决于实现,不要仅凭抓包结果判断 VLAN 未配置。

进阶要点

  • 抓包前先确认链路两端对标签的处理方式:Trunk 保留标签,Access 剥掉标签
  • 标签里的优先级字段参与队列调度,排查语音视频质量时可一并查看
  • 同一物理口承载多 VLAN 时抓包会拿到全部流量,用 vlan 原语按需收敛
  • 虚拟交换机与网卡卸载会影响标签可见性,跨设备结论要互相校验
  • 长期观察某 VLAN 时优先用镜像口并落盘,避免影响生产链路
交换机上做镜像时注意镜像口的带宽是否够用,否则可能丢包导致抓到的样本不完整。

易错点

  • 在 Access 口验证 VLAN 配置,抓不到标签就断言「VLAN 没配」
  • 忽略 vlan 原语会移动内层偏移这一特性,导致端口条件与预期不符
  • QinQ 场景只匹配一层标签,内层匹配全部失效

数据来源与参考

  • man 8 pcap-filter(vlan 原语)
  • IEEE 802.1Q
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌