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.
- 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
- A caixa do Linux vincula o novo endereço IP à interface virtual que o solicitou.
- Os PINGs estão funcionando nos dois sentidos:
- Ao fazer pingdeLinux para servidor, ele sai pela interface real (que está na mesma sub-rede IP)
- 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 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, conecte seus VIFs à ponte também.