가상 탭 인터페이스를 통해 가상 머신을 IPv6 인터넷에 연결할 수 없습니다.

가상 탭 인터페이스를 통해 가상 머신을 IPv6 인터넷에 연결할 수 없습니다.

가상 머신을 IPv6 인터넷에 연결하는 데 문제가 있습니다.가상 탭 장비호스트 컴퓨터에서. 즉, ipv6.google.com 또는 공개 IPv6 호스트 전역 기본 인터페이스 주소를 ping할 수 없습니다. 전임자:

-bash-4.2$ ping6 ipv6.google.com
    PING ipv6.google.com(sea15s11-in-x0e.1e100.net) 56 data bytes
    From 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c icmp_seq=1 Destination unreachable: Address unreachable
    From 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c icmp_seq=2 Destination unreachable: Address unreachable
    From 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c icmp_seq=3 Destination unreachable: Address unreachable
    ^C
    --- ipv6.google.com ping statistics ---
    4 packets transmitted, 0

 received, +3 errors, 100% packet loss, time 3082ms

또는 호스트의 전역 ipv6 주소에 대해서도 동일한 오류가 발생합니다.

단순 토폴로지:

   router -----(eth0)----- host ----(tap device)---- vm

호스트의 이웃 검색에 문제가 있는 것 같습니다. 호스트의 Tap 엔드포인트에서 Tap 인터페이스를 tcpdump할 때 요청 메시지가 표시되지만 아무것도 반환되지 않습니다.

[user ~]$ sudo tcpdump ip6 -vv -i tp-0gn-0000go-0    
tcpdump: listening on tp-0gn-0000go-0, link-type EN10MB (Ethernet), capture size 262144 bytes
    01:45:16.596378 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c > ff02::1:ff00:200e: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has sea15s11-in-x0e.1e100.net
          source link-address option (1), length 8 (1): 02:fc:80:d4:52:b6
            0x0000:  02fc 80d4 52b6
    01:45:17.610410 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c > ff02::1:ff00:200e: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has sea15s11-in-x0e.1e100.net
          source link-address option (1), length 8 (1): 02:fc:80:d4:52:b6
            0x0000:  02fc 80d4 52b6
    01:45:18.634402 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 32) 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c > ff02::1:ff00:200e: [icmp6 sum ok] ICMP6, neighbor solicitation, length 32, who has sea15s11-in-x0e.1e100.net
          source link-address option (1), length 8 (1): 02:fc:80:d4:52:b6
            0x0000:  02fc 80d4 52b6

참고: 호스트에서 ipv6.google.com을 핑할 수 있습니다.

[user ~]$ ping6 ipv6.google.com
PING ipv6.google.com(sea15s11-in-x0e.1e100.net (2607:f8b0:400a:808::200e)) 56 data bytes
64 bytes from sea15s11-in-x0e.1e100.net (2607:f8b0:400a:808::200e): icmp_seq=1 ttl=39 time=9.93 ms
64 bytes from sea15s11-in-x0e.1e100.net (2607:f8b0:400a:808::200e): icmp_seq=2 ttl=39 time=10.1 ms
64 bytes from sea15s11-in-x0e.1e100.net (2607:f8b0:400a:808::200e): icmp_seq=3 ttl=39 time=10.1 ms

이웃들은 문제가 있는 것 같다는 것을 알아차렸습니다. DAD, NUD 또는 기타 문제에 직면하고 있는지 잘 모르겠습니다. 아니면 전혀 이웃 검색 문제가 아닐 수도 있습니다.

현재 에는 라우터만 있지만 ip -6 neigh show, 이웃 검색 캐시는 단지 캐시일 뿐이며 경로는 여전히 손상되지 않고 검색 가능해야 한다는 인상을 받았습니다(이것은 제가 이해한 범위가 매우 제한적임에도 불구하고). 어쩌면 일부 이웃 검색/광고 커널 매개변수가 누락된 것일까요?

