
mac0
我在我的主機上建立了一個 macvlan 網路介面。我的 docker 容器還加入了 macvlan 網絡,該網絡具有與mac0
.
完成上述步驟後,我仍然無法從 docker 容器取得ping
我的IP。mac0
但是,使用以下命令將一條路由新增至我的主機後:
ip route add <container_ip> dev mac0
我可以mac0
從我的容器成功 ping ip。
在添加路線之前,我會先tcpdump -i mac0 host <mac0_ip>
看看發生了什麼。看起來 mac0 只是不回覆 ARP 請求:
#tcpdump -i mac0 host 21.26.21.104
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on mac0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:19:51.218288 ARP, Request who-has <host_name> tell 21.26.21.102, length 28
20:19:52.219645 ARP, Request who-has <host_name> tell 21.26.21.102, length 28
20:19:53.221646 ARP, Request who-has <host_name> tell 21.26.21.102, length 28
新增路由後:
#tcpdump -i mac0 host 21.26.21.104
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on mac0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:21:46.318010 ARP, Request who-has <host_name> tell 21.26.21.102, length 28
20:21:46.318033 ARP, Reply <host_name> is-at <mac> (oui Unknown), length 28
20:21:46.318038 IP 21.26.21.102 > <host_name>: ICMP echo request, id 750, seq 1, length 64
20:21:46.318062 IP <host_name> > 21.26.21.102: ICMP echo reply, id 750, seq 1, length 64
我知道macvlan子介面不能直接與父介面通訊。我不知道的是為什麼 ip 路由會影響我認為在 L2 網路層工作的 ARP 協定?
答案1
ARP 不是一個獨立的協定;它被IP用作輔助協議,以便將第3層位址解析為第2層位址。雖然從技術上講是通用協議,但它實際上始終僅用於 IPv4,幾乎可以被視為 IPv4 的一部分。 (作為比較,在 IPv6 中,ICMPv6 中完成了相同的功能,可以說是多於智慧財產.)
由於 ARP 用於取得 IP 配置,因此 IP 堆疊具有決定哪些介面應接收哪些 ARP 回應的完全權限。例如,某些作業系統將回應任何介面上任何位址的 ARP 查詢,而其他作業系統則將其限制為來自與查詢相同的介面的位址。(在 Linux 上,您可以透過變更「arp_ignore」來選擇任一行為。)
Linux 還有其他幾種 ARP 限制系統指令,特別是arp_filter
,如果啟用的話,如果請求者 IP 位址透過不同的介面路由,它會告訴作業系統忽略 ARP 查詢。這看起來和你的問題很像。