Como configurar o roteamento interno entre interfaces virtuais e interface ethernet real (Linux)

3

Eu tenho uma caixa Linux com uma interface Ethernet real (como oposta ao virtual, a.k.a. aliased) que eu posso usar (eth0 é usada para outros propósitos - não posso usá-la, nem posso adicionar mais NICs). Digamos que seja eth1

Eu preciso controlar alguns objetos / entidades via SNMP, então eu configurei uma interface Ethernet virtual para cada objeto, com seu endereço MAC apropriado. Eu faço isso por (exemplo para vif1):

ip -family inet link add link eth1 name vif1 address <the MAC addr> type macvlan
ip link set vif1 up multicast on
ip route del default dev vif1 table main /* enable the pings/TFTP going out! */
ip route add default via 192.168.1.1 table main proto static metric /* restore orig */

eth1, vif1, vif2, ... todos obtêm endereços IP de um único servidor DHCP (remoto). Todos esses endereços IP estão, é claro, na mesma sub-rede IP, digamos 10.11.1.0/24

Problema: o ping da caixa do Linux para o servidor DHCP (digamos 10.11.1.1) funciona. ping da máquina do servidor DHCP para eth1 IP ou qualquer vif # X IP funciona, MAS ( o questão, suponho ...) apenas a eth1 responde aos pacotes ICMP (verificados pelos contadores ifconfig e pelo wireshark sniffing) Esse problema causa a incapacidade de se conectar aos agentes SNMP associados aos endereços IP das interfaces vif.

Eu estou supondo que eu preciso configurar o roteamento interno para que os pacotes IP cheguem ao seu destino vif # X. Eu tentei adicionar uma regra ip, com uma nova tabela de roteamento ip, mas provavelmente não defini-lo (a nova tabela) corretamente ... Qualquer um pode me dizer como (e de preferência também por quê) fazer isso?

A caixa do Linux roda o Ubuntu9.04 e o servidor DHCP executa o Windows XP SP3

    
por DaGN 18.11.2011 / 03:59

2 respostas

2

Resolvido, finalmente: é uma questão relacionada ao ARP.

  1. O servidor DHCP atribui um endereço IP ao endereço MAC da interface virtual e define esse par na tabela ARP local do servidor
  2. A caixa do Linux liga o novo endereço IP à interface virtual que o solicitou.
  3. Os PINGs estão trabalhando nos dois sentidos:
  4. Ao pingar do Linux para o servidor, ele passa pelo real interface (que está na mesma sub-rede IP)
  5. Ao pingar do servidor para Linux, novamente a interface real responde, então parece como se está tudo bem ...

MAS

Quando o servidor envia pacotes IP (no meu caso, mensagens SNMP), ele usa o endereço MAC da interface virtual. Quando chega à caixa do Linux, o kernel simplesmente descarta esses frames, já que não sabe como encaminhá-los; A execução do Wireshark exibe essas mensagens, pois geralmente a interface é colocada em modo promíscuo

Para fazer com que as mensagens SNMP atinjam o agente SNMP que é ligado à interface virtual, o pacote IP deve ter o endereço MAC da interface real (acho que só então o kernel faz o roteamento da VLAN , com base no endereço IP ...)

A maneira de conseguir isso é enviar uma solicitação gratuita ARP da caixa do Linux interface real para o servidor, informando que o endereço IP recém-atribuído (a uma das interfaces virtuais ...) é "propriedade" do endereço MAC da interface real. Isso atualiza a tabela ARP do servidor corretamente.

BTW, isso também explica por que esperar algum tempo antes de iniciar o tráfego do SNMP funciona: a entrada da tabela ARP do servidor está com o tempo vencido, então o servidor envia uma solicitação ARP que é respondida corretamente pelo < interface strong> real

    
por 01.02.2012 / 16:19
0

Por que você não configura um dispositivo de ponte? brctl addbr bridge Adicione o IP e o MAC do dispositivo físico a essa ponte, mova o dispositivo sem IP-para a ponte e, em seguida, anexe seus VIFs à ponte também.

    
por 26.12.2011 / 22:06