Ok, aqui está a solução. Primeiro, uma recapitulação:
Este é o meu plano básico de rede:
eth0 10.10.10.2 netmask 255.255.255.248
eth1 10.10.10.3 netmask 255.255.255.248
eth2 10.10.10.4 netmask 255.255.255.248
eth3 10.10.10.5 netmask 255.255.255.248
Todas as interfaces se sobrepõem. Isso é tecnicamente errado, e a fonte de todos os meus problemas ... mas eu tenho que fazê-lo por causa desse portal residencial idiota.
Primeiro, as solicitações ARP de transmissão vão para todas elas. Como todos os 4 IPs são endereços locais válidos, todas as 4 interfaces tentam responder.
1) instale arptables . Adicione isto em algum lugar durante a inicialização ( /etc/rc.local aqui):
arptables -F INPUT
arptables -A INPUT -i eth0 --destination-ip ! 10.10.10.2 -j DROP
arptables -A INPUT -i eth1 --destination-ip ! 10.10.10.3 -j DROP
arptables -A INPUT -i eth2 --destination-ip ! 10.10.10.4 -j DROP
arptables -A INPUT -i eth3 --destination-ip ! 10.10.10.5 -j DROP
Isso impedirá que as transmissões entrem na interface errada. Então, a interface correta será agora a única resposta.
Isso por si só não é suficiente. O próximo bit é um problema na tabela ARP. O PC solicitante provavelmente já possui uma entrada na tabela ARP e, assim, o Linux vai usar a interface associada a isso. Até que a entrada da tabela ARP expire, ela tentará enviar respostas ARP usando a interface dessa entrada, não aquela associada à solicitação ARP.
A opção sysctl rp_filter parece estar rejeitando pacotes de resposta ARP de saída se eles estiverem na interface errada. Então ...
2) Desative rp_filter .
No Debian / Ubuntu, isso significa comentar as duas linhas rp_filter em /etc/sysctl.d/10-network-security.conf .
Esta opção foi ativada por um motivo ... a saber, para ajudar a evitar ataques de falsificação de interface cruzada. Eu o li, ele verifica se o pacote é legal para a interface que está entrando ou saindo (trocando MACs e IPs e verificando se ainda roteia pela mesma interface). Então, normalmente seria uma má ideia desligá-lo. No meu caso, todas as interfaces estão na mesma rede ... então essa verificação não importa realmente.
Se eu adicionar outra interface e precisar da proteção de spoofing, talvez possa criar algumas entradas arptables / iptables para fazer a mesma coisa.