3.6 之前的 Linux Kernel 使用路由缓存来进行 IPv4 多路径路由,这意味着在两条单独的线路/ISP 之间进行路由非常容易。从 3.6 开始,算法更改为按数据包计算,这意味着需要一些路由表/规则/iptables 标记技巧来实现两条线路/ISP。
但是,如果您有两条具有相同 ISP 的线路,可以以平衡/故障转移方式在每个数据包的基础上将单个 IP 路由到两条线路,那么从 3.6 开始,您可以轻松实现线路绑定(在 IP 级别),因为每个数据包在两个方向上的路由。
从 4.4 开始,内核再次更改为基于源地址和目标地址的散列的基于流的负载平衡。
我目前正在运行内核 4.4.36,并且正在通过 PPPoE 连接使用多路径路由。我来自 ISP 的下游流量基于每个数据包通过两条单独的线路路由(一个 IP 沿两条线路路由)。这使我的下载速度比单行的速度更快。几乎将两条线的速度加在一起。它运行良好,Skype 视频、VoIP (UDP)、YouTube 等都运行良好。
由于拥有如此良好的下游体验,我想在上游尝试它,但我的上游流量是根据更新的基于流的算法在两个 ppp 设备(具有相同的 IP 地址)之间路由的。这意味着我无法达到比单行速度更快的上传速度。
有没有办法将当前内核配置为使用每包算法?或者其他一些方法来实现每包多路径路由?我是否需要恢复到较旧的内核(由于其他各种原因我不想这样做)?
我的 ISP 不支持多链接 ppp。
如果相关,我目前正在 Raspberry Pi 3 上运行 Arch Linux ARMv7。
好的,所以在有更多时间对此进行调查之后,我找到了一种使用 Linux TEQL(True Link Equalizer)的方法。这是我松散地遵循的链接,但有一些调整。
http://lartc.org/howto/lartc.loadshare.html
这就是我在 Arch Linux ARMv7 (Raspberry Pi 3) 上工作的方式
开机时:
以下命令应在启动时运行以加载适当的内核模块。
假设您想从 eth0 上的本地网络进行 NAT,以下命令也将在启动时运行。
FORWARD 返回流量在 ppp+ 上,POSTROUTING MASQUERADE 在 teql+ 上,因为传出流量在 teql 上流出,返回流量在 ppp 上返回。
当 ppp 链接出现时:
假设要负载均衡的链接是ppp,下面的命令要在一个脚本中运行
/etc/ppp/ip-up.d/
。1.1.1.1
您面向 ISP 的公共 IP 地址在哪里。额外的公共 IP 可以分配给 teql0 设备,但不需要分配给 ppp 设备。在我的设置中,两个 ppp 链接共享相同的 IP(由 pppoe 等协商)它手动分配的 teql 链接如上所示。ISP 需要在两条链路上平等地发送 IP 流量。在上面的脚本中,反向路径 (
rp_filter
) 都设置为2
(loose),这样返回的数据包就不会因为它们返回 ppp 接口而不是 teql0 而被丢弃。我已经这样设置了,而且效果很好。很容易!当链路发生故障时,将进行无缝故障转移。当他们出现时,他们又开始工作了。故障转移时似乎没有丢包或延迟,恢复时也没有。
此外,其中一位评论者建议使用以下链接,该链接使用策略路由,使用 iptables 标记所有其他数据包等,但我会在几天后尝试看看它是否比上述更好,并在此处提供相应的反馈。
http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing