如何在Ubuntu系统中桥接VLAN子接口?
如何在Ubuntu系统中桥接VLAN子接口?
看起来你已经在Ubuntu上折腾了桥接和VLAN子接口,但把VLAN子接口加入桥后就丢了连通性,我来帮你拆解问题所在,以及给出正确的操作思路。
问题的核心原因
你之前的操作犯了一个典型的二层配置冲突:当把物理接口eth0加入**普通桥br0**后,桥会接管eth0上的所有二层流量,包括带VLAN标签的包;而你在eth0上单独创建vlan.10子接口,是让内核对eth0上的VLAN10标签包做剥离处理。两者的流量逻辑完全冲突,导致数据包的转发路径混乱,最终出现你看到的“ARP回复能收到,但ping发不出去”的奇怪现象。
正确的操作方案:使用VLAN-aware桥
Ubuntu的内核支持VLAN感知型桥接(也就是带802.1Q过滤的桥),这才是桥接VLAN子接口的正确姿势。步骤如下:
1. 清理之前的错误配置
先把之前的桥和VLAN子接口都删掉,避免残留影响:
# 如果已经把vlan.10加入桥,先移除它 sudo ip link set dev vlan.10 nomaster # 删除VLAN子接口 sudo ip link delete vlan.10 # 把eth0从旧桥里移除 sudo ip link set dev eth0 nomaster # 删除普通桥br0 sudo ip link delete br0
2. 创建并配置VLAN-aware桥
# 创建桥时直接启用VLAN过滤功能 sudo ip link add name br0 type bridge vlan_filtering 1 # 启动桥接口 sudo ip link set dev br0 up # 把物理接口eth0加入桥 sudo ip link set dev eth0 master br0 sudo ip link set dev eth0 up
3. 配置桥的VLAN规则
接下来要定义eth0在桥里的VLAN角色:
- 如果eth0是Trunk口(允许VLAN10的流量通过):
# 允许VLAN10的流量在eth0上传输 sudo bridge vlan add dev eth0 vid 10
- 如果需要让主机本身也能访问VLAN10的网络,给桥创建VLAN子接口:
# 基于桥br0创建VLAN10子接口 sudo ip link add link br0 name br0.10 type vlan id 10 # 启动子接口 sudo ip link set dev br0.10 up # 配置IP地址 sudo ip addr add 192.168.0.100/24 dev br0.10 # 设置默认路由(如果需要访问外网) sudo ip route add default via 192.168.0.1 dev br0.10
解释你之前遇到的奇怪现象
你之前把vlan.10加入普通桥后,桥会完全接管eth0的二层转发:
- ARP请求被桥直接从
eth0以无VLAN标签的方式发送,而HostB只接收带VLAN10标签的包——但为什么ARP回复能收到?因为HostB回复的带标签包被vlan.10子接口捕获了(此时子接口还在工作),所以ip neigh里能看到HostB的条目。 - 但后续的ping请求是由桥来转发的,它依然从
eth0发无标签包,HostB根本不识别这个流量,自然不会回复。
关于流量控制的需求
你提到想给特定VLAN的流量做限速(用netem),VLAN-aware桥完全能满足这个需求:你只需要把tc qdisc挂在桥的VLAN子接口(比如br0.10)上,所有进出VLAN10的流量都会经过这个接口,不需要复杂的分类规则。比如:
# 给VLAN10的流量加100ms延迟和1%丢包 sudo tc qdisc add dev br0.10 root netem delay 100ms loss 1%
额外注意事项
- 可以通过
cat /sys/class/net/br0/bridge/vlan_filtering确认VLAN过滤是否启用,返回1就是正常启用。 - 绝对不要同时在物理接口上创建VLAN子接口,又把物理接口加入普通桥——这会让内核的二层流量处理逻辑彻底混乱。
备注:内容来源于stack exchange,提问作者Daladim
相关产品推荐
相关产品推荐

