várias interfaces físicas com IPs na mesma sub-rede

13

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 eth1de se passar por todos os outros, mas ainda não consigo executar ping em nada que eth1não seja o endereço do servidor com êxito. (por exemplo, de um segundo computador no mesmo switch, 192.168.123.1responde 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)

frustrated_tester
fonte
Você pode postar a tabela de roteamento?
Ponfonze 08/08
2
Qual é o seu objetivo na criação dessa configuração? O que você está tentando realizar?
David Schwartz
assim está a loucura.
Sirex
se você deseja vincular essas interfaces, precisará conectá-las.
usar o seguinte comando
1
@DavidSchwartz Não, a máquina não deve agir como um switch (ou roteador). Pense nisso mais como correr 8 máquinas virtuais com uma NIC física dedicada para cada VM ( Nota: Estou não VMs em execução, esta é apenas uma analogia ). Do ponto de vista de outra caixa na mesma rede, meu único PC deve ser totalmente indistinguível de oito PCs distintos.
frustrated_tester

Respostas:

17

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:

  1. Configure arp_filter = 1 e arp_ignore = 2 em todas as interfaces.

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

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

David Schwartz
fonte
6

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

Be2eB
fonte
AFAIK, essa deve ser a resposta correta para o Linux. O Linux soluciona muitos dos problemas mencionados na resposta de David usando dispositivos de ponte (também conhecido como evitar problemas de L3, construindo uma rede lógica L2 melhor).
26416 Dave
4

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.

bahamat
fonte
4

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.

Skaperen
fonte
Recursos de leitura: Programação em rede Unix: The Sockets Networking API, por Stevens, Fenner e Rudoff. Veja também RFC1122 e RFC4907.
Skaperen
0

Sim, é possível seguindo a sugestão de David Schwartz:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// Para funcionalidade adequada, isto é, respostas ARP de eth1 para serem geradas quando eth0 e eth1 estiverem na mesma sub-rede

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// configure a tabela "new_rt_table" para rotear os pacotes via eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// marca pacotes para que 'ip route' possa rotear através de eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

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

noel av
fonte