我的服务器在 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 addr
:https://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 0x04
:https://pastebin.com/tWYNyM3Y
编辑2:
我清除了我的daemon.json
文件,因为我有以下内容:
"ipv6": true,
"fixed-cidr-v6": "fd00::/80"
这意味着我现在可以在桥接网络上正确运行 IPv4 和 IPv6 连接:
但是,这似乎不适用于此--network
选项。我的大多数容器都在自己的网络中运行。
答案1
您可以在创建容器期间声明一个正常的端口转发,使用
-p [2001:dead:beef::1]:22:22
这会在主机上创建一个 IPv6 套接字,并将其转发到容器内的 IPv4 套接字。
要监听任何 IPv6 地址,请使用[::]
作为监听地址。