IPv6オーバーレイネットワークを作成するには?

IPv6オーバーレイネットワークを作成するには?

両方のホストにホスト専用のIPv6ネットワークを作成し、ホスト間でルーティングしたいと思います。各ホストには仮想インターフェイスがあります ipv6_prefix::9。インターフェイスにpingを送信できるようにしたいです。 その他マスター。

証明されたベストプラクティスはありますか? 6'4トンネルでこれを行うのは合理的です。

以下では、トンネリングに6in4を使用して、最近EC2で試した設定を見てみましょう。両方のホスト10.239.143.35はとです10.238.249.113。まず、仮想インターフェイスを設定しましょう。私たちは次のBash機能を使います:

function dummy {
  local name="$1" ipv6="$2"
  ip link add "$name" type dummy
  ip -6 addr add "$ipv6" dev "$name"
  ip link set "$name" up
}

function calc6to4 {
  printf '2002:%02x%02x:%02x%02x::\n' $(tr '.' ' ' <<<"$@")
}

function eth0ipv4 {
  ip addr list dev eth0 | egrep -o 'inet [^/]+' | head -n1 | cut -d' ' -f2
}

(シェルセッションに直接貼り付けることができます。)

最初のホストでは、次を実行します。

:;  ipv4="$(eth0ipv4)"
:;  ipv6="$(calc6to4 "$ipv4")"
:;  echo "ipv4 = $ipv4" "ipv6 = $ipv6"
ipv4 = 10.239.143.35 ipv6 = 2002:0aef:8f23::
:;  dummy dummy9 "$ipv6"9
:;  ip addr show dev dummy9
69: dummy9: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 
    link/ether e2:69:75:10:04:2c brd ff:ff:ff:ff:ff:ff
    inet6 2002:aef:8f23::9/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::e069:75ff:fe10:42c/64 scope link 
       valid_lft forever preferred_lft forever

Pingが正常に動作しているようです。

:;  ping6 -q -c1 "$ipv6"9
PING 2002:0aef:8f23::9(2002:aef:8f23::9) 56 data bytes

--- 2002:0aef:8f23::9 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.040/0.040/0.040/0.000 ms

これで2番目のホストに接続します。

:;  ipv4="$(eth0ipv4)"
:;  ipv6="$(calc6to4 "$ipv4")"
:;  echo "ipv4 = $ipv4" "ipv6 = $ipv6"
ipv4 = 10.238.249.113 ipv6 = 2002:0aee:f971::
:;  dummy dummy9 "$ipv6"9

pingの確認結果:

:;  ping6 -q -c1 "$ipv6"9
PING 2002:0aee:f971::9(2002:aee:f971::9) 56 data bytes

--- 2002:0aee:f971::9 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms

今興味深い時間が来ました。ホストを6in4トンネルに接続することです。両方のホストで次のBash機能を使用します。

function tunnel {
  local name="$1" self_ipv4="$2" ipv4="$3" ipv6="$4"
  ip tunnel add "$name" mode sit ttl 64 remote "$ipv4" local "$self_ipv4"
  ip -6 addr add "$ipv6"1 dev "$name"
  ip -6 route add "$ipv6"/64 dev "$name" metric 1
  ip link set "$name" up
}

最初のホストでは:

################################### IPv4 and IPv6 from host 2 ##
:;  tunnel tun6in4 10.239.143.35 10.238.249.113 2002:0aee:f971::

2番目について:

################################### IPv4 and IPv6 from host 1 ##
:;  tunnel tun6in4 10.238.249.113 10.239.143.35 2002:0aef:8f23::

最初のホストから2番目の仮想デバイスへのバインディングまでのパスを見つけようとすると、次の2002:aee:f971::9ような結果が得られます。

:;  ip -6 route get 2002:aee:f971::9
2002:aee:f971::9 from :: dev tun6in4  src 2002:aee:f971::1  metric 0 
    cache 

しかし、pingは機能しません。

:;  ping6 -q -c1 2002:aee:f971::9
PING 2002:aee:f971::9(2002:aee:f971::9) 56 data bytes

--- 2002:aee:f971::9 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

住所を追加する必要がありますかeth0

答え1

簡単なpingテストが機能するには、トンネルの宛先ホスト(ピア)ではなくソースホストにIPv6アドレスが必要です。

function tunnel {
  local name="$1" self_ipv4="$2" self_ipv6="$3" ipv4="$4" ipv6="$5"
  ip tunnel add "$name" mode sit ttl 64 remote "$ipv4" local "$self_ipv4"
  ip -6 addr add "$self_ipv6"1 dev "$name"
  ip -6 route add "$ipv6"/64 dev "$name" metric 1
  ip link set "$name" up
}

トンネル設定コマンドは次のとおりです。

:;  tunnel tun6in4 10.239.143.35 2002:0aef:8f23:: 10.238.249.113 2002:0aee:f971::
:;  tunnel tun6in4 10.238.249.113 2002:0aee:f971:: 10.239.143.35 2002:0aef:8f23::

関連情報