我有3个接口:
eth0 192.168.0.50/24
eth1 10.0.0.200/24
eth2 225.228.123.211
我想要保留默认网关,192.168.0.1
因为我想对其进行更改。
我想伪装eth1 10.0.0.200/24
并启用 NAT 转发eth2
。因此我做了以下操作:
ip route add 225.228.123.208/29 dev eth2 src 225.228.123.211 table t1
ip route add default via 225.228.123.209 dev eth2 table t1
ip rule add from 225.228.123.211 table t1
ip rule add to 225.228.123.211 table t1
现在我可以从任何互联网主机收到 ping 回复,如果我这样做:
ping -I eth2 8.8.8.8
为了启用 NAT 转发,我执行以下操作:
sudo iptables -A FORWARD -o eth2 -i eth1 -s 10.0.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
但它不起作用。为了测试,我使用了客户端电脑并将其放在10.0.0.0/24
网络上,并将网关设置为10.0.0.200
。
我想将其设为192.168.0.1
默认网关。通过 进入的流量eth1 10.0.0.200/24
应转发至eth2 225.228.123.211
。
我也在 ubuntu 上启用了转发。
答案1
我相信你想:
- 将所有人从 eth1 10.0.0.0/24 路由到 eth2
- 但通过 eth0 维护 Linux 机器的路由
如果是这种情况,则您的 iptables 和 iproute2 设置存在一些错误。以下是我的建议:
-t nat -A POSTROUTING -o eth2 -j MASQUERADE
-A FORWARD -i eth1 -o eth2 -j ACCEPT
-A FORWARD -i eth2 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
对于路由,您需要两个自定义表。我将使用数字而不是名称,因为我不知道您的 中有什么/etc/iproute2/rt_tables
。现在,一个重要的注意事项:以我的方式修改 RPDB 和默认路由将要造成暂时的网络干扰。所以我建议不是在 CLI 上输入这些内容,而是将其放在脚本中,这样一切都会原子地发生(除非您在 Linux 机器的物理控制台上输入命令)。
ip route add default via 192.168.0.1 dev eth0 table 100
ip route add default via 225.228.123.209 dev eth2 table 102
ip route del default table main
ip rule add order 10 from all lookup main
ip rule add order 20 iif lo lookup 100
ip rule add order 30 iif eth1 lookup 102
我们将lookup main
作为第一条规则,以确保正确路由到直接连接到 Linux 机器的子网。但我们删除了该表中的默认路由,因为我们想根据数据包进入 Linux 机器的位置指定不同的默认路由。
现在,有一个重要的问题:子网 10.0.0.0/24 代表全部网络是否直接或间接地连接到 eth1?
如果是,则配置完成。
如果不,即,有其他子网间接连接到 eth1(比如说 10.0.1.0/24、10.0.2.0/24 等),您可以通过另一个路由器访问这些子网(比如说 10.0.0.77/24),那么您必须向表中添加更多路由main
:
ip route add 10.0.1.0/24 via 10.0.0.77 dev eth1 table main
ip route add 10.0.2.0/24 via 10.0.0.77 dev eth1 table main
... and so on ...
笔记: table main
不是必须的,但是一个好习惯