在NAT后面的libvirt中更改虚拟机的发件人IP

我有一个服务器与我自己的公共/ 28 IPv4networking。

在这个服务器上,我有一些vServer,用KVM / libvirt完成。 这些vServer与一个虚拟networking连接,NAT到互联网。 每个vServer都有一个私有地址(192.168.xy / 24),并不是每个vServer都应该获得一个公有IP地址。

主机将公共IP路由到其特定的vServer,这对于传入的连接非常有用。

我的问题:从vServer的传出连接,他们从主机获取发件人IP,而不是他们的公共。 有什么办法可以在libvirt中为vServer设置一个公共的发送者IP?

我已经search了ServerFault,但没有find任何东西。 但我不得不承认,我可能不知道这个最好的search条件。

要在虚拟networking上设置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的出站stream量将获得<public ip>的源IP地址