我正在 virtualBox 中构建一个包含 6 台虚拟机的虚拟网络。其中一台充当路由器/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,但我要在其上设置 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 正在正确发送数据包,但在返回的途中它们无法到达子网机器。
答案1
我猜是错的。机器发送请求,路由器将它们重定向到另一个子网,该子网要么不知道如何处理它,要么将其反弹回路由器。解决方案是将 -i eth0 添加到 iptables 行,以便仅重定向外部流量。