[user ~]$ ip -6 neigh show
fe80::460:a1ff:fec3:9cb6 dev eth0 lladdr 06:60:a1:c3:9c:b6 router STALE 

여기에 일부 커널 매개변수가 누락된 것 같지만 net.ipv6어디서 수정을 시작해야 할지 잘 모르겠습니다. 어떤 조언이라도 대단히 감사하겠습니다. 전체 네트워크 설정 정보는 아래에서 확인할 수 있습니다. 호스트와 매우 유사하도록 가상 머신 전역 주소를 수동으로 구성했습니다. 하나는 XXXb/128이고 다른 하나는 XXXc/128입니다.

VM 엔드포인트 인터페이스:

-bash-4.2$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 02:fc:80:d4:52:b6 brd ff:ff:ff:ff:ff:ff
    inet 169.254.18.177/30 brd 169.254.18.179 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2600:1f14:680:xxxx:66a3:79d5:6c1d:14c/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::fc:80ff:fed4:52b6/64 scope link 
       valid_lft forever preferred_lft forever

관련 VM 경로는 다음과 같습니다.

-bash-4.2$ ip -6 r s
2600:1f14:680:6f00:66a3:79d5:6c1d:14c dev eth0  proto kernel  metric 256  pref medium
fe80::/64 dev eth1  proto kernel  metric 256  pref medium
fe80::/64 dev eth0  proto kernel  metric 256  pref medium
default dev eth0  metric 1024  pref medium

호스트 - 탭 및 주요 인터페이스는 다음과 같습니다.

[user ~]$ ip a s tp-0gn-0000go-0
2393: tp-0gn-0000go-0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether d2:d5:4e:f3:de:ab brd ff:ff:ff:ff:ff:ff
    inet 169.254.18.178/30 scope global tp-0gn-0000go-0
       valid_lft forever preferred_lft forever
    inet6 fe80::d0d5:4eff:fef3:deab/64 scope link 
       valid_lft forever preferred_lft forever
[user ~]$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 06:b6:f7:16:ac:04 brd ff:ff:ff:ff:ff:ff
    inet 172.30.255.4/28 brd 172.30.255.15 scope global dynamic eth0
       valid_lft 2994sec preferred_lft 2994sec
    inet6 2600:1f14:680:6f00:66a3:79d5:6c1d:14b/128 scope global dynamic 
       valid_lft 405sec preferred_lft 105sec
    inet6 fe80::4b6:f7ff:fe16:ac04/64 scope link 
       valid_lft forever preferred_lft forever

관련 경로:

[user ~]$ ip -6 r s
2600:1f14:680:6f00:66a3:79d5:6c1d:14b dev eth0 proto kernel metric 256 expires 389sec pref medium
2600:1f14:680:6f00:66a3:79d5:6c1d:14c dev tp-0gn-0000go-0 metric 1024 pref medium
2600:1f14:680:6f00::/64 dev eth0 proto kernel metric 256 pref medium
unreachable 3ffe:ffff::/32 dev lo metric 1024 error 4294967183 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fe80::460:a1ff:fec3:9cb6 dev eth0 proto ra metric 1024 expires 1798sec hoplimit 64 pref medium

ip6tables 필터는 모든 것을 허용합니다

[user ~]$ sudo ip6tables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

호스트는 centos/rhel/fedora, cat과 유사한 amazon-linux입니다 /etc/os-release.

NAME ="Amazon Linux"
VERSION="2"
ID_LIKE="centos rhel fedora"

어떤 조언이라도 대단히 감사하겠습니다. 필요한 정보나 개념적인 내용이 누락된 경우 알려주시기 바랍니다. 미리 감사드립니다.


