linux kvm虚拟机直连物理局域网必须手动创建网桥(如br0)并绑定物理网卡,禁用virbr0;因virbr0是nat网桥、不连物理网卡、仅提供192.168.122.x私网地址且含snat规则,无法实现外网直连。

Linux KVM 虚拟机要直连物理局域网、获取独立 IP 并被其他设备直接访问,必须配置桥接网络——核心是手动创建一个 Linux 网桥(如 br0),把物理网卡“交出去”作为它的从属端口,再把 IP 地址配在网桥上,而不是物理网卡本身。
为什么不能直接用 virbr0?
virbr0 是 libvirt 默认创建的 NAT 网桥,自带 DHCP 和 SNAT 规则,只提供 192.168.122.x 私网地址。它不连接任何物理网卡,虚拟机无法获得真实局域网 IP,外网也无法直连。强行往 virbr0 添加物理口或修改其 IP,极易导致宿主机断网、SSH 中断。
配置桥接的关键步骤
无论用命令行临时验证还是写入配置文件长期生效,这三步缺一不可:
- 清空物理网卡 IP:执行
sudo ip addr flush dev enp0s3(将enp0s3替换为你的实际网卡名),否则后续绑定会失败或引发 ARP 冲突 - 创建并启用网桥:
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,然后给br0配同网段地址,例如sudo ip addr add 192.168.1.100/24 dev br0
让配置重启后依然有效
临时命令在 reboot 后失效,生产环境需持久化:
-
Ubuntu 18.04+/Debian 11+:编辑
/etc/netplan/*.yaml,在bridges下定义br0,指定interfaces: [enp0s3],IP 地址写在br0节点下 -
RHEL/CentOS/Fedora:推荐用
nmcli—— 先删旧连接nmcli con delete enp0s3,再建桥主连接和 slave,最后nmcli con up br0 -
旧版 Debian/Ubuntu:修改
/etc/network/interfaces,用iface br0 inet static块,含bridge_ports enp0s3和bridge_stp off
验证是否成功
完成配置后,重点检查三项:
- 运行
ip a:应看到br0持有正确 IP,而enp0s3只有UP状态,无inet行 - 运行
bridge link:输出中enp0s3应在br0下且状态为FORWARDING - 测试连通性:宿主机 ping 得通网关和同网段设备;KVM 虚拟机设置同网段静态 IP 或开启 DHCP 后,能直接 ping 通宿主机和外网
KVM 虚拟机里怎么用这个桥?
在创建或编辑虚拟机时,指定桥接设备即可:
- 命令行安装:
virt-install ... --network bridge=br0,model=virtio - XML 配置(
virsh edit vmname):<interface type="bridge"><source bridge="br0"></source><model type="virtio"></model></interface>
- 图形界面(virt-manager):网络选项选 “Bridge device: br0”,模型选
virtio











