Eu tenho dois ISPs diferentes. Quero definir algum tipo de configuração de balanceamento de carga que distribuirá pacotes para esses provedores. Eu sei que isso pode ser feito usando diferentes tabelas de roteamento, mas eu queria usar algo chamado "gateway multipath".
Eu configurei ambas as interfaces no /etc/network/interfaces
arquivo. Ambas as conexões funcionam separadamente. Substituí os gateways padrão pelo abaixo:
# ip route add default \
nexthop via 192.168.1.1 dev bond0 weight 1 \
nexthop via 10.143.105.17 dev wwan0 weight 1
Adicionei alvos de mascaramento em iptables
ambas as interfaces:
iptables -t nat -A POSTROUTING -o wwan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o bond0 -j MASQUERADE
Também habilitei (parcialmente) a filtragem de caminho reverso via sysctl
:
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 2
Esta configuração funciona. Os pacotes (conexões) são enviados através de ambas as interfaces. Há apenas um problema que não entendo.
Quando desejo verificar meu endereço IP usando os seguintes comandos:
$ curl text.whatisyourip.org
$ curl eko.one.pl/host.php
O endereço IP é diferente em ambos os casos, o que significa que o mecanismo funciona bem. Também posso ver isso funcionando em wireshark
. Mas quando tento enviar, por exemplo, várias solicitações para o primeiro dos domínios acima, sempre recebo o mesmo endereço IP em resposta. Portanto, parece que os pacotes destinados ao endereço IP específico sempre passam pela mesma interface. Só estou me perguntando por quê. Existe algum mecanismo que lembre os endereços IP de destino das solicitações anteriores e faça com que as próximas solicitações aos mesmos endereços passem pela mesma interface?
Responder1
Consegui resolver o problema. Emesse linkvocê pode ler o seguinte:
IPv4: Roteamento multicaminho baseado em hash. Quando o cache de roteamento foi removido na versão 3.6, o algoritmo multipath IPv4 mudou de mais ou menos baseado no destino para um agendamento quase aleatório por pacote. Isto aumentou o risco de pacotes fora de ordem e impossibilitou o uso de multipath junto com serviços anycast. Nesta versão, a implementação de roteamento multipath foi substituída por um balanceamento de carga baseado em fluxo baseado em um hash sobre o commit de mesclagem dos endereços de origem e destino
Portanto, mesmo que o cache tenha sido removido no kernel 3.6, as solicitações ainda estão sendo armazenadas em cache. Agora os endereços de origem e de destino são importantes. É por isso que os pacotes passam sempre pela mesma interface.