업데이트: 또한 호스트의 eth0을 수신하고 VM에서 ipv6.google.com을 핑하려고 할 때 tcpdump 패킷을 수신하지 못한다는 점에 유의해야 합니다. 첫 번째 tcpdump에서 볼 수 있듯이 패킷은 먼저 멀티캐스트 주소를 요청하는 모든 노드로 전송됩니다. 이 주소는 eth0(로컬 라우팅 테이블 기반)을 통해 라우팅되어야 하지만 패킷이 tcpdump를 통해 eth0을 통과하는 것을 본 적이 없습니다. 현재 net.ipv6.conf.all.forwarding=1, net.ipv6.conf.all.accept_ra=2및 가 있습니다 net.ipv6.conf.all.accept_ra_from_local=1.


업데이트 #2: 나는 우연히 발견했다이것기사. VM에서 호스트의 eth0 전역 주소를 ping할 수 있는 net.ipv6.conf.all.proxy_ndp=1프록시 이웃을 추가 하고 추가했습니다. ip -6 neigh add proxy <host eth0 global ip6 addr> dev <tap device>가까워진 것 같은 느낌이 들지만 여전히 가상 머신에서 ipv6.google.com에 연결할 수 없습니다.


업데이트 #2.5: 이전 업데이트는 관련이 없는 것 같습니다. 문제의 핵심은 VM이 라우터에 대해 알지 못하기 때문에 글로벌 IPv6 주소를 얻기 위해 이웃 요청을 발행한다는 것입니다. 그럴 필요는 없을 것 같지만 그건 단지 내 직감일 뿐이다. 이웃 요청, 라우터 요청 및 에코 요청을 언제 보내야 하는지 명확하게 설명하는 좋은 리소스를 찾지 못했습니다.


업데이트 #3: 수동 주소 할당을 취소하고 VM이 DHCP 서버(EC2 vpc btw에 있음)와 통신하여 주소를 가져오도록 시도했습니다. 호스트에 DHCPv6 릴레이를 추가했는데, 릴레이 메시지가 DHCPv6 서버로 전송되고 다시 돌아오지 않는 것 같습니다. 다른 사람이 관심이 있다면 이에 대한 추가 정보/tcpdump를 기꺼이 게시하겠습니다.

답변1

제가 생각하는 잘못된 점과 해결 방법은 다음과 같습니다.

가상 머신 측

첫 번째 문제는 가상 머신에서 발생하는 문제입니다.

default dev eth0  metric 1024  pref medium

이로 인해 가상 머신의 라우팅 스택이 링크에서 직접 전체 인터넷에 사용 가능하다고 믿게 됩니다.이더넷 0. 그래서어느IPv6 대상은 NDP 요청을 보내지만 호스트를 포함한 어떤 것도 이에 응답하지 않습니다.

이 문제를 해결하기 위해 가상 머신은 호스트를 라우터로 사용하고 링크 로컬 주소를 사용합니다. 가상 머신에서 간단히 수동으로 구성할 수 있습니다.

ip -6 route delete default dev eth0
ip -6 route add default via fe80::d0d5:4eff:fef3:deab dev eth0

VM 측의 경우입니다.

가상 머신(및 호스트)의 대체 설정TP-0gn-0000go-0)

링크-로컬 주소를 사용하고 싶지 않은 경우(예: 호스트의 임의 MAC 주소로 인해 재부팅 시 주소가 변경될 수 있는 경우)TP-0gn-0000go-0), 호스트의 전역 IP 주소를 복사하여 이 작업을 수행할 수 있습니다.TP-0gn-0000go-0.

호스트에서 해당 IP 주소도 추가하세요.TP-0gn-0000go-0/128로(또는 noprefixroute/128 이상이 있는 경우):

ip -6 address add 2600:1f14:680:6f00:66a3:79d5:6c1d:14b/128 dev tp-0gn-0000go-0

위가 아닌 가상 머신에서:

ip -6 route delete default dev eth0
ip -6 route add 2600:1f14:680:6f00:66a3:79d5:6c1d:14b/128 dev eth0
ip -6 route add default via 2600:1f14:680:6f00:66a3:79d5:6c1d:14b dev eth0

