如何在具有双 ISP 链路的 Linux 路由器上设置默认路由?

如何在具有双 ISP 链路的 Linux 路由器上设置默认路由?

情况是这样的。

我有双 ISP 链路,目前处于活动状态,用于路由来自我网络的流量,其 iptables 设置与接受的答案非常相似在 Linux 上实现负载平衡和 NAT-ing 多个 ISP 连接

我的代码中有两行/etc/iproute2/rt_tables类似这样的代码:

...
10 COMCAST
20 CENTURYLINK
...

我在每个表中设置了具有适当的默认网关的路由,并设置了如下规则:

ip rule add fwmark 1 table COMCAST prio 33000
ip rule add fwmark 2 table CENTURYLINK prio 33000

然后我设置基于 iptables 的数据包标记和路由:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
CONNMARK   all  --  anywhere             anywhere             CONNMARK restore
ACCEPT     all  --  anywhere             anywhere             mark match ! 0x0
MARK       all  --  anywhere             anywhere             MARK set 0x1
MARK       all  --  anywhere             anywhere             statistic mode random probability 0.33300000010 MARK set 0x2
CONNMARK   all  --  anywhere             anywhere             CONNMARK save

问题是,如果我保留系统范围的默认路由(即ip route list不带任何table参数)用于任一 ISP,那么这似乎会覆盖iptables客户端计算机的路由 - 根据 ,没有数据包通过非默认连接watch -n 1 ifconfig [interface]。如果我删除系统范围的默认路由,路由对我的所有客户端计算机都运行良好,其中 33% 左右的数据包通过 CenturyLink 线路传输,其余数据包通过 Comcast 线路传输。这太棒了!

但是,没有默认路由会破坏路由器本身需要互联网连接的所有功能。apt-get update例如,我无法在路由器上运行。那么,如何为系统设置不会覆盖路由iptables设置的默认路由?我尝试按照 LARTC 站点的说明设置多路径路由,如下所示:

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop dev $IF2 weight 1

(我不得不对 LARTC 指南进行稍微修改,因为 CenturyLink 连接的默认路由没有网关 IP,只有dev ppp0,并且它适用于该表的默认网关。)

但多路径路由会破坏服务器上的所有内容以及路由所针对的客户端。帮忙吗?

答案1

我能自己解决这个问题。

解决方案是,如果其他人遇到类似情况,可以改变ip rulefwmark 条目的优先级。我没有读过lbt 对相关问题的回答足够谨慎;他特别指出,将优先级设置为 33000 将使这些规则生效表格default查找,这与我想要的正好相反。因此,我修改了规则,如下所示:

100:    from all fwmark 0x1 lookup COMCAST
100:    from all fwmark 0x2 lookup CENTURYLINK

现在,默认路由不会破坏基于防火墙的路由,我可以apt-get毫无问题地运行所有其他程序。太棒了!

相关内容