ipv6 访问 docker 最优雅的姿势是啥?

2023-07-25 09:34:28 +08:00
 sadfQED2

背景:我自己家里的 nas ,有 ipv6 ,没有公网 ipv4 ,在外想通过 ipv6 访问容器内的服务。

问题:netstat 命令看了下,docker 只监听了 v4 端口,没监听 v6 端口。

查到的方案:

1.https://docs.docker.com/config/daemon/ipv6/ 开启 docker 的 ipv6 ,但这踏马竟然是实验性功能??? docker 这么成熟的东西,ipv6 的支持竟然还在实验?而且他这个支持,并不是我需要的,他这个是给每个容器分配不同的 ipv6 ,外网通过容器 ip 访问。那我人在外,我踏马怎么知道容器 ip 是多少啊

2.通过 haproxy 转发一下,把 ipv6 端口流量转到 v4 端口上,增加了架构复杂度,以后维护麻烦。

因此上来问问各种运维大哥,有没有什么优雅一点的姿势啊。

@ssh 大哥(不记得你 id 了)

7187 次点击
所在节点    DevOps
49 条回复
sadfQED2
2023-07-25 15:35:51 +08:00
@JensenQian 不是,我并不需要 ddns ,我不需要域名。我直接用 ipv6 的地址连回来就行了。

我仔细研究了上面提到的路由器转发,这样结果变成了请求路由器 ip ,然后转发到 nas 。这样搞的话需要我访问 openwrt 地址,然后转发过去。

但是我有注册中心,nas 会实时上报自己的 ip 到注册中心,我 vpn 实时从注册中心拉取地址,拉到的是 nas 地址,搞成路由器地址就废了
sadfQED2
2023-07-25 15:36:29 +08:00
@leonshaw 是的,就是这个问题。我就是想问问有啥优雅的办法解决
defunct9
2023-07-25 15:51:54 +08:00
听到有人在叫我。

换我来干的话,也是前面架个 nginx+ipv6 ,因为 k8s 就这么干的,学就是了。

那复杂一点的搞法就是用 wg 直连到我自己的 AS ,随便分点 ipv6 得了。
AkibaSo
2023-07-25 15:54:04 +08:00
@sadfQED2 楼上说了 指定 network 为 host ,docker compose 同样可以指定 network_mode: 'host',这样就可以通过你 nas 的 ipv6 访问你的服务,实在不行你还可以用 ipv6 nat
sadfQED2
2023-07-25 15:57:44 +08:00
@Cabana 我需要代理 tcp 流量,看了一眼我群晖上面的 nginx ,没有装 stream 模块,于是我尝试自己编译,又少了一万个依赖,吐了
des
2023-07-25 15:57:54 +08:00
看看这个 16 楼和 46 楼是不是你想要的 https://v2ex.com/t/955636
sadfQED2
2023-07-25 15:59:54 +08:00
@defunct9 大哥你终于来了,nginx 没 stream 模块,自己编译又没依赖。

又尝试装 ha ,结果 ha 也得自己编译,也没编译环境
defunct9
2023-07-25 16:02:03 +08:00
@sadfQED2 不想编译就 traefik 、caddy
sadfQED2
2023-07-25 16:03:35 +08:00
@des 这真的是,太太太复杂了,所以我才提问,有没有优雅一点的解决方案,这种方案,以后的维护成本简直上天,特别是半年一年以后,都忘了之前是咋配置的了,那时候排查问题,简直要命
sadfQED2
2023-07-25 16:12:31 +08:00
@defunct9 #28 看了一下这 2 个的介绍,这两个似乎不支持 tcp 、udp 的代理吧,这两个好像都是 http 的代理。另外,用啥代理都不是啥大问题。大问题是,机器上没有 systemctl ,没有 supervisor ,服务没法保活。
yinmin
2023-07-25 16:51:25 +08:00
@sadfQED2 #27 解决方法:docker 部署 nginx
ice920
2023-07-25 17:20:33 +08:00
@sadfQED2 #15 不知道你的问题是否是我理解的问题,看你的 docker 版本,20.10.3 是不能监听 v6 端口,貌似在 20.10.6 版本后解决,但群晖套件之前只有 20.10.3 和 18.09 ,以及现在最新的 DSM7.2 是 20.10.23
sadfQED2
2023-07-25 17:36:13 +08:00
@ice920 有可能是 docker 版本太低的问题,打死都不监听 v6 端口。
zygame
2023-07-25 17:40:14 +08:00
所以这就是路由被误解之后造成的问题,NAT Gateway 本身就不是 Router
v4 时代你们在 Gateway 上弄的那一套花活,根本不是在 Router 上用的,v6 有了公网 IP 你的所有策略都要改变。
就算你 v6 无限制直接公布在网上,传统的扫描器扫一个 60 段的时间你算过么……而且是每次都会换的 60 段,你在担心什么?
安啦
blackmirror
2023-07-25 17:40:15 +08:00
docker 不是默认 ipv6 优先的?
AlanBrian
2023-07-25 17:54:08 +08:00
{
"ipv6": true,
"fixed-cidr-v6": "fc00:17:1:1::/64",
"experimental": true,
"ip6tables": true
}
我之前这么配置是可以通过宿主机的 ipv6 访问容器的。
kaedeair
2023-07-25 18:02:54 +08:00
上面已经简短介绍了一下方法,可能不够详细
我来说一下我的方案吧,是已经实践成功,稳定运行半年的;希望对你有所帮助

系统是 pve
网关使用 docker 部署的 traefik ,网络模式使用 host(这里使用 host 的原因是因为我后面几个服务是 PT 和 BT 需要 ipv6 地址,容器网络也选择的是 host ,能不能 bridge 模式需要自行测试,理论上是可行的,因为我看到绑定宿主机 web 端口是监听 ipv6 的),后面几个不需要 ipv6 的服务是 bridge
由于 docker 的 iptables 优先于 pve 的,我关闭了 docker 的 iptables ,同时增加了网络为 bridge 容器所在网段到 docker0 的 MASQUERADE(防止容器不能上网),这样我就只对外暴露了单个 web 端口
对后面容器服务的访问控制是通过 traefik 里面域名规则配置的

对楼上回复的补充:traefik 是支持 tcp 和 udp 的并不是只支持 http
yylang1984
2023-07-25 18:21:18 +08:00
用 host 模式就好了
lovelylain
2023-07-25 18:30:48 +08:00
通过 nginx 反代 ipv6 到容器 ipv4 ,nginx 跑在 host 容器或者宿主机上,对于容器内的 web 服务,通过 xff 传递客户端 ip ,非 web 服务暂时没想到什么办法传递 ip 。
Jirajine
2023-07-25 18:38:12 +08:00
这是 docker 的问题,docker 的网络非常垃圾,或者说是非常特化的,用 docker 就得 docker 按照它自己的方式为你管理地址,或者手动静态管理地址。
任何非 docker 设计的标准网络使用,都不该用 docker ,与其对着 docker 一顿 hack ,不如直接 lxc ,想怎么配就怎么配。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/959423

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX