Podman の CNI を IPv6 に対応してみる


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 も適切に設定されます。

参考


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください