Linux下能否拆分NIC流量至处理所有带标签VLAN与无标签流量的接口
需求可行性说明
完全可以实现。
首先要明确你熟悉的「父接口名.VLANID」类VLAN子接口无法满足这个需求:这类子接口的设计逻辑是收到对应VLAN ID的带标签包后,剥离VLAN标签再向上层传递,且每个子接口只能绑定单个固定VLAN ID,既没法实现“一个接口承接所有任意VLAN标签的包”,也会因为提前剥标签导致接口无法感知包原本带VLAN标记的状态。
要实现按“是否携带VLAN标签”的规则拆分流量,需要通过Linux内核流量管控、虚拟网桥的机制完成。
方案1:基于tc + IFB虚拟接口分流(轻量化快速部署)
实现原理
利用tc的u32过滤器直接匹配以太网帧头的类型字段:带802.1Q VLAN标签的帧,在二层头第12字节位置的类型值固定为0x8100;无标签帧的同位置值为上层协议类型(如IPv4的0x0800、ARP的0x0806)。通过匹配这个字段,把两类流量分别重定向到两个独立的虚拟接口。
操作步骤
- 加载IFB内核模块,创建并启用两个用于承接拆分流量的虚拟接口:
modprobe ifb numifbs=2 ip link set dev ifb0 up ip link set dev ifb1 up
- 给物理源网卡(示例为
eth0)添加入口流量管控规则:- 先启用物理网卡的入口qdisc:
tc qdisc add dev eth0 ingress
- 匹配所有带VLAN标签的流量,重定向到
ifb0(该接口专门承接所有带标签的包):
tc filter add dev eth0 parent ffff: protocol 802.1Q prio 1 u32 \ match u16 0x8100 0xffff at 12 \ action mirred egress redirect dev ifb0
- 匹配所有剩余的无标签流量,重定向到
ifb1(该接口专门承接所有无标签的包):
tc filter add dev eth0 parent ffff: protocol all prio 2 u32 \ match u16 0x0000 0x0000 at 0 \ action mirred egress redirect dev ifb1
配置完成后即可实现流量拆分:所有从eth0进入的带任意VLAN标签的流量都会转发到ifb0,无标签流量全部转发到ifb1。
方案2:基于Linux Bridge的VLAN分流(可扩展桥接功能)
如果后续需要配合VLAN trunk、端口隔离等桥接能力,可以用开启了VLAN过滤功能的Linux网桥实现分流。
操作步骤
- 创建带VLAN过滤的网桥,将物理网卡
eth0作为桥接端口加入(注意不要给eth0配置IP地址):
ip link add br0 type bridge vlan_filtering 1 ip link set eth0 master br0 ip link set br0 up
- 创建两个虚拟dummy接口,分别作为承接带标签流量、无标签流量的端点,加入网桥:
ip link add vlan_all type dummy ip link add untag_only type dummy ip link set vlan_all master br0 ip link set untag_only master br0 ip link set vlan_all up ip link set untag_only up
- 配置网桥VLAN规则实现分流:
- 给物理端口
eth0配置PVID为100:无标签进入eth0的包会被桥内部标记为VLAN 100,带标签的包保留原有VLAN ID:
- 给物理端口
bridge vlan add dev eth0 vid 100 pvid untagged
- 配置
untag_only端口仅允许VLAN 100的无标签包通行,这样只有被eth0打上VLAN100标记的无标签包会转发到这个接口:
bridge vlan add dev untag_only vid 100 pvid untagged
- 配置
vlan_all端口允许VLAN 1-4094的所有带标签包通行,且不允许PVID100的无标签包进入,这样所有带VLAN标签的包都会转发到这个接口:
bridge vlan add dev vlan_all vid 1-4094 bridge vlan add dev vlan_all vid 100 pvid no
注意事项
- 上述两个方案默认只拆分物理网卡的入口流量,如果需要让两个虚拟接口的回包能正常从物理网卡发出,需要在对应的虚拟接口上配置反向tc重定向规则,把出口流量回注到物理网卡。
- 如果网卡开启了硬件VLAN卸载功能,可能会在内核匹配前就剥离VLAN标签导致规则失效,可通过
ethtool -K eth0 rx-vlan off tx-vlan off临时关闭硬件卸载后测试。
内容的提问来源于stack exchange,提问作者ne20002
相关产品推荐
相关产品推荐

