本文由 bet9链接 вт989点сс 编译原创,使用 libvirt 和 QEMU/KVM 设置桥接网络。
问题点
- 宿主机:Ubuntu 24.04 (核心版本6.5.0)
- 虚拟机:Windows 11
- 网路架构:Ubuntu电脑透过乙太网路线直接连到数据机(Modem),数据机还有开Wifi。
使用Virt Manager预设NAT网路下,Windows虚拟机的SMB服务无法被同Wifi网路下的其他装置存取。所以我要建立一个新的虚拟网路桥接器,让Windows虚拟机里面系统跑的SMB服务可以从外部网路存取。
为何要建立新的桥接器?
在你安装Virt Manager之后,Libvirt会在Linux新增一个叫做virbr0的虚拟桥接器(virtual bridge),负责处理虚拟机的网路连线。 virbr0本身是作为NAT,在虚拟机开机后,Libvirrt会再新增一个vnet的界面连到virbr0,此时所有虚拟机位于该虚拟NAT之后,虚拟机可连线到外部网路,宿主机能连线到虚拟机,各个虚拟机之间也可以互相连线,但是无法从外部网路连线到虚拟机。
要让外部网路连线到躲在虚拟NAT背后的虚拟机,是可以透过调整iptable forward规则的方式达成啦,但是规则设定上很麻烦,不如另外弄个完整的桥接器吧,让它使用真正的桥接网路模式(bridged networking)。
Linux的桥接网路可以在多个装置之间转送封包。我们会建立一个新的虚拟桥接器,并把宿主机的实体乙太网路界面连上该桥接器,如此一来就能从外部网路存取虚拟机服务了。
建议不要使用Wifi无线网路装置桥接,否则会多一道建立hostapd的手续。请在有乙太网路的状态下建立桥接器。
配置Libvirt
1.请先 安装QEMU/KVM与Virt Manager。
2.用指令列出所有虚拟网路界面
sudo virsh net-list --all
3.列表应该会看到有名为default的网路界面,装置为virbr0,此为Libvirt自动建立,这就是上面说的NAT模式的虚拟桥接器。
# 範例輸出
Name State Autostart Persistent
----------------------------------------------------
default active yes yes
用NetworkManager建立虚拟桥接器
很多工具都能建立桥接器,比如NetworkManager、Netplan、iproute2、Network Bridge Utilities,还有KDE和GNOME的图形界面。
鉴于很多Linux发行版都用NetworkManager管网路,我们就用附属的nmcli工具来建立桥接器吧。
1.透过sudo nmcli device status指令得知,乙太网路连线的装置(Device)名称为enp0s2,网路连线名称(Name)为乙太網路連線1
# 範例輸出
NAME UUID TYPE DEVICE
乙太網路連線1 b32df45e-3d34-11ef-8781-ebb418880514 ethernet enp2s0
2.透过ip addr得知我的区域IP网段为192.168。
# 範例輸出
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether b0:6e:bf:ca:68:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.102/24 brd 192.168.1.255 scope global dynamic noprefixroute enp2s0
3.新建一个叫做br0的桥接器,关闭STP
sudo nmcli connection add type bridge ifname br0 stp no
4.将enp2s0设定为br0的bridge-slave
sudo nmcli connection add type bridge-slave ifname enp2s0 master br0
5.关闭目前的乙太网路连线。
sudo nmcli connection down "乙太網路連線1"
6.确保它不会自动重新连线
sudo nmcli connection modify "乙太網路連線1" connection.autoconnect no
7.启用刚刚新建的桥接器
sudo nmcli connection up bridge-br0
sudo nmcli connection up bridge-slave-enp2s0
8.用指令sudo nmcli connection show --active检视桥接器状态,确认连线名称(Name)为bridge-br0
# 範例輸出
NAME UUID TYPE DEVICE
bridge-br0 50b8e41e-3d34-11ef-a6b9-13326122fb1e bridge br0
bridge-slave-enp2s0 52dd08d8-3d34-11ef-8017-8fce9b54d32b ethernet enp2s0
9.接着分配固定IP给bridge-br0
sudo nmcli connection modify "bridge-br0" ipv4.addresses "192.168.1.101/24"
10.然后设定bridge-br0使用Google的DNS
sudo nmcli connection modify "bridge-br0" ipv4.dns "8.8.8.8"
11.开机后Windows应该会自动连上网路,并取得一个区域IP。自此之后,Windows的SMB服务就能让同一Wifi下的其他装置存取了