我是 IPtables 新手,但希望根据来源将流量发送到特定卡。以下是我想要的:
eth0-所有流量都通过此网卡进入
根据源 IP,我想要将流量通过 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
我遗漏了哪些步骤?
答案1
我能够使用自定义路由表来完成这项工作
创建自定义路由表: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
这会将来自 10.0.0.100 的任何流量发送到 dev eth1
请记住,重新启动或重启网络服务时这些设置将会丢失。
答案2
我会很谨慎,因为 IP设计根据目标 IP 地址进行路由,如果可以实现这一点,效果会更好。例如,如果您真正想要的是将特定虚拟服务器的所有流量发送到特定接口,那么请使用桥接。
话虽如此,您可以使用多个路由表以及路由规则。首先,您可能需要为将要创建的新表命名:
echo 2001 default-via-eth1 >> /dev/iproute2/rt_tables
echo 2002 default-via-eth2 >> /dev/iproute2/rt_tables
然后,您需要创建特殊的路由表,这很容易 - 只需在创建路由时添加表的名称(例如 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
警告如果您使用“容器”类型的虚拟服务器(如 openvz 或 lxc),则会出现问题,这是因为大多数程序都是使用“未指定”的 IP 地址作为源地址编写的。因此,内核必须确定要使用哪个源 IP 地址,并根据使用的路由来选择它。我希望您能看出其中的讽刺之处——源地址基于基于源地址的路由!似乎发生的情况是,ip 规则被忽略,它使用内置的表列表来查找路由。