在 NAT 后面的 libvirt 中更改虚拟机的发送方 IP

在 NAT 后面的 libvirt 中更改虚拟机的发送方 IP

我有一台具有自己的公共 /28 IPv4 网络的服务器。

在此服务器上,我有一些使用 KVM/libvirt 完成的 vServer。这些 vServer 连接到虚拟网络,通过 NAT 连接到互联网。每个 vServer 都有一个私有 (192.168.xy/24) 地址,但并非每个 vServer 都应该获得一个公共 IP。

主机将公共 IP 路由到其特定的 vServer,这对于传入连接来说运行良好。

我的问题:在来自虚拟服务器的传出连接中,它们从主机获取发送方 IP,而不是其公共 IP。有没有办法在 libvirt 中为虚拟服务器设置公共发送方 IP?

我已经搜索过 ServerFault,但并没有找到任何东西。但我不得不承认,我可能不知道最好的搜索词。

答案1

要在虚拟网络上设置 NAT,libvirt需要添加一些如下所示的 iptables 规则:

$ iptables -t nat -S
[...]
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
[...]

这些规则中的 MASQUERADE 操作将内部 IP 转换为 NIC 的外部 IP。还有另一个称为 SNAT 的操作,它执行相同的操作,但使用您自己设置的特定源 IP。因此,您可以做的是在您的MASQUERADE规则之前插入一些 SNAT 规则,如下所示:

$ iptables -t nat -I POSTROUTING -s 192.168.1.x ! -d 192.168.1.0/24 -j SNAT --to-source <public ip>
$ iptables -t nat -I POSTROUTING -s 192.168.1.x ! -d 192.168.1.0/24 -p udp -j SNAT --to-source <public ip>:1024-65535
$ iptables -t nat -I POSTROUTING -s 192.168.1.x ! -d 192.168.1.0/24 -p tcp -j SNAT --to-source <public ip>:1024-65535

现在来自 192.168.1.x 的传出流量将获得 <public ip> 的源 ip

相关内容