호스트측(상위이더넷 0)

호스트 라우터에는 가상 머신이 존재하지 않기 때문에 호스트 자체 라우터는 가상 머신에 대해 알지 못합니다.이더넷 0옆. 인터넷의 패킷이 호스트의 라우터에 도달하면 다음을 수행합니다.이웃들은 주장한다, 그러나 호스트를 포함하여 아무것도 응답하지 않습니다(물론 라우터를 다른 방식으로 구성하여 모든 것을 단순화할 수 있는 경우는 제외). 호스트는 다음과 같이 구성되어야 합니다.ND 에이전트실제로 이 요청에 응답하면 결국 패킷이 호스트로 전송됩니다.

이렇게 하려면proxy_ndp존재하다이더넷 0,그리고proxy_ndp특정 NDP 프록시 항목을 추가합니다(인터페이스에서 활성화된 경우에만 유효함).

sysctl -w net.ipv6.conf.eth0.proxy_ndp=1
ip -6 neighbour add proxy 2600:1f14:680:6f00:66a3:79d5:6c1d:14c dev eth0

(이웃 에이전트 항목은 을 통해 표시 ip neighbour show proxy및 삭제할 수 있습니다 ip neighbour flush proxy. 기본적으로 를 통해 표시되거나 ip neighbour삭제되지 않습니다 ip neighbour flush all.)

이제 호스트는 패킷을 수신 2600:1f14:680:6f00:66a3:79d5:6c1d:14c하고 라우팅 테이블에 정의된 대로 가상 머신으로 라우팅합니다.


이제 양방향이 올바르게 전달됩니다. 제대로 작동할 것입니다.

나는 라우터 광고 데몬과 같은 것을 사용하려고 시도하지 않았습니다(radvd)는 다음과 관련되어 있으므로 가상 머신의 라우팅을 자동으로 구성합니다.SLAAC/64보다 작지 않은 작업에 사용해야 하는데 작동할지는 잘 모르겠습니다.


업데이트: @uMdRupert가 언급했듯이 전달이 활성화될 때마다( net.ipv6.conf.all.forwarding=1) 라우터 광고로 구성된 경우 호스트에도 이 설정이 필요합니다.

sysctl -w net.ipv6.conf.eth0.accept_ra=2

그 이유는 Linux IPv6 라우터가 기본적으로 경로 알림을 무시하기 때문입니다(이유는 이미 라우터로 구성되어 있으므로 이 구성을 변경할 필요가 없기 때문인 것 같습니다). 그러니 IPv6를 활성화하세요.앞으로라우터 알림(이 유형의 라우팅에 표시된 대로)을 통해 기본 경로를 수신하는 호스트에서는 proto ra [...] expires 1798sec잠시 후(또는 구성 변경 후 재부팅 시) 경로가 손실되어 연결할 수 없게 될 수 있습니다. 그러한 RA를 계속 수용하려면 이를 무시해야 합니다.이더넷 0통과accept_ra2로 설정.

답변2

브리지를 만들고 와 를 eth0연결할 수 있습니다 tp-0gn-0000go-0.

ip link add name br0 type bridge
ip link set dev br0 up
ip link set dev eth0 master br0
ip link set dev tp-0gn-0000go-0 master br0

(브릿지에 연결하면 IP가 손실되므로 주의하세요 eth0. 원격으로 이 작업을 수행하는 경우 IP를 얻을 수 있는지 확인해야 합니다.)

이 시점에서 다리가 건설되었습니다. 이제 사용 중인 방법에 관계없이 주소를 할당할 수 있습니다 eth0(SLAAC인 경우 아무것도 수행할 필요가 없음). DCHPv4인 경우 dhcp eth0...

가상 머신을 시작하면 준비가 완료됩니다.

관련 정보