我有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
但它不工作。 为了testing我使用客户端电脑,并把它放在10.0.0.0/24networking和网关被设置为10.0.0.200 。
我想有192.168.0.1作为默认网关。 而且通过eth1 10.0.0.200/24进入的stream量应该被转发到eth2 225.228.123.211 。
我也启用在Ubuntu的转发。
我相信你想要:
如果是这样,你的iptables和iproute2设置有几个错误。 这是我的build议:
-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和默认路由会造成暂时的networking干扰。 所以我build议不要在CLI上input这些信息,而是把它放在一个脚本中,这样所有的事情都是自动的(除非你在Linux的物理控制台上input命令)。
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的所有networking吗?
如果是,则configuration完成。
如果否,也就是说,有其他的子网间接连接到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不是必须的,而是一个好习惯