Eu tenho uma caixa Linux com 9 placas de rede e quero que oito delas tenham endereços exclusivos na mesma sub-rede, por exemplo:
ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0
O comportamento padrão do ARP é extremamente contraproducente nesse caso, pois resulta em todo o tráfego de todos os IPs que passam exclusivamente eth1
, o que é exatamente o oposto do que eu quero.
Então eu vasculhei e acabei fazendo algumas alterações no sysctl como esta:
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
Isso impediu eth1
de se passar por todos os outros, mas ainda não consigo executar ping em nada que eth1
não seja o endereço do servidor com êxito. (por exemplo, de um segundo computador no mesmo switch, 192.168.123.1
responde apenas ao ping)
Acho que preciso fazer algo com arptables ou iproute ou ALGO, mas estou perdido no mar neste campo.
Pontos de bônus: A solução deve ser compatível com o Linux 2.6.27.27. (Mais especificamente, Slax 6.1.2)
fonte
Respostas:
Você precisa de um modelo de sistema final forte . O Linux é basicamente construído em torno de um modelo de sistema de envio fraco, portanto, não é realmente uma boa opção de SO para este aplicativo.
Você terá que fingir todo o comportamento necessário, do ARP ao roteamento de políticas e seleção de endereços de origem. Você também precisará de filtros para impedir que pacotes sejam aceitos se eles chegarem na interface errada.
As etapas definitivamente necessárias são:
Configure arp_filter = 1 e arp_ignore = 2 em todas as interfaces.
Adicione o roteamento baseado na origem por interface para o tráfego de saída. (A interface de destino deve ser escolhida com base no endereço de origem.)
Adicione filtragem de entrada por interface para descartar silenciosamente os pacotes recebidos na interface errada. (Pacotes com um endereço de destino atribuído a outra interface.)
Infelizmente, não há consenso sobre se essas três etapas são tudo o que é necessário. O modelo de sistema final fraco está embutido em toda a pilha TCP / IP do Linux e não está claro o que pode dar errado com problemas sutis como o multicast.
Não está claro como você escolheria a interface de saída para transmissões, por exemplo. Deveria sair todos eles? Talvez. Qual é o comportamento certo se a pilha obtiver uma transmissão de saída com um endereço de origem não atribuído a uma das interfaces?
Novamente, você escolheu a ferramenta errada para o trabalho.
fonte
É mais provável que você queira criar uma ponte com as interfaces 8/9 e atribuir um endereço IP a essa ponte (pacote bridge-utils, comando 'brctl add').
Dessa forma, a ponte funcionará como um comutador e poderá ter um endereço IP na sua sub-rede.
fonte
Eu recomendaria ligar as interfaces físicas e, em seguida, configurar todos os endereços na interface de ligação única.
Você também precisará de suporte no switch.
Aqui está um mini tutorial que você pode usar para começar.
fonte
Parece que você deseja um ambiente de teste equivalente a 9 máquinas separadas e acredita que 9 interfaces em uma máquina podem emular isso. No Linux, isso simplesmente não pode ser feito através de uma única pilha, pelas razões descritas por David Schwartz. BTDT e tem as cicatrizes. Já era ruim o suficiente com 2 interfaces.
Uma solução melhor pode ser executar 8 ou 9 máquinas virtuais discretas em um host e conectar 8 ou 9 interfaces a essas máquinas virtuais.
fonte
Sim, é possível seguindo a sugestão de David Schwartz:
// Para funcionalidade adequada, isto é, respostas ARP de eth1 para serem geradas quando eth0 e eth1 estiverem na mesma sub-rede
// configure a tabela "new_rt_table" para rotear os pacotes via eth1
// marca pacotes para que 'ip route' possa rotear através de eth1
// habilita o suporte para várias tabelas de roteamento na configuração do kernel.
Configuração do Kernel
→ Suporte de rede → Opções de rede
[*] IP: roteador avançado
[*] IP: roteamento de políticas
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_MULTIPLE_TABLES
// as etapas acima redirecionam os pacotes que devem ser enviados do eth0 para sair adequadamente do eth1.
Por favor, sugira quaisquer outros métodos, se alguém conseguir fazê-lo funcionar.
fonte