IPv6 ポート 80/443 を podman コンテナーに転送するにはどうすればよいですか?

IPv6 ポート 80/443 を podman コンテナーに転送するにはどうすればよいですか?

最近、個人用 Web サーバーをコンテナ化しました。しかし、IPv6 経由でアクセスできなくなっていることに気づきました。ポート マッピング ( -p 80:80 -p 443:443) は IPv4 でのみ機能します。https://github.com/containers/podman/issues/4323

これまで、私はポッドに独自のIPv6 ULAアドレスを追加することで取得することができました。

          [
            {
              "subnet": "fc01::/48",
              "gateway": "fc01::1"
            }
          ]

/etc/cni/net.d/87-podman-bridge.conflistに。これでホスト自体から実行できるようになりました。しかし、パブリックIPのリクエストをコンテナに転送する魔法がcurl 'http://[fc01::1]'わかりません。ip6tableshttps://www.tldp.org/HOWTO/Linux+IPv6-HOWTO/ch18s04.html、 私はもう試した

# ip6tables -t nat -A POSTROUTING -o eth0 -s fc01::1/48 -j MASQUERADE
# ip6tables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination '[fc01::1]:80'
# ip6tables -A FORWARD -i eth0 -o cni-podman0 -p tcp --dport 80 -j ACCEPT

これらのコマンドのさまざまなサブセットを実行しましたが、タイムアウトになるか、「ホストへのルートがありません」というメッセージが表示されます。

私の住所は次のようになります:

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether f2:3c:91:c8:5b:d9 brd ff:ff:ff:ff:ff:ff
    inet <PUBLIC IPv4>/24 brd <BROADCAST> scope global eth0
       valid_lft forever preferred_lft forever
    inet6 <PUBLIC IPv6>/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 2591999sec preferred_lft 604799sec
    inet6 fe80::f03c:91ff:fec8:5bd9/64 scope link 
       valid_lft forever preferred_lft forever
3: cni-podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether b6:58:df:4b:b9:71 brd ff:ff:ff:ff:ff:ff
    inet 10.88.0.1/16 brd 10.88.255.255 scope global cni-podman0
       valid_lft forever preferred_lft forever
    inet6 fc01::1/48 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::b458:dfff:fe4b:b971/64 scope link 
       valid_lft forever preferred_lft forever
4: vethb4059020@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master cni-podman0 state UP group default 
    link/ether d6:5d:37:f2:0c:48 brd ff:ff:ff:ff:ff:ff link-netns cni-26c430c8-c816-8962-b2f2-b3bbb5274f93
    inet6 fe80::d45d:37ff:fef2:c48/64 scope link 
       valid_lft forever preferred_lft forever

答え1

いいえ、ポート転送は必要ありません。コンテナは一意のIPアドレスを取得します。宛先はないザ・ホスト。

例えば、次のようにします。

  • あなたのランダムに生成されたULAネットワーク だったfdab:9bac:936f::/48
  • fdab:9bac:936f:0ca2::/64コンテナのホストに渡される
  • ルート テーブルは、コンテナ サブネットを適切なホストに転送します。
  • fdab:9bac:936f:0ca2::443この Web サーバー コンテナーに割り当てられます(静的アドレス指定によるバニティ IP)
  • fdab:9bac:936f:1292::359 ホストのIPが(異なるサブネット)である

次に、 の Web サーバー コンテナーにアクセスしますfdab:9bac:936f:0ca2::443。コンテナー内で実行されているのが Web サーバーだけである場合、開いているポートはこれらだけです (80 と 443)。


コンテナネットワークがNATをスキップする健全なIPv6構成を可能にしたのはごく最近のことだ。私の解釈では、podman と IPv6それはCNIプラグインIP アドレスの割り当てを定義し、ルートをプッシュする機能があります。その方法でコンテナ ネットワークを実行することを選択した場合。


ULA は理想的ではありません。インターネット経由でルーティングされません。アドレス選択ポリシーは IPv4 よりも低い優先順位に設定されています。

インターネット ルーティング可能な方が適しています。残念ながら、IP アドレスが難読化されています。

関連情報