Ok, então depois de ter tido mais tempo para investigar isso eu encontrei uma maneira de fazer isso usando o Linux TEQL (True Link Equalizer). Aqui está um link que eu segui vagamente, mas com alguns ajustes.
Foi assim que consegui trabalhar no Arch Linux ARMv7 (Raspberry Pi 3)
Na inicialização:
O comando a seguir deve ser executado na inicialização para carregar o módulo Kernel apropriado.
modprobe sch_teql
Os seguintes comandos também são executados na inicialização, supondo que você queira NAT de uma rede local em eth0.
sysctl -w net.ipv4.ip_forward
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
O tráfego de retorno FORWARD está no ppp + e o POSTROUTING MASQUERADE no teql + porque o tráfego de saída sai no teql e o tráfego de retorno volta no ppp.
Quando os links ppp aparecem:
Supondo que os links com balanceamento de carga sejam ppp, os seguintes comandos devem ser executados em um script em um script /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
Onde 1.1.1.1
é o seu endereço IP público voltado para o ISP. IPs públicos adicionais podem ser atribuídos ao dispositivo teql0, mas não precisam ser atribuídos aos dispositivos ppp. Na minha configuração, os dois links ppp compartilham o mesmo IP (negociado por pppoe etc.). O link teql é atribuído manualmente como mostrado acima. O ISP precisa enviar tráfego para o IP igualmente em ambos os links.
O caminho reverso ( rp_filter
) é definido como 2
(solto), ambos no script acima, para que os pacotes de retorno não sejam eliminados devido a eles voltarem às interfaces ppp em vez de teql0.
Eu configurei tudo dessa maneira e funciona perfeitamente. Muito fácil! Quando os links falham, há failover contínuo. Quando eles chegam, eles apenas começam a trabalhar novamente. Parece que não há perda ou atraso do pacote quando ele falha, e nenhum quando ele volta.
Além disso, outra forma no link abaixo usa o roteamento de políticas, com o iptables para marcar todos os outros pacotes, mas tentarei em alguns dias verificar se funciona melhor do que o acima e fornecer feedback aqui de acordo.