Ubuntu Linux - várias NICs, a mesma LAN ... As respostas ARP sempre saem em uma única NIC

16

Temos o serviço de Internet AT&T U-Verse, que possui um gateway DSL extremamente desossado.

Temos 5 IPs (máscara de rede 248), mas o gateway não pode fazer nada além de um único IP -> mapeamento de endereço MAC único.

Temos uma única máquina de firewall e redirecionamos diferentes combinações de IP / porta para diferentes locais dentro de uma DMZ.

Até agora, nossa solução é ter uma máquina virtual VMWare no firewall com 4 NICs adicionais, para obter os outros 4 endereços IP ... no entanto, temos um problema.

O gateway está basicamente executando um ping no ARP para verificar se o IP está respondendo no MAC esperado. Com 4 NICs todas na mesma LAN, o linux está respondendo às solicitações de ARP para TODOS OS IPs usando uma única interface. Não é isso que o gateway espera e está atrapalhando as outras 3 placas de rede. O gateway se recusa a rotear o tráfego de entrada para IPs onde os resultados de ping do ARP não são o MAC esperado.

Como podemos obter as respostas do ARP para o IP do eth0 sair eth0, o IP do eth1 sair eth1, etc?

EDITAR

A resposta de Christopher Cashell não funciona nessa situação. Eu tinha grandes esperanças de lê-lo, mas ... não.

EDIT 2

Resolvido! Veja minha resposta abaixo.

darron
fonte
PS - não 'Uverse Drop' comentários ... U-Verse é 18Mbps, contra tudo de outra pessoa 3Mbps ou um 10mbps muito confiável via cabo
Darron
@dblack: Você esqueceu de acrescentar a sua resposta :)
Mihai Limbăşan
O site api.recaptcha.net ficou inoperante por um tempo. A resposta está agora.
611 darron

Respostas:

13

Sua solução escolhida funciona, mas existem alternativas que não envolvem arptables. (Christopher Cashell estava no caminho certo, originalmente, mas estava fora de controle.)

Em resumo, você deseja definir estes parâmetros:

net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Eles devem estar disponíveis ao executar um kernel Linux moderno da série 2.6. Verifique e verifique se '/ proc / sys / net / ipv4 / conf / / arp_announce' e / proc / sys / net / ipv4 / conf / / arp_ignore 'existem em seu sistema.

O parâmetro 'arp_filter' funciona apenas quando seus vários endereços IP compartilham um segmento de LAN, mas usam sub-rede IP diferente. Se eles também compartilham a sub-rede IP, você precisa usar 'arp_ignore' e 'arp_announce', como acima.

(Acredito que você também pode precisar definir 'arp_filter' para '0' também.)

Ryan B. Lynch
fonte
O que aconteceu com o arp_filter? Foi uma solução inicial (2003?) Para o problema do ARP, mas não parece funcionar como descrito, pelo menos no Centos 5. arp_ignore e arp_announce parecem bons.
Pcapademic
Essa solução, como está, parece funcionar apenas no nível do ARP. Sem configurações adicionais de rota, o firewall ainda pode eleger a placa de saída incorreta (e MAC) para seu próprio tráfego IP de saída, mas (ainda) sempre recebe o tráfego IP de entrada na placa certa, levando a considerações de caminho assimétrico e rp_filter.
AB
8

Ok, aqui está a solução. Primeiro, uma recapitulação:

Aqui está o meu plano de rede básico:

 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 gateway residencial idiota.

Primeiro, as solicitações de transmissão ARP vão para todos eles. Como todos os 4 IPs são endereços locais válidos, todas as 4 interfaces tentarão responder.

1) instale arptables . Adicione isso 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. Portanto, a interface correta agora será a única resposta.

Isso por si só não é suficiente. O próximo bit é um problema da tabela ARP. O PC solicitante provavelmente já possui uma entrada na tabela ARP e, portanto, o Linux usará a interface associada a isso. Até que a entrada da tabela ARP expire, ele tentará enviar respostas ARP usando a interface dessa entrada, não a 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 ... ou seja, para ajudar a impedir ataques de falsificação entre interfaces. Eu li que verifica se o pacote é legal para a interface que está entrando ou saindo (trocando MACs e IPs e ver se ele ainda roteia pela mesma interface). Portanto, normalmente seria uma má idéia desativá-lo. No meu caso, todas as interfaces estão na mesma rede ... para que a verificação não importe realmente.

Se eu adicionar outra interface e precisar da proteção contra falsificação, talvez seja possível criar algumas entradas arptables / iptables para fazer a mesma coisa.

darron
fonte
5

Isso tem a ver com a maneira como o Linux lida com IPs e NICs. Basicamente, trata um endereço IP como se pertencesse à caixa e não apenas à NIC específica. O resultado é que você pode obter respostas ARP de endereços IP em interfaces que você não esperaria.

A solução é uma opção sysctl. Pelo que me lembro, o que você está procurando é:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1

Isso resolverá o problema para você. Apenas adicione-os ao /etc/sysctl.conf e execute ' sysctl -p' (ou execute cada linha como argumento para ' sysctl -w'.

Isso fará com que o Linux responda apenas às solicitações de ARP na interface à qual um endereço IP está realmente atribuído.

Christopher Cashell
fonte
hmm ... infelizmente não parece funcionar. Eu colei isso no sysctl.conf, executei o sysctl e até reiniciei, sem alterações. Eu posso escolher as opções em / proc e ver se estão definidas, mas se eu sair de outra caixa, todas as respostas serão do mesmo MAC. As interfaces estão todos na mesma rede (mesma transmissão, etc) ...
darron
11
Esta é a solução correta se as interfaces estiverem na mesma rede, mas tiverem endereços em sub-redes diferentes. Trabalho confirmado.
Alastair Irvine
0

Você pode conectar o gateway e fazer com que o firewall lide com os IPs?


fonte
pelo que entendi, não ... mas alguém por favor me corrija se eu estiver errado.
darron 30/07/2009