Linux nat/iptables 配置对等链接链

Linux nat/iptables 配置对等链接链

我有一个实验设置,有 4 台 Linux (CentOS) 机器:

https://i.stack.imgur.com/HLs9f.png

所有 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 发行版中默认启用。

相关内容