在 Arch Linux ARM(Raspberry Pi)内核 4.4.37 上,我创建了一个 macvlan,例如
ip link add link eth0 mac0 type macvlan
然后 macvlan 虚拟 NIC 出现在列表中,因此我为其分配一个 IP 地址,并将链接状态设置为 up。(顺便说一句,我已尝试使用bridge
、vepa
和模式private
。)
然后,我可以从我的 Windows 客户端 ping 该 IP,但是当我在 Windows 中检查 ARP 缓存(arp -a
)时,它们显示与主(物理)网络适配器相同的 MAC 地址,而不是新创建的 macvlan MAC 地址。
我确保清除了 ARP 缓存,并尝试了客户端以前从未见过的 IP 地址等,但它总是显示错误的 MAC。
当我为 macvlan MAC 地址在 Windows 客户端创建一个静态 ARP 条目并 ping 相关 IP 地址时,tcpdump 显示在 macvlan 接口上传入的回显请求,并且它没有在主(物理)接口上显示任何内容,并且我在我的 Windows 客户端上收到了 ping 响应(一旦我记得设置 iptables 规则以允许流量!)
当我清除客户端上的 ARP 缓存并再次 ping 时,我仍然会收到 ping 响应,但这次 ARP 条目已恢复为 Linux 机器上主物理网络适配器的 ARP 条目。
我只是想知道我可能做错了什么?
答案1
为了使这个对我有用,我必须在接受的答案中添加一个步骤并设置以下附加变量:
net.ipv4.conf.all.rp_filter=2
我不需要设置arp_ignore
为 2,1 似乎有效。我也不需要arp_filter
为我的网络设置为 1。
所以对我来说完整的解决方案是:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.rp_filter=2
找到了我的问题的解决方案这里
答案2
基本上,这里没有什么问题。这就是 Linux 内核在 ARP 解析方面的工作方式 - 默认情况下,它会回复任何本地地址的 ARP 请求,无论这些请求来自哪个接口,即使请求的地址位于不同的接口上。
为了解决这个问题,您需要调整两个 sysctl 变量:
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
根据您的 IP 地址/子网划分方案,您可能需要将 arp_ignore 值更改为 2,并将 arp_filter 设置为 1。
有关这些变量可用选项的完整描述,请参阅kernel.org 文档。