Answers:
您误解了问题。并非每个数据包都是响应,也不是每个数据包都可以与其他数据包匹配,因此“与传入的网络接口相同”才有意义。您要做的是根据其源IP地址选择数据包的网关。
这称为基于源的路由或策略路由。您可以使用一条简单的iptables
规则来做到这一点,但是最好的方法是设置两个路由表,每个公共源地址一个:
首先,创建两个表(将<NAME1>和<NAME2>替换为两个提供商的明智名称,与IP1,DEV1相同,依此类推):
echo 200 <NAME1> >> /etc/iproute2/rt_tables
echo 201 <NAME2> >> /etc/iproute2/rt_tables
将网关添加到每个路由表(如果需要):
ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
ip route add <NET2> dev <DEV2> src <SRC2> table <NAME2>
然后是默认路由:
ip route add default via <IP1> table <NAME1>
ip route add default via <IP2> table <NAME2>
然后根据源地址选择路由表的规则:
ip rule add from <IP1> table <NAME1>
ip rule add from <IP2> table <NAME2>
有关更多详细信息,请参见路由多个上行链路/提供者。
David Schwartz的答案很好,但是您可以通过仅增加一个表,而将默认路由用于其他表来简化路由规则。我有一台位于两个NAT网关后面的服务器,最近我经历了在多个VM之间重新创建该方案的过程。我的/etc/network/interfaces
样子是这样的:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.13.13
netmask 255.255.255.0
up ip route add table optus default via 192.168.13.10
up ip rule add from 192.168.13.213 table optus
up ip route add default via 192.168.13.11
auto eth0:0
iface eth0:0 inet static
address 192.168.13.213
netmask 255.255.255.0
(这是用于两个ISP为Optus和iiNet的设置,因此表名为“ optus”)
这,加上/etc/iproute2/rt_tables
创建表中的行,应该就足够了。您将有两个IP地址;来自192.168.13.13的流量将通过192.168.13.11发出,而来自192.168.13.213的流量将通过192.168.13.10发出。配置这两个网关以适当地进行其端口转发(192.168.13.11将内容转发到192.168.13.13,而192.168.13.10将内容转发到192.168.13.213),其余的都应该照顾好自己。
您可能需要针对自己的情况进行一些调整,因为您正在直接使用公共IP,但是类似的方法仍然可以使用。同样,在/etc/network/interfaces
两年后必须重新启动系统时,执行这些操作然后对文件进行git-manage管理要容易得多,而不是试图记住您的设置方式。
双网示例
此示例显示了如何使eth1
具有10.130.0.2
netmask 255.255.255.255
和网关的附加功能10.130.0.1
可用于绑定到该网络的服务,例如ping -I eth1 8.8.8.8
从技术上讲,我们是:
ip addr add 10.130.0.2/32 broadcast 10.130.0.2 dev eth1
ip link set eth1 up
ip route add 10.130.0.1 src 10.130.0.2 dev eth1
ip route add 10.130.0.1 src 10.130.0.2 dev eth1 table 100
ip route add default via 10.130.0.1 dev eth1 metric 10
ip route add default via 10.130.0.1 dev eth1 table 100
ip rule add from 10.130.0.2/32 table 100
ip rule add to 10.130.0.2/32 table 100
curl --interface eth1 ifconfig.co
curl --interface eth0 ifconfig.co
ping -I eth1 8.8.8.8