![如何在具有双 ISP 链路的 Linux 路由器上设置默认路由?](https://linux22.com/image/679953/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%85%B7%E6%9C%89%E5%8F%8C%20ISP%20%E9%93%BE%E8%B7%AF%E7%9A%84%20Linux%20%E8%B7%AF%E7%94%B1%E5%99%A8%E4%B8%8A%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4%E8%B7%AF%E7%94%B1%EF%BC%9F.png)
情况是这样的。
我有双 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 rule
fwmark 条目的优先级。我没有读过lbt 对相关问题的回答足够谨慎;他特别指出,将优先级设置为 33000 将使这些规则生效后表格default
查找,这与我想要的正好相反。因此,我修改了规则,如下所示:
100: from all fwmark 0x1 lookup COMCAST
100: from all fwmark 0x2 lookup CENTURYLINK
现在,默认路由不会破坏基于防火墙的路由,我可以apt-get
毫无问题地运行所有其他程序。太棒了!