仮想タブインターフェイスを介して仮想マシンを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をpingできます。

[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どこで修正を開始するのかわかりません。どんなアドバイスも本当にありがとうございます。完全なネットワーク設定情報は以下で確認できます。ホストによく似ているように、仮想マシンのグローバルアドレスを手動で設定しました。 1つはXXXb / 128、もう1つは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をpingしようとしたときにtcpdumpパケットを受信しないことに注意してください。最初のtcpdumpが示すように、パケットは最初にマルチキャストアドレスを要求するすべてのノードに送信されます。このアドレスはeth0(ローカルルーティングテーブルベース)を介してルーティングする必要がありますが、パケットがtcpdumpを介してeth0を通過するのを見たことはありません。現在net.ipv6.conf.all.forwarding=1net.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に設定

おすすめ記事