如何將 IPv6 連接埠 80/443 轉送到 podman 容器?

如何將 IPv6 連接埠 80/443 轉送到 podman 容器?

我最近將我的個人網頁伺服器容器化。然而,我現在註意到它不再可以透過 IPv6 存取。連接埠映射(-p 80:80 -p 443:443 ) 僅適用於 IPv4:https://github.com/containers/podman/issues/4323

到目前為止,我已經透過新增以下內容成功地為 pod 取得了自己的 IPv6 ULA 位址:

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

到 /etc/cni/net.d/87-podman-bridge.conflist。所以現在我可以curl 'http://[fc01::1]'從主機本身。但我無法弄清楚ip6tables將公共 IP 上的請求轉發到容器的魔力。基於https://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)
  • 主機剛好有一個IP fdab:9bac:936f:1292::359 (不同的子網路)

然後存取位於 的 Web 伺服器容器fdab:9bac:936f:0ca2::443。如果容器中唯一運行的是 Web 伺服器,則這些是唯一的開放連接埠(80 和 443)。


直到最近,容器網路才啟用了跳過 NAT 的合理 IPv6 設定。我的閱讀問題podman 和 IPv6就是它CNI 插件具有定義IP位址分配和推送路由的功能。如果您選擇以這種方式進行容器網路。


ULA 並不理想。它不會透過互聯網路由。位址選擇策略的優先權低於 IPv4。

互聯網路由更好。不幸的是,您混淆了您的 IP 位址。

相關內容