이웃 광고 메시지가 Linux 하위 인터페이스에서 나오지 않습니다.

이웃 광고 메시지가 Linux 하위 인터페이스에서 나오지 않습니다.

macvlaneth0을 상위 인터페이스로 사용하여 인터페이스를 만들었습니다 . eth0에 대한 NS 및 eth0의 NA 메시지는 볼 수 있지만 macvlan인터페이스에 대한 NA 메시지는 볼 수 없습니다. 그러나 게이트웨이에서 ping을 하면 macvlanNS 메시지는 볼 수 있지만 macvlanNA macvlan응답은 볼 수 없습니다. 이 문제를 해결하는 데 도움이 되는 구성은 무엇입니까? macvlan현재 eth0을 보는 방식으로 일반 NS 및 NA 메시지를 보고 싶습니다 . 네임스페이스가 생성되지 않습니다. 저는 전역 네임스페이스 자체 내에서 작업하고 있습니다.

또한 게이트웨이를 ping하려면 macvlan/etc/network/interfaces 파일에 "iface lo inet6 Loopback"을 넣어야 했습니다. 그렇지 않으면 ping6에서 -I를 명시적으로 사용하려고 할 때마다 macvlanping6이 소스를 . eth0에서 ping6으로 이동해도 macvlan작동하지 않습니다. Ping6은 항상 msg를 사용하여 소스 주소를 변경합니다. 예: -> "경고: 소스 주소는 macvlan1 이외의 장치에서 선택될 수 있습니다."

문제를 재현하려면 다음 코드 조각을 확인하세요.

ubuntu@vm0:~$ uname -r
3.13.0-36-generic
ubuntu@vm0:~$ ip -6 link                                                            
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 02:ec:39:e5:22:50 brd ff:ff:ff:ff:ff:ff
3: macvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/ether ce:99:a8:33:1e:5d brd ff:ff:ff:ff:ff:ff
ubuntu@vm0:~$ ip -6 address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8::3/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ec:39ff:fee5:2250/64 scope link 
       valid_lft forever preferred_lft forever
3: macvlan1@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
    inet6 2001:db8::8/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::cc99:a8ff:fe33:1e5d/64 scope link 
       valid_lft forever preferred_lft forever
ubuntu@vm0:~$ ip -6 route
2001:db8::/64 dev macvlan1  proto kernel  metric 256 
2001:db8::/64 dev eth0  proto kernel  metric 256 
2001:db8::/48 dev eth0  proto kernel  metric 256 
2001:db8::/48 dev macvlan1  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev macvlan1  proto kernel  metric 256 
default via 2001:db8::1 dev eth0  metric 1 
default via fe80::ec:39ff:fee5:22 dev eth0  metric 1024 
ubuntu@vm0:~$ ip -6 neighbor
2001:db8::1 dev macvlan1 lladdr 00:00:5e:00:01:00 router REACHABLE
2001:db8::1 dev eth0 lladdr 00:00:5e:00:01:00 router STALE
2001:db8::2 dev macvlan1  router FAILED
fe80::5e00:100 dev macvlan1 lladdr 00:00:5e:00:01:00 router STALE
fe80::5e00:100 dev eth0 lladdr 00:00:5e:00:01:00 router STALE
2001:db8::2 dev eth0 lladdr 00:00:5e:00:01:00 router DELAY
2001:db8::9 dev macvlan1 lladdr 6a:25:a8:4e:23:5d STALE

macvlan에서 eth0에 ping을 시도하면 ping6이 소스를 변경하고 다음 경고를 표시합니다.

ubuntu@vm0:~$ ping6 2001:db8::3 -I macvlan1
ping6: Warning: source address might be selected on device other than macvlan1.
PING 2001:db8::3(2001:db8::3) from 2001:db8::3 macvlan1: 56 data bytes
64 bytes from 2001:db8::3: icmp_seq=1 ttl=64 time=4.41 ms
64 bytes from 2001:db8::3: icmp_seq=2 ttl=64 time=0.548 ms
64 bytes from 2001:db8::3: icmp_seq=3 ttl=64 time=0.628 ms
64 bytes from 2001:db8::3: icmp_seq=4 ttl=64 time=0.546 ms
^C
--- 2001:db8::3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3053ms
rtt min/avg/max/mdev = 0.546/1.534/4.417/1.665 ms

macvlan에서 게이트웨이를 ping할 수 있습니다.

