让 Docker 监听服务器的 IPv6 地址,并将 IPv6 请求转发到正确的容器

让 Docker 监听服务器的 IPv6 地址,并将 IPv6 请求转发到正确的容器

我的服务器在 IPv4 和 IPv6 上运行。Docker 在(本地)IPv4 地址(即 192.168.100.1/24)上运行。我没有在内部启用 IPv6,daemon.json因为我知道这很麻烦,并且需要我拥有完整的 IPv6 /64 范围。

例如,反向代理 nginx docker 容器正在运行superuser.one——该 IP 可通过 IPv4 和 IPv6 访问。

# dig superuser.one +short a
85.17.140.73
# dig superuser.one +short aaaa
2001:1af8:4200:a003:1:aaaa:0:123

IPv6 正在运行:

# ping6 superuser.one -c 1
PING superuser.one(2001:1af8:4200:a003:1:aaaa:0:123 (2001:1af8:4200:a003:1:aaaa:0:123)) 56 data bytes
64 bytes from 2001:1af8:4200:a003:1:aaaa:0:123 (2001:1af8:4200:a003:1:aaaa:0:123): icmp_seq=1 ttl=57 time=19.5 ms

--- superuser.one ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 19.526/19.526/19.526/0.000 ms

但是,在访问 Web 服务器(或在 Docker 后面运行的其他服务)时,IPv6 不起作用:

# curl https://superuser.one -6 -I
curl: (7) Failed to connect to superuser.one port 443: Connection refused

尽管 IPv4 运行良好:

# curl https://superuser.one -4 -I
HTTP/2 200
server: nginx
date: Mon, 22 Feb 2021 15:10:37 GMT
[...]

如何让 Docker 监听服务器的 IPv6 地址并将请求转发到正确的容器(使用已设置的常规桥接或主机网络)?

编辑1:

ip -6 addrhttps://pastebin.com/zKkZW6CE

# docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
4ea1dddd3d64   0x04            bridge    local
c6ad6c596ec5   bridge          bridge    local
5d5ea78ff91f   host            host      local
7a03e7ecb430   matrix          bridge    local
20cb1fbc5dfe   matrix-coturn   bridge    local
684af653d87a   none            null      local

docker network inspect 0x04https://pastebin.com/tWYNyM3Y

编辑2:

我清除了我的daemon.json文件,因为我有以下内容:

"ipv6": true,
"fixed-cidr-v6": "fd00::/80"

这意味着我现在可以在桥接网络上正确运行 IPv4 和 IPv6 连接:

ipv4 和 ipv6 工作正常

但是,这似乎不适用于此--network选项。我的大多数容器都在自己的网络中运行。

答案1

您可以在创建容器期间声明一个正常的端口转发,使用

-p [2001:dead:beef::1]:22:22

这会在主机上创建一个 IPv6 套接字,并将其转发到容器内的 IPv4 套接字。

要监听任何 IPv6 地址,请使用[::]作为监听地址。

相关内容