nmcli 不支持直接将 vlan 子接口(如 eno1.100)作为 bridge-slave 使用,必须先用 nmcli con add type vlan 创建并启用 vlan 接口,再将其添加为网桥 slave;否则因 nm 未托管该 vlan 设备导致启动失败、mac 学习异常或 dhcp 失效。

nmcli 本身不支持直接在 bridge-slave 上叠加 VLAN 子接口(比如 eno1.100),必须先创建 VLAN 接口,再将其作为 slave 加入网桥。 这是多数人卡住的第一步——试图用 nmcli con add type bridge-slave ifname eno1.100 直接挂载 VLAN 子口,结果报错或无法获取 IP。
为什么不能直接把 VLAN 子接口当 bridge-slave 用
NetworkManager 的 bridge-slave 类型只接受物理接口(如 eno1、ens3)或 bond 接口(如 bond0),不识别已配置的 VLAN 设备(eno1.100)。VLAN 子接口属于虚拟设备,需由 NetworkManager 显式管理其生命周期,否则桥接后 MAC 学习、STP 状态、甚至 DHCP 都会异常。
- 错误现象:
nmcli con add type bridge-slave ifname eno1.100 master br-vlan执行成功但nmcli con up失败,日志中出现device not found或slave not ready - 根本原因:NetworkManager 默认不自动激活未托管的 VLAN 设备;
eno1.100若未通过 nmcli 创建,它只是内核存在、NM 不感知 - 正确路径:VLAN 接口必须用
nmcli con add type vlan创建,并设置connection.autoconnect yes,再作为 slave 加入桥
创建 VLAN + 网桥的完整命令链(以 VLAN ID 100、桥名 br-vlan 为例)
顺序不能颠倒:先 VLAN,再桥,最后绑定。每步都依赖上一步的连接名(con-name)。
- 创建 VLAN 接口(假设物理口是
eno1):nmcli con add type vlan con-name vlan100 ifname eno1.100 dev eno1 id 100 - 关闭原物理口连接(避免 IP 冲突):
nmcli con down "Wired connection 1"(名称按实际查nmcli con show) - 创建网桥:
nmcli con add type bridge con-name br-vlan ifname br-vlan - 将 VLAN 接口设为桥的 slave:
nmcli con add type bridge-slave con-name br-vlan-slave-vlan100 ifname eno1.100 master br-vlan - 给网桥配 IP(DHCP 或静态):
nmcli con mod br-vlan ipv4.method auto(或manual+ipv4.addresses 192.168.100.10/24+ipv4.gateway 192.168.100.1) - 启用网桥:
nmcli con up br-vlan
关键参数与避坑点
生产环境常因忽略以下细节导致虚拟机无法通信或丢包:
-
bridge.stp:KVM 虚拟机直连时建议关掉:nmcli con mod br-vlan bridge.stp no(否则新 VM 启动可能触发 STP forwarding delay) - VLAN 接口必须启用 autoconnect:
nmcli con mod vlan100 connection.autoconnect yes,否则重启后 VLAN 不起来,桥就断了 - 若物理口已绑定 bond(如
bond0),则 VLAN 应建在 bond 上:nmcli con add type vlan con-name vlan100 ifname bond0.100 dev bond0 id 100,再把bond0.100加入桥 - 检查是否生效:
ip link show master br-vlan应列出eno1.100;bridge fdb show br-vlan | grep self应看到 VLAN 接口的 MAC 条目
验证虚拟机能否真正走通 VLAN 桥接
KVM 下虚拟机网络配置容易漏掉一点:libvirt 默认不识别自定义桥名,需显式指定 <source bridge="br-vlan"></source>,且确认桥已 up。
- 检查桥状态:
nmcli con show br-vlan | grep -E "(state|general.state)"必须是activated - virsh XML 中必须包含:
<interface type="bridge"><source bridge="br-vlan"></source></interface>(不是network类型) - 虚拟机内执行:
ip a看是否拿到预期 VLAN 子网 IP;arping -I eth0 192.168.100.1测试二层可达性(比 ping 更早暴露桥转发问题) - 若 arping 通但 ping 不通,大概率是防火墙或
ipv4.forwarding=0,而非桥配置问题
最易被忽略的是 VLAN 接口和桥的启动顺序依赖——NetworkManager 不会自动拉起依赖项,nmcli con up br-vlan 不会顺带 up vlan100,必须确保 vlan100 已 autoconnect 且当前处于 activated 状态。建议写个简短检查脚本,每次变更后跑一遍 nmcli -t -f NAME,DEVICE,STATE con show | grep -E "(vlan100|br-vlan)"。











