我正在开发一个PDP-10仿真器(参见https://github.com/Rhialto/klh10 )。安装在它内部的操作系统可能希望通过IPv4与外部世界通信(当这些机器流行时,该系统才刚刚开始使用)。为此,模拟器在主机上打开一个包过滤器(或者是一个抽头设备)。
假设您在本地网络上,10.0.0.x。模拟操作系统可以使用一个IPv4地址,例如10.0.0.51。
为了使同一网络上的其他主机能够与虚拟主机通信,它们发送ARP请求10.0.0.51。我希望Unix内核用一个合理的以太网地址(称为proxy-ARP)来响应这些请求。
为了让Unix做到这一点,模拟器执行(相当于) "arp -s 10.0.51 01:23:45:56:78:9A发布“,其中使用主机OS的以太网地址。
在Linux以外的其他Unixen上,这具有所需的效果。如果我试图将telnet或ping发送到10.0.0.51,则会看到模拟主机发出ARP请求,然后回复如下:
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但是,在Linux (我有Ubuntu15.10)上,这是行不通的。该条目确实显示在带有"arp -a“的ARP表中,但以一种奇怪的方式显示:
? (10.0.0.51) at <from_interface> PERM PUB on eth0我尝试了几个看似相关的sysctl来尝试启用代理ARPing,例如
net.ipv4.conf.all.proxy_arp = 1
net.ipv4.conf.default.proxy_arp = 1
net.ipv4.conf.eth0.proxy_arp = 1甚至
net.ipv4.ip_forward = 1但这些都没有用。我遗漏了什么?
我可以使用Linux框上的arp命令、用于观察的tcpdump和启动ARP请求的另一个框来测试这一点。当我让它开始工作时,我可以在模拟器中安装任何必要的额外设置步骤。
编辑:下面是一个简单的尝试场景,如果您在同一网络上有两台计算机,其中一台是Linux:
sudo arp -s 10.0.0.51 01:23:45:56:78:9A pub。如果您使用的是不同的本地网络,则可能需要替换不同的IP地址;该地址不应该存在,而应该适合您的网络。192.168.0.51可能是一种可能性。另外,我注意到Ubuntu拒绝接受随机以太网地址,因此您可能需要替换eth0接口的以太网地址。sudo tcpdump -i eth0 arp。这将显示网络上的所有ARP请求和答复。ping 10.0.0.51 (当然也可以是您使用的地址)。预期结果:运行的tcpdump命令应该显示ARP请求和ARP回复。如果没有,我想知道需要什么样的设置才能实现。如果这是专门针对Ubuntu的。ping最终将失败(该IP地址没有可用的主机),但这在本测试中并不重要。如果它说的是ping: sendto: Host is down,就意味着它知道没有回复。发布于 2019-12-20 14:03:59
我也遇到过同样的问题。原来瑞·F·里贝罗是对的,我错过了应该被代理的IP入口的路线。
arp -i eth0 -sD 192.168.8.10 eth0 pub
ip route add 192.168.8.10 via tun5只有在ip路由命令之后,arp请求才会被回复。
我还没有找到能明确提到这一点的文档(我基本上是在跟踪https://help.ubuntu.com/community/SSH_VPN )。
https://unix.stackexchange.com/questions/250800
复制相似问题