1

ネットワーク名前空間から外部 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
4

1 に答える 1

4

ULA はルーティングできません

ネットワーク名前空間に一意のローカル アドレス (fc00::2) を指定しました。この IP アドレスは、グローバル インターネットではルーティングできず、ローカル ネットワークでのみルーティングできます。

ISP がこのアドレスからの ICMP パケットを受信すると、ドロップします。このパケットが ipv6.google.com に正常に到達したとしても、この IP アドレスのルートが発表されていないため、応答を返すことができない可能性があります。

ルーティング テーブルの問題 (NDP 通知)

次の行により、NDP 通知を受け取ります。

ip netns exec ns1 ip -6 route add default dev vpeer1

これは、(netns で) すべての IP アドレスがインターフェイスに直接接続されていることをカーネルに伝えvpeer1ます。カーネルは、この IP アドレスがイーサネット リンクに存在すると見なします。そのため、NDP を使用して MAC アドレスを解決しようとします。

代わりに、特定のルーターを介して到達可能であると言いたいです(この場合、ルーターはホストです):

ip netns exec ns1 ip -6 route add default dev vpeer1 via $myipv6

ソリューション

次のいずれかを実行できます。

  • (パブリック IPv6 プレフィックスの)パブリック IPv6 アドレスを netns に関連付け、ホスト上でこのアドレスの NDP プロキシをセットアップします

  • IPv6 プレフィックスをサブネット化し、サブネットをホストにルーティングします (可能な場合)。

  • NAT を使用します (悪い、醜い、そうしないでください)。

次のようなものを使用して、最初のものを達成できるはずです。

#!/bin/bash
set -x

myipv6=2001:470:1f14:10be::42
peeripv6=2001:470:1f14:10be::43

#Create the netns:
ip netns add ns1

# Create and configure the local veth:
ip link add name veth1 type veth peer name vpeer1
ip -6 address add $myipv6/128 dev veth1
ip -6 route add $peeripv6/128 dev veth1
ip li set dev veth1 up

# Setup vpeer1 in the netns:
ip link set dev vpeer1 netns ns1
ip netns exec ns1 ip link set dev lo up
ip netns exec ns1 ip -6 address add $peeripv6/128 dev vpeer1
ip netns exec ns1 ip -6 route add $myipv6/128 dev vpeer1
ip netns exec ns1 ip link set vpeer1 up    
ip netns exec ns1 ip -6 route add default dev vpeer1 via $peeripv6

# IP forwarding
sysctl -w net.ipv6.conf.default.forwarding=1

# NDP proxy for the netns
ip -6 neigh add proxy $myipv6 dev veth1
于 2016-04-05T23:33:40.750 に答える