用 tag 参数为端口指定 VLAN ID 即可实现标准 access 模式二层隔离:同 tag 端口互通,跨 tag 端口默认不通,因 MAC 学习、FDB 和广播域均绑定 VLAN ID,VLAN 10 与 20 在 OVS 内部为完全独立二层域。

直接说结论:用 tag 参数为端口指定 VLAN ID,就能在同一个 OVS 网桥上实现二层隔离。这不是“模拟”或“近似”,而是标准 access 模式行为——同 tag 端口可通,跨 tag 端口默认不通。
为什么 ovs-vsctl add-port br0 port1 tag=10 就能隔离?
OVS 内部对每个带 tag 的端口启用 access 模式:入包无标签 → 自动打上该 tag;出包有该 tag → 自动剥离。关键在于,MAC 地址学习、FDB 查表、广播域都绑定在 VLAN ID 上。VLAN 10 和 VLAN 20 在 OVS 内部是两个完全独立的二层域,哪怕共用一个网桥实例,也不会互相学习 MAC 或泛洪广播帧。
常见错误现象:ping 不通但 arping -I veth11 192.168.10.2 能收到 reply —— 这说明 L2 隔离生效了(ARP 是广播,被挡在 VLAN 域内),但你可能忘了给命名空间配 IP 或没启 sysctl -w net.ipv4.ip_forward=1(如果走三层)。
- 必须确保所有参与隔离的端口都显式设置了
tag=N,未设 tag 的端口属于 native VLAN(即 VLAN 0),会和任意带 tag 的端口产生意外互通风险 -
tag值必须是 1–4094 之间的整数,0 和 4095 是保留值,设了会静默失败或行为异常 - 物理网卡(如
ens33)加入网桥时不要加tag,它应作为 trunk 口承载多个 VLAN 流量;否则会把所有进来的包都打上固定 tag,导致上游交换机无法识别
ovs-ofctl dump-flows 看不到流表也隔离?正常
OVS 的 VLAN 隔离是数据面原生能力,不依赖 OpenFlow 流表。当你只用 tag 配置端口,OVS 默认使用 normal action 处理报文,此时转发逻辑由内部 VLAN-aware 转发表驱动,ovs-ofctl dump-flows 输出为空是完全正常的。
只有当你主动下发流表(比如用 ovs-ofctl add-flow)覆盖默认行为时,才会看到条目。例如想让 VLAN 10 和 VLAN 20 通信,才需要手动加 strip_vlan,output:portX 这类规则——这反而是打破隔离,不是实现隔离。
- 别为了“看到流表”而强行加
priority=0,actions=normal,这毫无必要,还可能干扰后续策略注入 - 检查隔离是否生效,优先用
ovs-vsctl list port | grep -A5 -B5 tag确认端口 tag 值,再用tcpdump -i veth11 -e抓包看是否有跨 VLAN 的 ARP 请求漏出
libvirt/KVM 虚拟机怎么接 VLAN?别碰
libvirt 默认的 bridge 类型会绕过 OVS,直连 Linux bridge,导致 tag 配置失效。必须改用 openvswitch 类型,并在 中声明端口属性:
<interface type="openvswitch"><source bridge="ovs-br0"></source><virtualport type="openvswitch"><parameters interfaceid="xxx"></parameters></virtualport><vlan><tag id="20"></tag></vlan></interface>
然后在宿主机上执行:ovs-vsctl set port vnet0 tag=20(vnet0 名字需与 libvirt 创建的 tap 设备一致)。注意:libvirt 不会自动同步 tag,必须手工补这一步,否则虚拟机流量仍走 native VLAN。
- 如果你用
virsh attach-interface动态加网卡,它默认创建的是bridge类型,要先 detach 再用define+ 修改 XML 重装 - Proxmox VE 用户请确认
vmid.conf中网卡配置含bridge: vmbr0且vmbr0是 OVS 网桥;若写成bridge: ovsbr0却没创建该桥,虚拟机会启动失败并报No such device
最容易被忽略的一点:VLAN 隔离只管二层。如果租户虚拟机配了相同网段 IP(比如都用 10.0.10.0/24),即使 VLAN 不同,只要宿主机开了 IP forwarding 并配置了静态路由,三层流量仍可能互通。真正的租户隔离必须配合三层策略(如 network namespace + iptables)或 Neutron 的 router + security group 才算闭环。











