我的服务器在 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
但是,当访问网络服务器(或 Docker 后面运行的其他服务)时,IPv6 不起作用:
# curl https://superuser.one -6 -I
curl: (7) Failed to connect to superuser.one port 443: Connection refused
Run Code Online (Sandbox Code Playgroud)
虽然 IPv4 工作正常:
# curl https://superuser.one -4 -I
HTTP/2 200
server: nginx
date: Mon, 22 Feb 2021 15:10:37 GMT
[...]
Run Code Online (Sandbox Code Playgroud)
如何让 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
Run Code Online (Sandbox Code Playgroud)
docker network inspect 0x04: https: //pastebin.com/tWYNyM3Y
编辑2:
我清除了我的daemon.json文件,因为我有以下内容:
"ipv6": true,
"fixed-cidr-v6": "fd00::/80"
Run Code Online (Sandbox Code Playgroud)
这意味着我现在可以在桥接网络上正确运行 IPv4 和 IPv6 连接:
然而,这似乎不适用于--network选项。我的大多数容器都在自己的网络中运行。
您可以在容器创建期间声明一个普通端口转发,使用
-p [2001:dead:beef::1]:22:22
Run Code Online (Sandbox Code Playgroud)
这会在主机上创建一个 IPv6 套接字,并将其转发到容器内的 IPv4 套接字。
要侦听任何 IPv6 地址,请用作[::]侦听地址。
| 归档时间: |
|
| 查看次数: |
11498 次 |
| 最近记录: |