O Linux não faz proxy-arp para mim, apesar da documentação sugerir que não

5

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:

  1. Na caixa do Linux, faça 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.
  2. Na mesma caixa ou em outra, sudo tcpdump -i eth0 arp . Isso mostrará todas as solicitações e respostas ARP na rede.
  3. Em outra caixa, que pode ser um sistema operacional diferente, faça 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.
por Rhialto 21.12.2015 / 23:51

0 respostas