我是IPtables的新手,但我希望根据源发送stream量到特定的卡。 这是我想要的:
eth0 – 所有stream量进入此网卡
根据源IP,我希望将stream量引导到eth1或eth2上的Internet。
我已经尝试添加以下到nat iptable,但它不工作。
iptables -t nat -A POSTROUTING -s 10.0.0.100 -o eth1 -j MASQUERADE iptables -t nat -A POSTROUTING -s 10.0.0.200 -o eth2 -j MASQUERADE
我错过了哪些步骤?
我能够使用自定义路由表进行这项工作
创build一个自定义路由表: echo 2000 CustomTable >> /etc/iproute2/rt_tables
添加规则: ip rule add from 10.0.0.100 lookup CustomTable
添加路由: ip route add default via 10.0.0.254 dev eth1 table CustomTable
这将在dev eth1上发送来自10.0.0.100的任何stream量
请记住,这些设置将在重新启动或重新启动networking服务时丢失。
我会谨慎的,因为IP是根据目的地IP地址进行路由的,而且如果可以做到这一点,你将会变得更好。 例如,如果您真正想要的是将特定虚拟服务器的所有stream量从特定接口发送出去,请改为使用桥接。
这就是说,你可以使用多个路由表和路由规则。 首先,您可能想要为要创build的新表命名:
echo 2001 default-via-eth1 >> /dev/iproute2/rt_tables echo 2002 default-via-eth2 >> /dev/iproute2/rt_tables
然后,您需要创build特殊的路由表,这很容易 – 只需在创build路由时添加表名(1.2.3.4和5.6.7.8是示例 – 在此使用正确的IP地址) :
ip route add default via 1.2.3.4 dev eth1 table default-via-eth1 ip route add default via 5.6.7.8 dev eth2 table default-via-eth2
最后,你们将这两者与“规则”联系起来:
ip rule add pref 30000 from 10.0.0.100 table default-via-eth1 ip rule add pref 30001 from 10.0.0.200 table default-via-eth2
你可以看到使用这个命令的规则:
ip rule
您可以使用此命令查看特定路由表中的内容:
ip route show table via-eth1
小心如果使用“容器”types的虚拟服务器(如openvz或lxc),则会出现问题,这是因为大多数程序都是使用“未指定”IP地址作为源地址写入的。 因此内核必须确定使用哪个源IP地址,并根据所使用的路由select它。 我希望你能看到那里的讽刺 – 源地址是基于源地址的路由! 什么似乎发生的是,IP规则被忽略,它使用内置的表列表来find路线。