创作立场声明:折腾了许久的 unraid 容器 IPv6,记录一下学习过程遇到的一些问题以及解决方案,希望能对值友有所帮助.
NOTE
本文字数 3300+,配图 26,预估阅读时间 7 ~ 9 分钟
如之前的文章介绍,unraid 本身开启 ipv6 还是比较简单
先在 MAIN 页面停掉 Array 磁盘阵列后
在 SETTINGSS - Network Settings 设置 IPv4 + IPv6 即可
之前的文章因篇幅原因,对 unraid 的 ipv6 细节没有展开来讲,
本文讲介绍 Unraid 容器的 IPv6 配置,并以 Transmission 为例进行演示:
如果有一定的基础,并且赶时间的话,推荐仅看本部分内容即可
后续的内容会比较啰嗦,介绍了一堆基础知识以及踩过的坑,仅为记录
如何在 Unraid 下配置 Transmission 支持 IPv6:
关闭路由器的 DHCPv6 服务只保留路由通告服务
迫使 unraid 仅用 SLAAC 申请 IPv6,以保证 br0 类型的 docker 可分配 IPv6
修改 Transmission 容器网络类型为 Custom:br0
确保 Transmission 的配置支持 IPv6
对端端口绑定 IPv6:'bind-address-ipv6': '::'
RPC 端口绑定 IPv6:'rpc-bind-address': '::'
路由器开放 Transmission 的对端端口、RPC 端口的白名单支持从外网访问
如果配置正确,就可以在支持 Transmission 通过 IPv6 上传下载、外网访问管理
Unraid 为 docker 默认提供了 4 种网络类型
其实就是 docker 网络类型的知识,简单介绍一下 docker 的 5 种网络类型:
网络类型 | 说明 | 使用场景 |
---|---|---|
none | 只有 lo 回环网卡,封闭的网络 | 不需要网络的容器,保证容器的安全性 |
host | 使用宿主网络,性能好 | 没有网络隔离,不能复用宿主已使用端口 |
bridge | 保证容器间、容器与宿主间网络隔离 | 适用大部分场景,通过端口映射暴露服务 |
container | 和指定的容器共享网络 | unraid 界面不提供这种网络模式 |
custom | 自定义网络,unraid 提供物理桥接 | 可以分配与宿主同网络的 IP |
通过前面的配置,已经可以为 Unraid 分配 IPv6
基于此,就可以通过将容器设置为 host
网络类型以共享宿主的 IPv6
这种类型的容器,可以直接利用宿主网络进行通信
在内网时,可以直接通过 Nas 的 IPv4 地址 10.0.0.2
访问
在外部网络时,也可以通过 Nas 的 IPv6 地址来访问(4G 网络):
当然,为了方便,肯定还是需要配置好 DDNS 通过 IPv6 域名来访问
如前面介绍,Unraid 提供了类似物理桥接的 Custom:br0
网络类型
通过这种方式,我们可以让容器获取到与宿主同个子网的网络地址
如上图,Nas 分配的 IP 是通过主路由分配的 10.0.0.2
而 br0
网络类型的容器可以分配到同个子网的 10.0.0.4
Custom:br0
是桥接到 br0 物理网桥:
由主路由分配 IP,与 Nas 宿主处于同个子网 10.0.0.0/24
虽然与 Nas 通过一根网线连接到路由,但在路由看来是两个独立的设备
Bridge
(容器默认网络模式)是桥接到 docker0 虚拟网桥
从 docker0 子网分配一个 IP 给容器使用:172.17.0.0/16
容器的网关被设为 docker0 172.17.0.1
容器与 Nas 处于不同子网,与外网通信需要由 docker0 进行 NAT 地址转换
以一个 br0 类型的容器为例(需要路由器关闭 DHCPv6,下文会有介绍)
进入到这个 br0
网络类型的容器,可以看到已经分配 v4、v6 双栈 IP
同时,IPv6 已经是公网 IPv6,可以直接在外网进行访问(只要防火墙放开)
Unraid 在开启 ipv6 支持后,默认可获取到两个公网 ipv6 地址:
这两个地址分别是:
128 位的 ipv6 地址是通过 DHCPv6 获取到的
64 位的 ipv6 地址是通过 SLAAC 获取到的
当然这个的前提是你的路由器固件开启了路由通告服务及DHCPv6服务
这里可能会有人想直接通过 DHCPv6 给 Unraid 指定 IPv6 的后缀
来获取更高的可读性,比如 运营商分配的前缀::2
但是很遗憾,在 openwrt 这个方式行不通:
openwrt 分配的 IPv6 后缀和客户机的 DUID 是对应的
openwrt 改不了客户机的 DUID,也不能直接指定客户机的 IPv6
比如我为 Nas 分配了固定的 IPv6 后缀
但实际上获取到的还是跟之前的一致,也就是 ::2a2
后缀
DUID 为 DHCPv6 设备的唯一 ID,用于标识不同的客户端
但所幸 DUID 是基本不变的,通过 DHCPv6 获取到的 IPv6 其后缀也是不变的
并且在实际测试中,当路由器开启了 DHCPv6 服务之后,
设置为 br0
网络模式的容器也无法分配到 IPv6 地址,需要关闭路由 DHCPv6 服务
猜测是 Unraid 的 br0 第一个 IPv6 地址为 DHCPv6 分配的 /128
地址
之后 Unraid 上重新获取 IP 后可以看到显示的 IPv6 变成 /64
的地址
所幸目前大部分支持 IPv6 的设备都支持 SLAAC 模式,对应路由通告服务
且 DHCPv6 并没有得到很好的普及,比如 Android 就不支持 DHCPv6
所以关闭了 DHCPv6 对于目前使用上基本没啥影响(至少从我使用情况)
Transmission 主要是调整两个监控端口支持 IPv6:
Peer Port:用于上传下载数据
RPC Port:管理端口,一般会提供 WebUI 进行管理
这两个参数被定义在 Transmission 配置目录下的 settings.json
Peer Port
对于比较新版本的 Transmission,Peer port 已默认开启 IPv6 支持:
如果还不行,请检查并加上这个配置: 'bind-address-ipv6': '::'
RPC Port
Transmission 需要 3.0 版本之后才默认支持 RPC 绑定 IPv6 地址
更详细信息可以参考官方 Issue:Add IPv6 support for RPC server #59:
所以如果在使用小于 3.0 的版本,只能升级或者手动打补丁来支持
之后就可以修改配置 RPC 绑定的配置,默认为 'rpc-bind-address': '0.0.0.0'
需将上面配置项的值 0.0.0.0
修改为 ::
以开启双栈支持(需彻底退出重启)
如上面介绍,针对 Transsmission 容器有两种方式来支持 IPv6:
网络类型 | 配置说明 |
---|---|
Host | 配置简单,存在端口冲突风险,与宿主不存在网络隔离存在安全风险 |
Custom | 需屏蔽 DHCPv6,与宿主网络隔离,不需要考虑端口冲突问题 |
需要注意,这两种方式,都不需要 Nas 进行 NAT,所以网络性能基本差不多
我个人比较建议是使用 Custom 网络模式,隔离网络
另外,也支持固定 IP 配置;默认留空,则由 Docker 自行申请
从 Unraid 论坛的帖子来看 IPV6 NOT WORKING
Docker 并不是使用 SLAAC 的方式来获取 IPv6 地址,而是按顺序
比如网关是 ::1
,则第一个 br0 网络类型的 docker 分配到 ::2
但从我的情况来看,实际上 Docker 获取到两个 IPv6 地址:
第一个比较长的是通过 EUI-64 地址转换获取
第二个比较短的,就是符合上面帖子的情况,按顺序分配
通过 MAC 地址进行 EUI64 转换:2409:****:****:****:42:aff:fe00:3/64
路由器防火墙默认限制 IPv6 转发,需要配置开启对应端口允许外部访问
在路由管理后台 网络 - 防火墙 - 流量规则 页面新建转发规则并编辑
建议修改 Transmission 这两个默认端口,同时一定要开启 RPC 的密码认证
目前运营商都已经支持 IPv6 环境,日常使用上基本是没有问题
最高的下载速度也能跑到 3OMB/s 下载,基本算接近 300M 宽带的实际上限
在外网也可通过 IPv6 访问管理页面进行操作,比如已经支持 IPv6 的手机 4G 网络
就可以实现在外部通过浏览器、 APP(TransmissionRemote) 来进行下载操作等
当然,你要问和 IPv4 比起怎么样?
—— 有公网 IPv4 谁还来折腾这鬼东西??
联系客服