如何在Linux上实现每包多路径路由?

3.6之前的 Linux内核使用路由缓存来进行IPv4多路径路由,这意味着两条独立的线路/ ISP之间的路由非常容易.从3.6开始,算法变为per-packet,这意味着需要一些路由表/规则/ iptables标记技巧来实现两条线路/ ISP.

但是,如果您有两条具有相同ISP的线路,它们可以在每个数据包的基础上以平衡/故障转移的方式沿着两条线路路由单个IP,那么从3.6开始,您可以轻松实现线路绑定(在IP级别),因为两个方向上的每个数据包路由.

从4.4,the kernel changed again到基于流的负载平衡,基于源和目标地址上的哈希.

我目前正在运行内核4.4.36,并且正在使用PPPoE连接上的多路径路由.来自ISP的下行流量基于每个数据包在两条独立的线路上路由(一条IP路由到两条线路).这使我的下载速度比单个行的速度快.几乎两条线的速度加在一起.它的效果非常好,Skype视频,VoIP(UDP),YouTube等都运行良好.

由于具有如此良好的下游体验,我想在上游尝试它,但我的上游流量根据两个ppp设备(具有相同IP地址)的新的基于流的算法进行路由.这意味着我无法实现比单行速度更快的上传速度.

有没有办法配置当前内核使用每数据包算法?或者其他一些实现每包多路径路由的方法?我是否需要恢复到较旧的内核(由于其他各种原因我不想这样做)?

我的ISP不支持多链路ppp.

如果它是相关的,我目前在Raspberry Pi 3上运行Arch Linux ARMv7.

解决方法

好的,所以在有更多时间进行调查后,我发现了一种使用Linux TEQL(True Link均衡器)的方法.这是我松散遵循的链接,但有一些调整.

http://lartc.org/howto/lartc.loadshare.html

这就是我如何使用Arch Linux ARMv7(Raspberry Pi 3)

在开机时:

应在引导时运行以下命令以加载适当的内核模块.

modprobe sch_teql

假设您希望从eth0上的本地网络进行NAT,以下命令也将在引导时运行.

sysctl -w net.ipv4.ip_forward=1
iptables -A INPUT -i ppp+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i ppp+ -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o teql+ -j MASQUERADE

FORWARD返回流量在ppp上,而POSTROUTING MASQUERADE在teql上,因为传出流量在teql上消失,返回流量在ppp上返回.

当ppp链接出现时:

假设要进行负载平衡的链接是ppp,则在/etc/ppp/ip-up.d/脚本的脚本中运行以下命令.

sysctl -w net.ipv4.conf.ppp1.rp_filter=2
sysctl -w net.ipv4.conf.ppp2.rp_filter=2
tc qdisc add dev ppp1 root teql0
tc qdisc add dev ppp2 root teql0
ip address add 1.1.1.1/32 dev teql0
# you can add additional public IP addresses teql0 if you need to
ip link set teql0 up
ip route replace default scope global dev teql0

1.1.1.1是面向ISP的公共IP地址.可以将其他公共IP分配给teql0设备,但不需要将其分配给ppp设备.在我的设置中,两个ppp链接共享相同的IP(由pppoe等协商)如上所示手动分配的teql链接. ISP需要在两个链路上均等地发送IP流量.

在上面的脚本中,反向路径(rp_filter)都设置为2(松散),因此返回数据包不会因为它们返回到ppp接口而不是teql0而被丢弃.

我已经设置了这种方式,它完美无缺.很容易!当链接失败时,会有无缝的故障转移.当他们出现时,他们才刚刚开始工作.似乎在故障转移时没有数据包丢失或延迟,并且在它恢复时也没有.

此外,其中一位评论者提出了以下链接,该链接使用策略路由,使用iptables标记其他所有数据包等,但我会在几天内尝试查看它是否比上述更好,并在此提供相应的反馈.

http://support.aa.net.uk/Router_-_Linux_upload_bonding_using_policy_routing

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...