ubuntu@vm0:~$ ping6 2001:db8::1 -I macvlan1
PING 2001:db8::1(2001:db8::1) from 2001:db8::8 macvlan1: 56 data bytes
64 bytes from 2001:db8::1: icmp_seq=2 ttl=255 time=3.50 ms
64 bytes from 2001:db8::1: icmp_seq=3 ttl=255 time=1.63 ms
64 bytes from 2001:db8::1: icmp_seq=4 ttl=255 time=2.54 ms
64 bytes from 2001:db8::1: icmp_seq=5 ttl=255 time=1.26 ms
^C
--- 2001:db8::1 ping statistics ---
5 packets transmitted, 4 received, 20% packet loss, time 4041ms
rtt min/avg/max/mdev = 1.261/2.237/3.501/0.867 ms

eth0의 tcpdump는 다음과 같습니다

ubuntu@vm0:~$ sudo tcpdump -eni eth0 ip6
11:45:39.281934 00:00:5e:00:01:00 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 110: fe80::5e00:100 > ff02::1: ICMP6, router advertisement, length 56
11:45:40.105204 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
11:45:40.105975 02:ec:39:e5:22:50 > 00:00:5e:00:01:00, ethertype IPv6 (0x86dd), length 86: 2001:db8::3 > 2001:db8::2: ICMP6, neighbor advertisement, tgt is 2001:db8::3, length 32

하지만 macvlan에는 NS가 없습니다.

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on macvlan1, link-type EN10MB (Ethernet), capture size 65535 bytes
11:48:09.316865 00:00:5e:00:01:00 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 110: fe80::5e00:100 > ff02::1: ICMP6, router advertisement, length 56
11:48:10.197974 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32
11:48:20.220753 00:00:5e:00:01:00 > 33:33:ff:00:00:03, ethertype IPv6 (0x86dd), length 86: 2001:db8::2 > ff02::1:ff00:3: ICMP6, neighbor solicitation, who has 2001:db8::3, length 32


답변1

이렇게는 작동하지 않습니다

문제는 다음과 관련된 잘못된 라우팅 가정입니다.MACVLAN 작동 방식. MACVLAN의 주요 사용 사례는 네트워크 네임스페이스와 컨테이너입니다. 컨테이너의 경우에도 컨테이너가 MACVLAN 인터페이스를 사용하는 경우 호스트와 컨테이너 간 통신 문제가 있는 것으로 알려져 있다.

MACVLAN 인터페이스가 생성되면 상위 NIC 인터페이스는 MACVLAN 인터페이스에 할당된 추가 MAC 주소에서 패킷을 수신하고 MACVLAN 인터페이스(주로 IPv6의 경우 멀티캐스트)에 필요한 모든 추가 MAC 주소에서 패킷을 수신합니다.새로운 민주당멀티캐스트 대상에 대한 초기 쿼리). 네트워크 카드의 MAC 주소 필터링 테이블을 나열하는 방법을 모르지만 할당된 멀티캐스트 MAC 주소를 나열하는 데는 작동합니다 ip maddress. 그래서 ip maddress show dev eth0키우기 전과 후를 비교해보면macvlan1다음과 같은 추가 항목이 나타납니다.

    link  33:33:ff:33:1e:5d

이는 ce:99:a8:33:1e:5d / fe80::cc99:a8ff:fe33:1e5d/64(IPv4 ARP보다 개선됨)에 대한 IPv6 NDP 요청에 사용되는 이더넷 멀티캐스트 주소이기 때문입니다.방송). 추가 IPv6 주소 2001:db8::8/64를 추가하시겠습니까? NIC가 다음을 수신하려면 일치하는 새로운 이더넷 멀티캐스트 주소가 필요합니다.

    link  33:33:ff:00:00:08

이는 인터페이스 간에 관계가 있음을 보여주기 위한 것입니다. 프레임이 방출될 때macvlan1MAC 주소eth0을 통해이 패킷을 보지 못함이더넷 0IPv6 스택. 마지막 단계에서 MACVLAN 드라이버에 의해 직접 주입됩니다. 마찬가지로 답변을 받았을 때eth0에서MACVLAN의 예약된 주소(적어도 지금까지는 ce:99:a8:33:1e:5d기본 유니캐스트이고 IPv6 33:33:ff:33:1e:5d33:33:ff:00:00:08이더넷 멀티캐스트)에 대해 이더넷 프레임은 MACVLAN 드라이버에 의해 도난당하여 다음 위치에 배치됩니다.macvlan1대신 인터페이스. 따라서 뒤에 있는 IPv6 스택은이더넷 0이 패킷은 수신되지 않습니다.

쿼리를 수신하려고 할 때 어떤 일이 발생하는지 요약하려면이더넷 0그 뒤에 있는 네트워크 스택은 연결된 MACVLAN 인터페이스에 의해 방출됩니다.이더넷 0:

  • 프레임은 나타냅니다macvlan1방출하는 것입니다이더넷 0LAN으로
  • 프레임이 수신되지 않았습니다.이더넷 0
  • 대답하지 않았다

