所以,情况就是这样。
我有双 ISP 链接当前处于活动状态,并且正在从我的网络路由流量,其 iptables 设置与负载平衡和 NAT-ing Linux 上的多个 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
问题是,如果我为任一 ISP 保留系统范围的默认路由(如ip route list
不带table
参数),似乎这会覆盖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
,它适用于该表的默认网关。)
但是多路径路由会破坏服务器上的所有内容以及它为其路由的客户端。帮助?
我能够自己解决这个问题。
如果其他人遇到类似情况,解决方案是更改
ip rule
fwmark 条目的优先级。我没有仔细阅读lbt对相关问题的回答;他特别指出,将优先级设置为 33000 将使这些规则在查表之后发生,这与我想要的相反。default
因此,我将规则更改为如下所示:现在,拥有默认路由并不会破坏基于防火墙的路由,我可以
apt-get
毫无问题地运行我的所有其他程序。万岁!