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 时优先用镜像口并落盘,避免影响生产链路
交换机上做镜像时注意镜像口的带宽是否够用,否则可能丢包导致抓到的样本不完整。