IPv6 ならコンテナ全部に IP アドレス振りたいですが、それができない環境だったのでポートフォワーディング(IP マスカレード)でやりくりする方法を調べました。
/etc/cni/net.d/87-podman-bridge.conflist
に以下の設定を書き込みます。(デフォルトのネットワーク以外を作成している場合は、同じディレクトリに別のファイルがあるのでそちらを変更してください)
IPv6 ULA のグローバルIDを決めておきます。fdxx:xxxx:xxxx::
の x の部分(グローバルID)をランダムな 16 進数に置き換えます。サブネットはひとまず 0000 (fdxx:xxxx:xxxx:0000::
)で設定ファイルの記述例を示します。
{
"cniVersion": "0.4.0",
"name": "podman",
"plugins": [
{
"type": "bridge",
"bridge": "cni-podman0",
"isGateway": true,
"ipMasq": true,
"hairpinMode": true,
"ipam": {
"type": "host-local",
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
],
"ranges": [
[
{
"subnet": "10.88.0.0/16",
"gateway": "10.88.0.1"
}
],
[
{
"subnet": "fdxx:xxxx:xxxx::/64"
}
]
]
}
}
]
}
次に以下のコマンドを打ちます。
sysctl -w net.ipv6.conf.all.forwarding=1
このコマンドは再起動すると元に戻るので、設定を永続化する場合は /etc/sysctl.d/
に設定ファイルを追加します。
net.ipv6.conf.all.forwarding=1
CNI の設定を反映する方法が不明だったので reboot します。(設定が消えないことの確認もかねて)
以上で IPv6 アドレスが振られます。ポートもマッピングされるので、外からも見えます。但し、ホストマシンから [::1]
宛てに接続した場合はポートフォワーディングがうまく適用されません。
dnsname も対応しているので、名前解決もできました。firewall も適切に設定されます。