我正在尝试让虚拟机运行并正常工作,以便我的路由器可以将高端口转发到其 SSH,从而允许互联网上的某人连接到虚拟机。我熟悉如何使这部分正常运行。
我首先尝试了桥接网络。这样,客户机就无法获得 IP 地址。如果我手动在客户机上设置 IP 地址,那么客户机可以 ping 通 Internet 地址,但 TCP 连接不起作用。这很奇怪。
如果我将其设置为 NAT 网络,那么它会获得一个 IP 地址并且网络可以正常工作,但我无法使 qemu 端口转发正常工作。有趣的旁注:NAT 过去常常从包含主机 (192.168.122.0/24) 上的 virbr0 网络范围为客户机分配 IP 地址,现在它分配一个来自完全不同的网络 (10.0.2.0/24) 的地址,而我在 libvirt 主机上的任何地方都看不到这个地址。但我可以从虚拟机成功进行出站连接,所以这只是一个好奇心,而不是一个真正的问题。
我更喜欢桥接网络,但如果我可以让端口转发与 NAT 协同工作,那么这也是一个可以接受的解决方案。
libvirt 主机是 Ubuntu Server 22.0.4,网卡 eno1 包含在 br0 中,IP 地址在 br0 上。当我将客户机设置为桥接网络时,我将其连接到 br0。该主机上的桥接似乎在 libvirt 之外完美运行。它运行的是 libvirt 版本 8.0.0-1ubuntu7.2 和 qemu 版本 1:6.2+dfsg-2ubuntu6.4。
来宾是 Ubuntu Server 20.04。
编辑:桥梁布局添加自评论:
elyograg@smeagol:~$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.168b32b94b55 yes eno1
eno2
vnet0
docker0 8000.0242aa9c3cdf no
virbr0 8000.525400728c3a yes
答案1
通过将这一行添加到 sysctl 配置并使用sysctl -w
它立即更改它,可以解决这个问题:
net.bridge.bridge-nf-call-iptables = 0
但后来我发现使用桥接网络会破坏我需要的 ucarp。所以我摆脱了 br0,并弄清楚了如何使用 libvirt 钩子将主机端口转发到 NAT 模式下 VM 上的端口 22,这就是我希望 VM 使用桥接网络的全部原因——使其可以在 libvirt 主机之外访问。
现在我使用的是 team0 接口,它也无法立即与 ucarp 配合使用。添加ifup team0:ucarp
到 /etc/rc.local 解决了这个问题。当一切恢复正常后,我将再次尝试使用 br0 ifup br0:ucarp
。