我正在用virtualBox中的6个虚拟机build立一个虚拟networking。 其中一个充当路由器/ NAT /防火墙。 第一台机器使用4个网卡:
eth0 -> Internet eth1 -> Subnet 1 eth2 -> Subnet 2 eth3 -> Host-Only Network
我已经到了在子网中的机器可以通过设置nat在“路由器”连接到互联网的地步:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
然后,我开始使用这些网卡设置第三个从子网2中的虚拟机出来的子网:
eth0 -> Subnet 2 eth1 -> Subnet 3
只有一台机器连接到子网3,但是我要build立一个ssh服务器,所以我需要从路由器到子网2中的机器路由到另一台机器。 为此我使用了:
iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.20.46:22
在“路由器”和
iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.30.50:22
在ssh服务器上。 另外,为了让每台机器“看”对方,我用:
route add default gw 192.168.20.46 route add -net 192.168.30.0 netmask 255.255.255.0 gw 192.168.20.46
在“路由器”机器上。
现在每台机器都可以从其他机器上ping到8.8.8.8并跟踪它们。 然而,
apt-get update
在任何一台机器上,路由器都会把这个软件包发送给路由器,并且没有回应,所以它会卡在第一行:
0% Connecting ftp....(82.194.78.250)...
除此之外永远不会有任何进展。 (只是错误,当它超时)我的猜测是NAT正在发送包正确,但在回来的路上,他们无法到达子网机器。
我猜是错的。 机器正在发送请求,路由器将它们redirect到另一个子网,这个子网不知道如何处理它,或者将它弹回路由器。 解决scheme是将-i eth0添加到iptables行,以便只有外部stream量redirect。