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

311 天前
 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 了)

5036 次点击
所在节点    DevOps
49 条回复
sadfQED2
310 天前
@JensenQian 不是,我并不需要 ddns ,我不需要域名。我直接用 ipv6 的地址连回来就行了。

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

但是我有注册中心,nas 会实时上报自己的 ip 到注册中心,我 vpn 实时从注册中心拉取地址,拉到的是 nas 地址,搞成路由器地址就废了
sadfQED2
310 天前
@leonshaw 是的,就是这个问题。我就是想问问有啥优雅的办法解决
defunct9
310 天前
听到有人在叫我。

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

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

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

系统是 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
310 天前
用 host 模式就好了
lovelylain
310 天前
通过 nginx 反代 ipv6 到容器 ipv4 ,nginx 跑在 host 容器或者宿主机上,对于容器内的 web 服务,通过 xff 传递客户端 ip ,非 web 服务暂时没想到什么办法传递 ip 。
Jirajine
310 天前
这是 docker 的问题,docker 的网络非常垃圾,或者说是非常特化的,用 docker 就得 docker 按照它自己的方式为你管理地址,或者手动静态管理地址。
任何非 docker 设计的标准网络使用,都不该用 docker ,与其对着 docker 一顿 hack ,不如直接 lxc ,想怎么配就怎么配。

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

https://www.v2ex.com/t/959423

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

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

© 2021 V2EX