kvm桥接网络需手动创建linux网桥(如br0)并绑定物理网卡,而非使用libvirt默认的nat网桥virbr0;因virbr0不连接物理网卡、仅提供192.168.122.x私网地址且含snat规则,无法实现外网直连,误用会导致宿主机断网或虚拟机不可达。

直接说结论:Linux 上 KVM 虚拟机用桥接网络,**不是配 VPC(那是云厂商概念),而是手动建 Linux 网桥(如 br0)并绑定物理网卡**;配置错一步,虚拟机就上不了网,且宿主机可能断网。
为什么不能直接用 virbr0 做桥接?
virbr0 是 libvirt 默认创建的 NAT 网桥,自带 dnsmasq 和 iptables SNAT 规则,只适合内网互通。它不连物理网卡,虚拟机拿到的是 192.168.122.x 地址,外网无法直连——这根本不是桥接,是 NAT。
- 查证命令:
brctl show会显示virbr0下没有物理接口(如eth0或ens33) - 误用后果:改了
virbr0的 IP 或强行加物理口,会导致宿主机丢包、SSH 断连 - 正确做法:新建独立网桥(如
br0),把物理网卡设为它的从属端口
brctl addbr br0 后为什么没 IP、也 ping 不通?
单纯用 brctl addbr br0 创建的网桥是“裸桥”,没 IP、没启动、没路由,就像装好水管但没开水阀。必须做三件事:
- 给网桥配 IP(如果宿主机要通过该网桥管理):
ip addr add 192.168.1.100/24 dev br0 - 启用网桥:
ip link set br0 up - 把物理网卡(如
ens33)加入网桥:brctl addif br0 ens33(注意:执行前确保ens33已down,否则报错Device or resource busy) - 关键遗漏点:物理网卡本身不能再配 IP,否则冲突;原
ifcfg-ens33中要删掉IPADDR、GATEWAY,只留BRIDGE=br0和ONBOOT=yes
CentOS/RHEL 7+ 用 nmcli 配桥接更稳,但要注意顺序
NetworkManager 比传统 ifcfg 更可靠,尤其在桌面环境,但步骤不能颠倒:
- 先删旧连接:
nmcli con delete ens33(否则ens33仍被 NM 管理,桥接后会反复抢 IP) - 再建桥:
nmcli con add type bridge con-name br0 ifname br0 - 配桥参数(DHCP 示例):
nmcli con modify br0 ipv4.method auto - 把物理口加进来:
nmcli con add type bridge-slave con-name br0-slave-ens33 ifname ens33 master br0 - 最后激活:
nmcli con up br0(不是up br0-slave-ens33) - 验证:
nmcli -f bridge,port con show br0看ens33是否列为 port
KVM 虚拟机 XML 里指定桥接,却连不上外网?
常见原因是虚拟机 XML 中用了错误的桥接名,或没选对设备模型:
- 检查
virsh edit vmname,确认<interface type="bridge"></interface>下是<source bridge="br0"></source>,不是virbr0 - 设备模型必须是
<model type="virtio"></model>(性能好、兼容性强),别用e1000或rtl8139(某些镜像驱动不全) - 如果虚拟机启动后
ip a显示无 IP,先确认 guest 内是否启用了 DHCP 客户端(systemctl is-active dhclient或dhcpcd) - 最易忽略的一点:宿主机防火墙(
firewalld)默认会拦截桥接流量,临时关掉测试:systemctl stop firewalld
真正麻烦的从来不是命令记不住,而是物理网卡被 NetworkManager 和 ifconfig 两套机制争抢、桥接后宿主机失联不敢继续操作、或者虚拟机获取到 IP 却无法响应 ARP——这些都得靠 tcpdump -i br0 arp 和 bridge fdb show 才能定位。动手前,先备份原网卡配置,比啥都强。











