IPv6転送はネットワークネームスペースでは機能しません。

IPv6転送はネットワークネームスペースでは機能しません。

次のように接続された3つのLinux仮想マシンがあります。

 /       server1         \
| ens19 2001:1::2         |
 \                       /
            |  
 /                       \
| ens19 2001:1::1         |
|        server2          |
| ens20 2001:2::1         |
 \                       /
            |
 /                       \
| ens19 2001:2::2        |
 \       server3         / 

server1で次のコマンドを実行します。

ip link set dev ens19 up
ip -6 address add 2001:1::2/96 dev ens19
ip -6 route add default via 2001:1::1

次に、server3で次のことを行います。

ip link set dev ens19 up
ip -6 address add 2001:2::2/96 dev ens19
ip -6 route add default via 2001:2::1

次に、server2で次のことを行います。

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
ip link set dev ens19 up
ip link set dev ens20 up
ip -6 address add 2001:1::1/96 dev ens19
ip -6 address add 2001:2::1/96 dev ens20

server1でserver3をpingしようとすると機能します。

root@server1:~# ping6 2001:2::2

しかし、server2のインターフェイスをネットワークネームスペースに移動すると、次のようになります。

ip netns add net1
ip link set dev ens19 netns net1
ip link set dev ens20 netns net1
ip netns exec net1 ip link set dev ens19 up
ip netns exec net1 ip link set dev ens20 up
ip netns exec net1 ip -6 address add 2001:1::1/96 dev ens19
ip netns exec net1 ip -6 address add 2001:2::1/96 dev ens20

server1からserver3へのpingは動作しなくなりました。パケットは転送されなくなりました。

なぜ? (注:IPv4のプロセスは同じです)

答え1

最初に完了したが完了していない2つのステップがあります。再び新しいネットワークネームスペースから:

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

このデフォルトの動作を変更できる比較的新しいネットワークスイッチで説明されているように、IPv4とIPv6の動作は異なります。devconf_inherit_init_net:

[...]
基本的に私たちは現在の動作:IPv4の場合、init_netのすべての現在の設定を継承します。IPv6の場合は、すべての設定をデフォルト値にリセットします。

したがって、新しいネットワーク名前空間では次のようになります。

  • IPv4転送は元のネットワーク名前空間から継承されます。初期ネットワークネームスペースでのみ実行されていたため、echo 1 > /proc/sys/net/ipv4/ip_forward新しいネットワークネームスペースもIPv4ルーターとして設定されます。

    したがって、IPv4で動作します。

  • IPv6リセットホストのデフォルトルータが初期ネットワーク名前空間で実行する操作ではありません(例:今後新しいネットワークネームスペースを作成してくださいsysctl -w net.core.devconf_inherit_init_net=1:)

新しいネットワーク名前空間で実行する不足している手順を追加するだけです(/proc/sys/net/ネットワーク名前空間を認識する必要があります)。 stdoutリダイレクトの使用は、いくつかの体操なしでは正しく機能しないため、専用コマンドを使用することをお勧めしますsysctl

ip netns exec net1 sysctl -w net.ipv6.conf.all.forwarding=1

関連情報