이러한 쿼리가 실제로 어떻게든 수신되고 실제로 어떻게든 응답한다고 상상해 보세요(여기에는 라우팅 문제가 있지만).

  • 이번엔 정말 선반이 일어섰다이더넷 0방출하는 것입니다이더넷 0LAN으로
  • 프레임이 수신되지 않았습니다.이더넷 0
  • 따라서 MACVLAN 드라이버가 프레임을 훔칠 수도 없고, MACVLAN이 프레임을 수신할 수도 없습니다.macvlan1
  • 응답을 받지 못했습니다.

이것은 만약에macvlan1네트워크 네임스페이스에 위치합니다. 참고:

ip netns add experiment
ip link set macvlan1 netns experiment

네임스페이스를 변경하면 인터페이스가 재설정되므로 구성을 다시 실행하세요.

ip -n experiment link set macvlan1 up
ip -n experiment address add 2001:db8::8/64 dev macvlan1

다음과 같이 ping을 수행합니다(위에서 언급한 것처럼 여전히 실패합니다).

ip netns exec experiment ping 2001:db8::3/64

네트워크 네임스페이스가 없으면 두 개의 인터페이스가 동일한 호스트에 있을 때(인터페이스에 관계없이 중요하지 않음) 자체에 속한 전역 IPv6 주소가 다른 IPv6 전역 주소에 도달하기 때문에 이는 자연스럽게 발생하지 않습니다. 모두 : 항상 지나갈 것입니다루오(루프백) 인터페이스:

# ip route get 2001:db8::3 from 2001:db8::8
local 2001:db8::3 from 2001:db8::8 dev lo table local proto kernel src 2001:db8::3 metric 0 pref medium

인터페이스로만 강제 실행평평한명령은 추가 라우팅 문제를 유발합니다.

그래서 쿼리에 응답하지 않는 좋은 이유와 인터페이스를 어떻게 사용해야 하는지, 왜 여전히 작동하지 않는지 설명했습니다.


이 문제는 어떻게 처리해야 합니까?

이것이 작동하려면(적어도 네트워크 네임스페이스의 경우 로컬 주소의 라우팅 문제에 관계없이) 외부 스위치가 프레임을 원래 위치에서 다시 보내야 합니다. 여기의 스위치는 구성에 따라 가상 머신을 실행하는 호스트 시스템일 수도 있고 실제 외부 스위치일 수도 있습니다.

이러한 스위치 설정(VEPA, 헤어핀...)을 구성하는 것이 실용적이지 않은 경우 한 가지 방법은 브리지 모드에서 MACVLAN 인터페이스를 생성하고 특정 주소 및 라우팅 설정을 사용하여 호스트의 브리지 모드에서 다른 MACVLAN 인터페이스를 추가하는 것입니다. 이렇게 하면 MACVLAN 드라이버가 통과할 필요가 없기 때문입니다.이더넷 0그러나 내부에서 처리되는 모든 사례는 하나의 가상 인터페이스에서 다른 가상 인터페이스로 정확하게 감지됩니다. 처음부터 시작하세요:

ip link add link eth0 name macvlan1 address ce:99:a8:33:1e:5d type macvlan mode bridge
ip netns add experiment
ip link set macvlan1 netns experiment
ip -n experiment link set macvlan1 up
ip -n experiment address add 2001:db8::8/64 dev macvlan1

ip link add link eth0 name macvlanhost up type macvlan mode bridge
ip address add 2001:db8::3/64 dev macvlanhost noprefixroute
ip route add 2001:db8::8/128 dev macvlanhost

아래 명령은 개인 정보 확장이 사용되는 경우에도 주소를 강제로 사용합니다(2001:db8::8에 대한 경로만 추가됨).macvlanhost):

ip netns exec experiment ping -I 2001:db8::8 2001:db8::3

이제 작동할 준비가 되었습니다. 더 많은 NS/NA를 확인해야 하는 경우 먼저 NDP 항목을 새로 고치십시오.

ip -6 neighbour flush dev macvlanhost
ip -n experiment -6 neighbour flush dev macvlan1

호스트에서 캡처:

tcpdump -e -n -s0 -p -i macvlanhost icmp6

또는 네임스페이스에서:

ip netns exec experiment tcpdump -e -n -s0 -p icmp6
 

물론 네트워크 네임스페이스실험이전과 마찬가지로 게이트웨이를 포함하여 LAN에 있는 모든 것과 계속 통신할 수 있지만 localhost의 서비스(즉, ::1자체 인스턴스로 사용) 와는 통신할 수 없습니다.루오인터페이스가 호스트와 다릅니다.루오인터페이스), 호스트와 통신할 때 약간 다르게 작동합니다.

관련 정보