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

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

Eu tenho uma caixa Linux com uma interface Ethernet real (em oposição à virtual, também conhecida como alias) que posso usar (eth0 é usada para outros fins - não posso usá-la, nem posso adicionar mais NICs). Diga que é eth1

Preciso controlar alguns objetos/entidades via SNMP, então configurei uma interface Ethernet virtual para cada objeto, com seu endereço MAC apropriado. Eu faço isso (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, obviamente, na mesma sub-rede IP, digamos 10.11.1.0/24

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

Suponho que preciso configurar o roteamento interno para que os pacotes IP cheguem ao seu destino vif#X. Tentei adicionar uma regra de IP, com uma nova tabela de roteamento de IP, mas provavelmente não a configurei (a nova tabela) corretamente... Alguém pode me dizer como (e de preferência também por que) fazer isso?

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

Responder1

Finalmente resolvido: é um problema relacionado ao ARP.

  1. O servidor DHCP atribui um endereço IP ao endereço MAC da interface virtual e define este par na tabela ARP local do servidor
  2. A caixa do Linux vincula o novo endereço IP à interface virtual que o solicitou.
  3. Os PINGs estão funcionando nos dois sentidos:
  4. Ao fazer pingdeLinux para servidor, ele sai pela interface real (que está na mesma sub-rede IP)
  5. Ao executar ping do servidorparaLinux, novamente a interface real responde entãoparececomo se estivesse 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 à máquina Linux, o kernel apenas descarta esses frames, pois não sabe como encaminhá-los; Executar o Wireshark exibe essas mensagens já que normalmente a interface é colocada em modo promíscuo

Para que as mensagens SNMP cheguem ao agente SNMP que está vinculado à interface virtual, o pacote IP deve ter oendereço MAC da interface real(Acho que só então o kernel faz o roteamento de VLAN, baseado no endereço IP...)

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

Aliás, isso também explica por que esperar algum tempo antes de iniciar o tráfego SNMP funciona: a entrada da tabela ARP do servidor expirou, então o servidor envia uma solicitação ARP que é respondidacorretamentepelointerface real

Responder2

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

informação relacionada