kvm虚拟机网桥配置失败,核心原因集中在网卡配置文件、NetworkManager服务冲突和虚拟网桥设备未持久化这三类问题上,按顺序排查并修正后,网桥能正常启用。
网桥配置失败前,先定位症状发生在哪个层面
很多人一上来就改 /etc/sysconfig/network-scripts/ 下的配置文件,改完重启宿主机发现网桥没起来,虚拟机连不上外网,其实kvm网桥配置失败有几种典型表现,先对号入座能省不少时间。
同网段通不了,但宿主机能上网
这种情况最迷惑,宿主机IP能通,虚拟机通过 virsh 启动后获取不到IP,或者同网段其它机器ping不到虚拟机,问题一般出在 br0没有继承物理网卡的IP,或者物理网卡和br0被同时分配了IP。
重启宿主机后网桥消失
配置当时是好的,brctl show 能看到br0,虚拟机也正常,重启之后br0不见了,网络恢复成物理网卡直连,这类问题通常因为 NetworkManager接管了物理网卡,或者配置文件的 ONBOOT 和 BRIDGE= 参数没配对。
虚拟机启动报bridge设备不存在
启动虚拟机时提示 bridge br0 does not exist,说明libvirt找不到对应的网桥设备,这种情况要去 /etc/libvirt/qemu/networks/ 目录下检查XML定义文件,或者重新 virsh net-define 导入。
kvm网桥配置失败排查顺序,从物理网卡开始逐层查
行业共识认为,大部分kvm网桥配置失败都是配置文件和系统服务打架导致,不是虚拟化本身的问题,按下面的顺序排查,基本不会漏。
第一步,确认物理网卡名和驱动状态
先记住你宿主机用的是哪张物理网卡,运行 ip addr 查看网卡列表,一般服务器可能是 eno1、 ens3 或 eth0,笔记本可能是 wlan0 但kvm虚拟机不建议走无线网卡做网桥。
确认网卡处于up状态后,看内核模块是否加载:
lsmod | grep bridge
如果没有输出,执行 modprobe bridge 加载桥接模块,然后把加载操作写入系统启动文件,/etc/modules-load.d/bridge.conf 里加一行 bridge,不然重启内核模块不会自动加载。
第二步,检查NetworkManager是否在干扰
CentOS 7及以上版本,RHEL系系统,NetworkManager默认接管所有网络设备,kvm网桥配置失败的场景里,相当一部分是NetworkManager和手动网桥配置冲突。
查看当前网卡被谁管理:
nmcli dev status
如果物理网卡显示 connected
且状态被NetworkManager管理,但你又在 /etc/sysconfig/network-scripts/ 里手动配置了bridge,两边会争抢网卡的MAC地址和IP地址。
解决办法有两种:
- 在
/etc/sysconfig/network-scripts/ifcfg-物理网卡里加NM_CONTROLLED=no - 直接停用NetworkManager,用network服务替代
第三步,检查配置文件是否写对了对应关系
网桥配置说白了是两层关系:
- 物理网卡变成网桥的成员端口,不配置IP
- br0设备继承原物理网卡的IP配置
用vim打开物理网卡配置文件,核对这几个参数:
TYPE=Ethernet BOOTPROTO=none ONBOOT=yes BRIDGE=br0 NM_CONTROLLED=no
再打开br0的配置文件:
TYPE=Bridge BOOTPROTO=static IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 ONBOOT=yes NM_CONTROLLED=no
两个文件都改好后,重启网络服务生效:
systemctl restart network
重启后跑一遍 ip addr show br0,看到IP就说明通了。
场景化处理方案,常规配置、多网桥和KVM重启后网桥失效
场景一,CentOS 7/8用传统network服务配置kvm网桥
配置命令本身不复杂,但容易出错在先建网桥再绑端口的操作顺序上,网桥必须存在,物理网卡才能加入网桥,用脚本批量执行会更快:
# 停掉NetworkManager对物理网卡的管理 systemctl stop NetworkManager # 创建网桥 ip link add name br0 type bridge ip link set br0 up # 把物理网卡加入网桥,这里注意网卡名要替换成实际的eno1 ip link set eno1 master br0 ip addr del 192.168.1.100/24 dev eno1 ip addr add 192.168.1.100/24 dev br0 ip route add default via 192.168.1.1 dev br0
这套命令立即生效,能快速测试网桥是否正常,测通了再去改配置文件做持久化,如果这套命令执行时提示操作不支持,检查内核是否支持VLAN过滤,老版本内核可能会出现 Operation not supported。
场景二,多张网卡配置多个网桥隔离业务流量
比如一台宿主机有两张物理网卡,分别接内网和外网,想做到业务隔离,需要建两个网桥,不少人在这个场景里卡住,因为第二个网桥的配置在系统里总是被重置,原因在于NetworkManager又把手伸到了第二张网卡上。
建议在 /etc/NetworkManager/NetworkManager.conf 的 [main] 段加上:
plugins=ifcfg-rh no-auto-default=eno2,eno3
这样NetworkManager就不会自动添加新网卡,避免出现 virbr0 和其它物理网桥抢路由的情况,注意默认libvirt会创建一个
virbr0的NAT网桥,用不到就删掉它:
virsh net-destroy default virsh net-undefine default systemctl restart libvirtd
场景三,Ubuntu系统用netplan配置kvm网桥,ubuntu kvm 网桥配置的常见错误
Ubuntu 18.04以后默认用netplan管理网络,很多人拿CentOS的思维去改/etc/network/interfaces,发现重启后配置被覆盖掉,这就是kvm网桥配置失败的一个典型坑。
在 /etc/netplan/01-netcfg.yaml 里写:
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: no
bridges:
br0:
interfaces: [enp3s0]
dhcp4: no
addresses: [192.168.1.100/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [114.114.114.114, 8.8.8.8]
执行 netplan apply 前先 netplan generate 测试语法,yaml文件缩进错误是网桥配置失败里很常见的低级问题。
场景四,kvm重启后网桥失效的专门排查
重启后网桥没了的案例,绝大多数和NetworkManager重新接管物理网卡有关。
# 查看每次开机后NetworkManager的控制状态 systemctl status NetworkManager
如果确认systemd的network服务已经启用,但是NetworkManager还在运行,那么即使你写了 NM_CONTROLLED=no,部分新版本系统依然会强制接管,直接的解决办法是彻底禁用NetworkManager:
systemctl disable NetworkManager systemctl enable network systemctl restart network
另外检查一下 /etc/sysconfig/network 里的 HOSTNAME 和网关配置是否正确,部分启动顺序问题源于主机名解析失败导致network服务没有完成全部脚本执行。
网桥配置失败后的验证清单和常用检测命令
配置好网桥后,别急着启动虚拟机,先在宿主机上验证一遍,下列列表按顺序执行,全部通过才算真正配置成功:
ip addr show br0,确认br0有IP地址且状态为UPbrctl show br0,确认物理网卡已经作为端口加入ping -c 3 网关IP,验证二层三层都通arp -n,查看网关MAC地址是否从网桥端口学到- 在另一台机器上ping这台宿主机,确认外部设备能访问宿主机
virsh net-list --all,确认没有多余的NAT网桥干扰
如果br0的IP地址能ping通但虚拟机内部不通,检查iptables是否拦了转发流量,很多情况下宿主机防火墙开着forward默认拒绝,需要在 /etc/sysctl.conf
里加 net.ipv4.ip_forward = 1,然后执行 sysctl -p,同时检查libvirt的虚拟网络防火墙禁用状态:
virsh net-edit default
删除里面的 <forward mode='nat'/> 相关配置,或者直接不用default网络,把虚拟机网卡XML指定到br0上。
kvm网桥比NAT模式好在哪,什么时候不要用网桥
平时很多人纠结kvm网桥和ovs哪个好,其实在单机小规模场景下,Linux bridge完全够用,要理解这个问题,先明白网桥模式的定位,桥接模式相当于把虚拟机变成和宿主机平级的一台物理设备,直接暴露在局域网环境中,NAT模式则是宿主机作为路由器,虚拟机躲在后面。
当你的业务有这些特征时,网桥做不过来了:
- 需要精细的流量监控,按虚拟机做限速和QoS
- 需要把VM的流量镜像到分析设备上
- 多台宿主机之间做VLAN扩展,需要支持VXLAN隧道
这个时候考虑Open vSwitch更合适,但是日常跑几个开发测试虚拟机,Linux网桥的性能损耗可以忽略不计,br0 配上就完事了。
要注意的是,无线网卡不适合做网桥,因为802.11协议层不支持多MAC地址透明桥接,如果你笔记本电脑上装了KVM,想用无线网卡做网桥,大概率会遇到虚拟机频繁断流的问题,还是换NAT模式靠谱。
配置过程中的高频翻车点,集中答疑
问题一,ip link set网卡加入网桥后宿主机断网,怎么回滚?
执行命令后如果SSH断了,说明步骤顺序搞错了,回滚命令简单粗暴:
# 在物理终端上执行,或者通过IPMI进入服务器 ip link set eno1 nomaster ip addr del 192.168.1.100/24 dev br0 ip addr add 192.168.1.100/24 dev eno1 ip link set br0 down ip link del br0
然后重启network服务恢复原状,注意执行顺序,先恢复IP再删网桥,不然中间有一段时间网络完全断开。
问题二,br0配置好了但虚拟机桥接不上,宿主机能ping通网关
宿主机能ping通网关只说明宿主机本身的三层网络是通的,虚拟机连不上br0,跑一下 virsh dumpxml 虚拟机名 看interface段的type是不是bridge,source bridge名字是不是br0,手动创建虚拟机时经常默认生成的是 network='default',需要改成 network='br0' 并指定 type='bridge'。
问题三,启动虚拟机时提示Could not open /dev/vhost-net
这个不是网桥配置问题,是宿主机的vhost_net内核模块没加载,vhost加速不可用,执行 modprobe vhost_net 然后加进启动加载文件即可,和网桥配置失败是两码事,但症状上容易被混淆。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/760801.html





