必须新建独立网桥(如br0)并绑定物理网卡,清空其ip;virbr0是nat网桥,不连物理网卡、仅服务192.168.122.0/24私网,硬改会导致宿主机断网且虚拟机无法被局域网直连。

直接配 br0 就行,但必须把物理网卡的 IP 清掉、让它只做“端口”,否则宿主机大概率断网,KVM 虚拟机也拿不到局域网 IP。
为什么不能直接改 virbr0
virbr0 是 libvirt 自带的 NAT 网桥,天生不连物理网卡,只服务 192.168.122.0/24 这个私有段。你往它上面硬加物理口、改 IP 或删 SNAT 规则,iptables 和 dnsmasq 很容易冲突,宿主机 SSH 会突然中断,而且虚拟机仍然无法被局域网其他设备直连。
真正要让 KVM 虚拟机像物理机一样上网,就得新建一个独立网桥(比如 br0),并把物理网卡“交出去”——不是共享,是让渡控制权。
用 ip 命令临时创建并验证
适合调试或快速验证,重启即失效,但能立刻看出是否通路:
- 先清空物理网卡 IP:
sudo ip addr flush dev enp0s3(把enp0s3换成你的真实网卡名) - 创建并启用网桥:
sudo ip link add name br0 type bridge && sudo ip link set br0 up - 把物理网卡绑进去:
sudo ip link set enp0s3 master br0 && sudo ip link set enp0s3 up - 给网桥配地址(同局域网段):
sudo ip addr add 192.168.1.100/24 dev br0
执行完检查:ip -br a 应该显示 br0 有 inet,而 enp0s3 只有 UP 没地址;bridge link 应该列出 enp0s3 在 br0 下且状态为 FORWARDING。
不同发行版的持久化配置要点
临时命令一重启就丢,生产环境必须写进系统网络配置:
-
Ubuntu 18.04+ / Debian 11+:编辑
/etc/netplan/*.yaml,在bridges下定义br0,关键字段包括:interfaces: [enp0s3]、addresses: [192.168.1.100/24]、gateway4: 192.168.1.1、nameservers,最后sudo netplan apply -
RHEL/CentOS/Fedora:用
nmcli更稳。先nmcli con down "Wired connection 1"(引号不能少),再nmcli con add type bridge ifname br0 con-name br0,然后nmcli con add type bridge-slave ifname enp0s3 master br0,最后nmcli con mod br0 ipv4.method manual+ 地址/网关/DNS 配置,nmcli con up br0 -
旧版 Debian/Ubuntu(SysVinit):改
/etc/network/interfaces,确保原enp0s3的iface块被注释或删除,新增iface br0 inet static块,含bridge_ports enp0s3、bridge_stp off、address等字段
无论哪种方式,都要确认:物理网卡不再持有 IP,所有流量都经 br0 出入;br0 的 IPv4 method 必须是 manual(DHCP 容易在 NetworkManager 重载时掉线);KVM 虚拟机 XML 或 virt-install 中指定 bridge=br0,不是 network=default。
KVM 虚拟机怎么用这个桥
配置完宿主机的 br0 后,虚拟机网络设置其实很简单,但容易漏掉两个细节:
- 创建新虚拟机时,命令行用:
virt-install --network bridge=br0,model=virtio;XML 中写:<interface type="bridge"><source bridge="br0"></source><model type="virtio"></model></interface> - 虚拟机内部必须设同网段静态 IP 或开启 DHCP——它现在和宿主机平级,直接从你家路由器或局域网 DHCP 服务器获取地址,不是从
virbr0的dnsmasq - 别忘了关掉宿主机防火墙临时测试:
sudo ufw disable(Ubuntu)或sudo systemctl stop firewalld(RHEL),否则可能拦住虚拟机发来的 ARP 或 ICMP
最常被忽略的是:物理网卡名字(如 enp0s3)必须和 ip -br l 输出的第一列完全一致;nmcli 方式下,停用原连接这步跳过,90% 的桥接失败都源于此——不是命令写错,是顺序错了。











