好的,所以在有更多时间进行调查后,我发现了一种使用Linux TEQL(True Link均衡器)的方法.这是我松散遵循的链接,但有一些调整.
这就是我如何使用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标记其他所有数据包等,但我会在几天内尝试查看它是否比上述更好,并在此提供相应的反馈.