ネットワーク名前空間から外部 IPv6 アドレスに到達する必要があります。
私のホストでは、IPv6 パケットのトンネリングを行い、デフォルト インターフェイス (eth0) 経由で送信する SIT トンネル (IPv6-in-IPv4) をセットアップしました。SIT トンネルは、Hurricane Electric トンネル ブローカー サービスに依存しています。ホストから外部 IPv6 アドレスに ping を実行できます。
$ ping6 ipv6.google.com
PING ipv6.google.com(lis01s13-in-x0e.1e100.net) 56 data bytes
64 bytes from lis01s13-in-x0e.1e100.net: icmp_seq=1 ttl=57 time=98.1 ms
64 bytes from lis01s13-in-x0e.1e100.net: icmp_seq=2 ttl=57 time=98.7 ms
トンネルの詳細は次のとおりです。
$ ip -6 route sh
2001:470:1f14:10be::/64 dev he-ipv6 proto kernel metric 256
default dev he-ipv6 metric 1024
ここが興味深い部分です。この質問の範囲外の理由により、ネットワーク名前空間内から同じこと (ping ipv6.google.com) を行う必要があります。
ネットワーク名前空間を作成してセットアップする方法は次のとおりです。
ns1.sh
#!/bin/bash
set -x
if [[ $EUID -ne 0 ]]; then
echo "You must run this script as root."
exit 1
fi
# Create network namespace 'ns1'.
ip netns del ns1 &>/dev/null
ip netns add ns1
# Create veth pair.
ip li add name veth1 type veth peer name vpeer1
# Setup veth1 (host).
ip -6 addr add fc00::1/64 dev veth1
ip li set dev veth1 up
# Setup vpeer1 (network namespace).
ip li set dev vpeer1 netns ns1
ip netns exec ns1 ip li set dev lo up
ip netns exec ns1 ip -6 addr add fc00::2/64 dev vpeer1
ip netns exec ns1 ip li set vpeer1 up
# Make vpeer1 default gw.
ip netns exec ns1 ip -6 route add default dev vpeer1
# Get into ns1.
ip netns exec ns1 /bin/bash --rcfile <(echo "PS1=\"ns1> \"")
次にns1.sh
、「ns1」から veth1 (fc00::1) vpeer1 (fc00::2) を実行して ping します。
ns1> ping6 fc00::1
PING fc00::1(fc00::1) 56 data bytes
64 bytes from fc00::1: icmp_seq=1 ttl=64 time=0.075 ms
^C
ns1> ping6 fc00::2
PING fc00::2(fc00::2) 56 data bytes
64 bytes from fc00::2: icmp_seq=1 ttl=64 time=0.056 ms
ただし、外部 IPv6 アドレスに ping を実行しようとすると、次のようになります。
ns1> ping6 2a00:1450:4004:801::200e
PING 2a00:1450:4004:801::200e(2a00:1450:4004:801::200e) 56 data bytes
^C
--- 2a00:1450:4004:801::200e ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1008ms
すべてのパケットが失われます。
tcpdump でveth1を開き、何が起こっているのかを確認しました。私が見ているのは、近隣要請パケットがインターフェイスに到達していることです。これらのパケットは、IPv6 宛先アドレスの MAC アドレスを解決しようとしています。
$ sudo tcpdump -qns 0 -e -i veth1
IPv6, length 86: fc00::2 > ff02::1:ff00:200e: ICMP6, neighbor solicitation,
who has 2a00:1450:4004:801::200e, length 32
IPv6, length 86: fc00::2 > ff02::1:ff00:200e: ICMP6, neighbor solicitation,
who has 2a00:1450:4004:801::200e, length 32
なぜこれが起こっているのかよくわかりません。ホストでもIPv6転送を有効にしましたが、効果はありませんでした:
$ sudo sysctl -w net.ipv6.conf.default.forwarding=1
この質問を読んでくれてありがとう。提案を歓迎します:)
編集:
ホストのルーティング テーブル:
2001:470:1f14:10be::/64 dev he-ipv6 proto kernel metric 256
fc00::/64 dev veth1 proto kernel metric 256
default dev he-ipv6 metric 1024
NDP 要請を解決する NDP プロキシをホストに追加しました。それでもアドレスはnsnetから到達できません(これを調べてください):
sudo sysctl -w net.ipv6.conf.all.proxy_ndp=1
sudo ip -6 neigh add proxy 2a00:1450:4004:801::200e dev veth1