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

15

Temos o serviço de internet da AT & T U-Verse, que tem um gateway DSL extremamente estúpido.

Temos 5 IPs (máscara de rede 248), mas o gateway é incapaz de fazer outra coisa senão um único IP - > mapeamento de endereço MAC único.

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

Nossa solução até agora é 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 basicamente faz um ping ARP para ver se o IP está respondendo no MAC esperado. Com 4 NICs na mesma LAN, o Linux está respondendo a solicitações ARP para TODOS os IPs usando uma única interface. Não é isso que o gateway está esperando, e está atrapalhando os outros três NICs. O gateway se recusa a rotear o tráfego de entrada para IPs onde os resultados do ping ARP não são o esperado.

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

EDITAR

A resposta de Christopher Cashell não funciona nesta situação. Eu tinha grandes esperanças de ler, mas ... não.

EDIT 2

Resolvido! Veja minha resposta abaixo.

    
por darron 09.06.2009 / 00:45

5 respostas

8

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.

    
por 09.06.2009 / 07:36
13

Sua solução escolhida funciona, mas há alternativas que não envolvem itens arutables. (Christopher Cashell estava no caminho certo, originalmente, mas ele estava fora por um smidge.)

Em suma, você deseja definir esses parâmetros:

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

Estes devem estar disponíveis ao executar um moderno kernel Linux da série 2.6. Verifique e certifique-se de que '/ proc / sys / net / ipv4 / conf / / arp_announce' e / proc / sys / net / ipv4 / conf /

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

(acredito que você também precise configurar 'arp_filter' de volta para '0' também).

    
por 24.06.2009 / 00:23
5

Isso tem a ver com o modo como o Linux lida com IPs e NICs. Basicamente, ele trata um endereço IP como se ele 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. Se bem me lembro, o que você está procurando é:

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

Isso consertará o problema para você. Basta adicioná-los ao /etc/sysctl.conf e executar ' sysctl -p ' (ou executar cada linha como o argumento para ' sysctl -w '.

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

    
por 09.06.2009 / 01:07
1

A resposta aceita em combinação com isto: link

onde rotas estáticas são usadas para se comunicar com apenas IPs desejados em certas interfaces, criamos uma solução poderosa e simples para um problema similar que eu tive.

    
por 25.08.2010 / 09:36
0

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

    
por 24.07.2009 / 20:04

Tags