我为我的 KVM 虚拟机创建了一个桥接接口:
ip link add name br0 type bridge
ip addr add 172.20.0.1/24 dev br0
ip link set dev br0 up
我创建了 KVM 虚拟机:
virt-install --name $VM_NAME1 --network=bridge:br0,mac=$VM_MAC1
virt-install --name $VM_NAME2 --network=bridge:br0,mac=$VM_MAC2
现在,我想授予虚拟机 Internet 访问权限:
brctl addif enp3s0 br0
enp3s0 是我的主接口。一旦我运行此命令,我的主机就会失去其 IP 和对 Internet 的访问权限。即使我给它一个 IP,问题仍然存在:
dhclient enp3s0
主机和虚拟机都无法访问互联网。
答案1
当您将主机以太网控制器添加到网桥br0
(连接到虚拟机)时,实际上是在网络上创建了两个新设备(两个具有新 MAC 地址的设备),而不是旧设备。在这种情况下,您的网桥和虚拟机应该各自获得一个新 IP。现在棘手的部分是您的 ISP/托管公司希望您的 MAC 与您的物理以太网控制器的 MAC 保持一致。当您启用网桥时,您的 ISP 无法识别新设备,从而导致无法连接互联网。
您需要的是 NAT,这样您的虚拟机将使用主机的 IP 地址来访问互联网。您可以使用以下命令进行设置:
ip link add name br0 type bridge
ip addr add 172.20.0.1/24 dev br0
ip link set dev br0 up
sysctl -w net.ipv4.ip_forward=1
iptables --table nat --append POSTROUTING --out-interface enp3s0 -j MASQUERADE
iptables --insert FORWARD --in-interface br0 -j ACCEPT
此后,您应该能够从虚拟机访问互联网(您不需要运行brctl
)
答案2
我想您可能会发现最简单的解决方案是不将您的 NIC 添加到桥接器,而是使用转发和伪装。
换句话说,做类似的事情:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE