NAT通过iptables和虚拟接口

我试图实现以下场景:一个VM主机,多个来宾虚拟机 ,每个都有自己的IP地址 (和域)。

我们的服务器只有一个物理接口,所以用途是在eth0上添加虚拟接口 。 为了使我们的情况复杂化,提供者在他们的交换机上使用端口安全 ,所以我不能以桥接模式运行访客接口,因为那么交换机检测到一个“伪造的”MAC地址并且终止了这个接口(永久性的,迫使我打电话这个支持,我敢肯定会让他们第三次有点生气;))。

我的第一个猜测是使用iptables和NAT将所有软件包从一个虚拟接口转发到另一个虚拟接口,但iptables似乎并不喜欢虚拟接口(至less我不能使其正常工作)。 所以我的第二个猜测是使用包的源IP到公共接口。

假设libvirt创build了一个192.168.100.0/24的virbr0networking,而guest虚拟机使用192.168.100.2作为IP地址。

这是我试图使用的: iptables -t nat -I PREROUTING --src public_ip_on_eth0:0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:80

这并没有给我预期的结果(访问服务器超时)。

有没有办法做我想做的事,甚至路由所有stream量到一个虚拟接口到虚拟机的设备上的某个IP?

像这样使用DNAT,您需要您的访客系统将VM主机作为默认网关。

我有一个类似的networkingconfiguration,我用这个configuration:

 localnetwork (192.168.0.0/24) <-> host eth0 (192.168.0.10) host tun0 (192.168.1.150) <-> vm1 eth0 (192.168.1.200) gw 192.168.1.150 <-> vm2 eth0 (192.168.1.201) gw 192.168.1.150 

我的所有虚拟机都可以互相ping通,并可以使用这个iptable规则访问外部networking:

 Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:192.168.0.10 

外部networking可以使用以下规则访问我的虚拟机上的服务:

 Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:22200 to:192.168.1.200:22 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:22201 to:192.168.1.201:22 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:3389 to:192.168.1.202:3389 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:443 to:192.168.1.206:443 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:80 to:192.168.1.206:80 

我在debian文件/ etc / network / interfaces中configuration了tun0接口:

 auto tun0 iface tun0 inet static address 192.168.1.150 netmask 255.255.255.0 pre-up tunctl -g uml-net -t tun0 post-down tunctl -d tun0 

随着Christophe Drevet和DukeLion的回答,我能够得到所需的configuration工作。

我要回答自己解释我的解决scheme。 请随时评论这一点,因为我几年没有做networking的东西,很可能错过了这里非常重要的东西。

下面的configuration完美地工作,并允许添加更多的虚拟机,每个虚拟机使用不同的公共IP地址(这里使用的IP是172.16.0.0是“公共”)。


networking接口

 VM-Host, eth0 -> 172.16.0.1 VM-Host, eth0:0 -> 172.16.0.2 VM-Host, br0 -> 192.168.10.1 Virt. machine, eth0 -> 192.168.10.2 (added to br0) gateway: 172.16.0.2 

iptables的

连接跟踪:

iptables -I FORWARD -m conntrack -d 192.168.10.0/24 --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT

我们虚拟机上的networking服务器的DNAT:

iptables -t nat -A PREROUTING -p tcp -d 172.16.0.2 --dport 80 -j DNAT --to-destination 192.168.10.2:80

SNAT让我们的VM到达外面的世界:

iptables -t nat -I POSTROUTING -j SNAT --src 192.168.10.2 --to-source 172.16.0.2

阻止虚拟机上的所有其他端口:

iptables -A INPUT -d 172.16.0.2 -j REJECT --reject-with icmp-port-unreachable