我有一个实验设置,有 4 台 Linux (CentOS) 机器:
所有 4 台机器都使用不同的网络进行内部连接,并且可以互相 ping 通直连接口。但只有 PC4 可以访问互联网。
我正在尝试设置 iptables 规则,允许 PC1 能够通过 PC4 访问互联网,但我不知道该怎么做。
我尝试在 PC2、PC3 和 PC4 的传出接口上添加 NAT:
iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
但是,这不起作用,您能给我一些想法,在这样的设置中我如何使 PC1 访问 10.0.0.1 网络?
答案1
首先,每台 PC 都需要使用下一台 PC 作为内管的网关:
PC1# ip route add default via 1.1.1.2 # PC2's address where it can join PC1
PC2# ip route add default via 2.1.1.2 # PC3's address where it can join PC2
PC3# ip route add default via 3.1.1.2 # PC4's address where it can join PC3
而且因为它是默认路由,这意味着现在每台 PC 都可以访问下一台 PC。所以,现在,所有 PC 都可以(理论上,如果rp_filter¹
未启用)将数据包发送到下一台和互联网。然而,没有返回路径。
为此,每台 PC 都需要能够访问之前所有未直接连接的 PC。
PC1 没有前一个,所以没问题。 PC2直接连接到PC1,所以仍然没有问题。对于PC3,需要通过PC2路由到PC1:
PC3# ip route add 1.1.1.1/? via 2.1.1.1 # PC1's network via PC2
# Fill the '?' according to PC1's network mask. it should include 1.1.1.2.
现在,PC3 和 PC1 应该能够互相 ping 通。如果没有,请检查 PC2 是否已启用转发(两个接口的 sysctl -w net.ipv4.eth?.forwarding=1)。确保您的所有 PC 都设置了此选项,但 PC1 除外,因为该选项无用。
现在,PC4 需要一条通过 PC3 到达 PC2 和 PC1 的路由。
PC4# ip route add 1.1.1.1/? via 3.1.1.1 # PC1's network via PC3
PC4# ip route add 2.1.1.1/? via 3.1.1.1 # PC2's network via PC3
现在您的所有 PC 应该能够互相 ping 通。如果没有,请再次检查您的设置并确保已启用转发。
现在,连接到互联网应该就可以了。如果 PC4 需要 NAT 来访问互联网,则在 PC4 上配置 NAT,而无需修改路由表。
1rp_filter
是一个通常有用的选项,但使测试变得更加复杂:它在接受数据包之前检查反向路径是否正确。如果从 eth0 收到来自 ip 1.1.1.1 的数据包,则它会检查 1.1.1.1 是否通过 eth0 路由。如果不是这种情况,它将拒绝该数据包。因此,rp_filter
不能容忍部分配置的设置,但是一旦设置完成,rp_filter
就可以激活并且可以正常工作。rp_filter
作为一项安全措施,在某些 Linux 发行版中默认启用。