Estou trabalhando em um emulador de PDP-10 (consulte link ). O sistema operacional instalado dentro dele pode querer se comunicar com o mundo externo via IPv4 (que estava apenas começando a ser usado quando essas máquinas eram populares). Para isso, o emulador abre um filtro de pacotes (ou, alternativamente, um dispositivo de toque) na máquina host.
Suponha que você esteja em uma rede local, 10.0.0.x. O sistema operacional emulado pode usar um endereço IPv4 de, por exemplo, 10.0.0.51.
Para que outros hosts na mesma rede possam se comunicar com o host virtual, eles enviam solicitações de ARP para 10.0.0.51. Eu quero que o kernel Unix responda a essas solicitações para mim com um endereço ethernet sensato (que é chamado de proxy-ARP).
Para fazer o Unix fazer isso, o emulador faz (o equivalente a) "arp -s 10.0.0.51 01: 23: 45: 56: 78: 9A pub", onde o endereço Ethernet do sistema operacional hospedeiro é usado.
Em outros Unixen que no Linux, isso tem o efeito desejado. Se eu tentar fazer telnet ou ping para 10.0.0.51, vejo as solicitações ARP saírem do host emulado e as respostas voltam:
23:13:42.391941 ARP, Request who-has 10.0.0.51 tell 10.0.0.16, length 46
23:13:42.391954 ARP, Reply 10.0.0.51 is-at f6:2b:a4:a0:76:b0 (oui Unknown), length 28
No entanto, no Linux (eu tenho o Ubuntu 15.10), isso não funciona. A entrada aparece na tabela ARP com "arp -a", embora de uma maneira estranha:
? (10.0.0.51) at <from_interface> PERM PUB on eth0
Eu tentei alguns sysctls aparentemente relacionados para tentar ativar o proxy ARPing, como
net.ipv4.conf.all.proxy_arp = 1
net.ipv4.conf.default.proxy_arp = 1
net.ipv4.conf.eth0.proxy_arp = 1
e até mesmo
net.ipv4.ip_forward = 1
mas nada disso ajuda. O que estou perdendo?
Eu posso testar isso usando apenas o comando arp na caixa Linux, um tcpdump para observação e outra caixa para iniciar solicitações ARP. Quando eu o puser a funcionar, posso instalar qualquer passo extra necessário no emulador.
EDIT: aqui está um cenário simples para tentar, se você tem duas máquinas na mesma rede, uma das quais é o Linux:
sudo arp -s 10.0.0.51 01:23:45:56:78:9A pub
.
Você pode precisar substituir um endereço IP diferente se estiver usando uma rede local diferente; o endereço não deve existir, mas cabe dentro da sua rede. 192.168.0.51
poderia ser uma possibilidade.
Além disso, notei que o Ubuntu se recusou a aceitar endereços ethernet aleatórios, então você pode precisar substituir um endereço ethernet da interface eth0. sudo tcpdump -i eth0 arp
. Isso mostrará todas as solicitações e respostas ARP na rede. ping 10.0.0.51
(ou o endereço que você usou, é claro).
Resultado esperado: o comando running tcpdump deve mostrar Solicitações ARP e Respostas ARP.
Se isso não acontecer, gostaria de saber qual configuração é necessária para que isso aconteça. E se isso for específico do Ubuntu, talvez.
O ping
falhará (nenhum host com esse endereço IP está disponível), mas isso é irrelevante neste teste. Se ele diz ping: sendto: Host is down
, isso significa que não há resposta ARP.