![如何将 IPv6 端口 80/443 转发到 podman 容器?](https://linux22.com/image/756474/%E5%A6%82%E4%BD%95%E5%B0%86%20IPv6%20%E7%AB%AF%E5%8F%A3%2080%2F443%20%E8%BD%AC%E5%8F%91%E5%88%B0%20podman%20%E5%AE%B9%E5%99%A8%EF%BC%9F.png)
我最近将我的个人网络服务器容器化。但是,我现在注意到它不再通过 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 地址。