O mesmo IP em várias interfaces

5

Olá, gurus de rede,

Eu tenho um servidor Linux (kernel 3.14) que funciona como um servidor TFTP, NFS e HTTP para um farm de dispositivos eletrônicos de consumo (set-top boxes - STBs). Os dispositivos usam o TFTP para inicializar seus kernels, depois montam seus FSs raiz do servidor NFS em nossa máquina, etc etc.

Agora, por uma razão técnica esotérica eu não vou me aprofundar aqui (apenas acredite em mim :), cada STB tem que estar em sua própria LAN fisicamente separada. Então, o modo como a rede é configurada é:

O servidor tem uma placa de rede que é usada para acessar o resto do mundo. Ele também tem uma placa de rede para cada STB que ela atende - e cada uma delas está conectada a um pequeno roteador, ao qual o STB + alguns outros dispositivos estão conectados e formam uma LAN.

Atualmente, existem 3 STBs conectados e as LANs são 172.16.50.0/24, 172.16.51.0/24 e 172.16.52.0/24. Tudo está funcionando bem.

No entanto: o fato de termos 3 LANs diferentes significa que o mesmo servidor tem que ser acessado como 172.16.50.1 do STB1, 172.16.51.1 do STB2 e 172.16.52.1 do STB3 - e isso significa que temos um pouco ambiente diferente em cada STB e cada vez que - digamos - carregar novos RootFS para serem usados nos STBs, precisamos editar manualmente algum arquivo de configuração e colocar o IP correto que o servidor tem que ser acessado deste STB em particular. Não é muito conveniente e propenso a erros!

Isso me fez pensar: e se simplesmente configurássemos essas três LANs como as mesmas 172.16.50.0/24? Do ponto de vista da STB (e do resto dos dispositivos na LAN), tudo deve ficar bem, mas e quanto ao ponto de vista do servidor?

Um servidor Linux pode ter N interfaces Ethernet diferentes, todas configuradas com o mesmo IP estático, mas cada uma conectada a uma LAN fisicamente separada?

    
por Leszek 15.07.2015 / 14:58

3 respostas

11

Sim, isso é possível, usando um belo recurso chamado network namespaces (consulte man ip-netns(8) ). Basicamente, oferece várias pilhas de rede distintas, cada uma com seu próprio conjunto de interfaces, rotas, etc.

Você precisaria criar um namespace para cada um dos seus STBs e, em seguida, poderia executar os serviços necessários separadamente em cada namespace.

Para os namespaces, você deve proceder da seguinte maneira:

  • Crie um namespace chamado net1 :

    ip netns add net1
    
  • Atribua sua interface ethX ao novo namespace e configure seu endereço IP 172.16.50.1:

    ip link set dev ethX netns net1
    ip netns exec net1 ip link set dev ethX up
    ip netns exec net1 ip address add 172.16.50.1/24 dev ethX
    

O endereço IP 172.16.50.1 não é visível a partir do seu namespace padrão. Um simples ping 172.16.50.1 não funciona, primeiro você precisa mudar para o namespace net1 e executar o comando lá:

ip netns exec net1 <command>

Desta forma, você pode agora executar cada serviço em cada um dos seus namespaces.

Se você se sentir aventureiro, poderá até tentar redirecionar de alguma forma todas as solicitações de seus STBs para um serviço central. Para isso, você precisa de um túnel de cada espaço de nomes para o seu namespace padrão (veja ip link help veth ) e algumas magias do iptables ...

    
por 16.07.2015 / 17:00
2

Tecnicamente você pode, mas a configuração seria colorida. Seria um kludge e exigiria que cada STB tivesse um IP exclusivo enquanto estivesse isolado em seu próprio fio para satisfazer sua necessidade. A configuração nos clientes não é alterada. Aqui está a configuração no servidor:

ifconfig eth0 10.0.50.1 netmask 255.0.0.0
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth0
route add 10.0.50.2 dev eth0
ifconfig eth1 10.0.50.1 netmask 255.0.0.0
route del -net 10.0.0.0 netmask 255.0.0.0 dev eth1
route add 10.0.50.3 dev eth1
# ...

Isso deve resultar em apenas um IP por interface na tabela de roteamento. Eles estão em fios separados, então não há interferência. Cada um desses dispositivos pensaria que eles estavam em um nó 2 10.0.0.0/8.

Quando o servidor quiser falar com 10.0.50.2, ele examinará a tabela ARP e, em seguida, a tabela de roteamento. Se a tabela ARP estiver vazia, a tabela de roteamento informa para enviar uma solicitação ARP na respectiva interface, portanto, eles devem ter IPs exclusivos ou o servidor só poderá falar com a última rota adicionada.

Você pode configurar seu servidor DHCP para atribuir IPs com base nos endereços de hardware ou executar um intervalo DHCP dinâmico separado em cada interface. O servidor DHCP pode distribuir qualquer coisa, mas 10.0.50.3 no fio eth0 não será alcançável.

    
por 23.09.2016 / 12:34
1

Você não pode usar o mesmo endereço IP em várias interfaces. Ele simplesmente não funcionará corretamente (normalmente só funcionará na última interface em que o IP foi atribuído).

Você precisa colocar as interfaces Ethernet em uma ponte e atribuir o endereço IP à própria ponte.

Essencialmente, todas as portas Ethernet nessa ponte funcionarão como um Switch.

Como alternativa, você pode remover todas as placas ethernet de cada STB e simplesmente adicionar um switch (que é mais escalonável do que adicionar novas placas ethernet em seu servidor).

Mas, como há um requisito para cada STB estar em seu próprio domínio de transmissão, receio que você precise manter sua configuração atual.

Ou para simplificar, pelo menos, a parte de hardware do servidor da sua configuração, elimine as várias placas ethernet e simplesmente adicione um switch gerenciado e use VLANs para simular as 'múltiplas placas ethernet' usando apenas uma placa ethernet física.

    
por 15.07.2015 / 15:15