但是,如果您有两条具有相同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.
解决方法
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