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.


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.)


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.


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.


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?


pelo que entendi, não ... mas alguém por favor me corrija se eu estiver errado.
— darron 30/07/2009
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.