mac0
내 호스트에 macvlan 네트워크 인터페이스를 만들었습니다 . 내 도커 컨테이너도 mac0
.
위 단계를 수행한 후에도 여전히 Docker 컨테이너에서 IP를 ping
얻을 수 없습니다 . mac0
그러나 다음 명령을 사용하여 호스트에 하나의 경로를 추가한 후:
ip route add <container_ip> dev mac0
mac0
내 컨테이너에서 IP를 성공적으로 ping할 수 있습니다 .
경로를 추가하기 전에 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는 독립형 프로토콜이 아닙니다. 이는 계층 3 주소를 계층 2 주소로 확인하기 위해 IP의 도우미 프로토콜로 사용됩니다. 기술적으로는 일반 프로토콜이지만 실제로는 항상 IPv4에만 사용되며 거의 IPv4의 일부로 간주될 수 있습니다. (그리고 비교를 위해 IPv6에서는 ICMPv6에서도 동일한 기능이 수행됩니다.~ 위에IP.)
ARP는 IP 구성을 얻는 데 사용되므로 IP 스택은 어떤 인터페이스가 어떤 ARP 응답을 받아야 하는지 결정하는 데 모든 권한을 갖습니다. 예를 들어 일부 운영 체제는 모든 인터페이스의 모든 주소에 대한 ARP 쿼리에 응답하지만 다른 운영 체제는 쿼리와 동일한 인터페이스의 주소로 응답을 제한합니다.(Linux에서는 "arp_ignore"를 변경하여 두 동작 중 하나를 선택할 수 있습니다.)
Linux에는 몇 가지 다른 ARP 제한이 있습니다.sysctls특히 하나는 arp_filter
활성화된 경우 요청자 IP 주소가 다른 인터페이스를 통해 라우팅된 경우 ARP 쿼리를 무시하도록 OS에 지시합니다. 이것은 귀하의 문제와 비슷한 것 같습니다.