之前一直在 OpenWrt 主路由上跑 Transmission 以及一揽子服务,后来大概是各种写日志把系统盘坏了,结果不仅服务没了,家里也上不了网了。
为了保障网络的稳定性,将 OpenWrt 换成了刷了固件的华硕硬路由,只安装 fancyss 和 ZeroTier。其余服务全部移到威联通的 NAS 上。
其他服务运行都正常,唯独 Transmission 从 OpenWrt 编译进固件的应用换到 NAS 上的 Docker 后,连续好几天 50+ 个种子没有任何一点上传。而之前使用 OpenWrt 时,每天固定都有一定上传量。
先来复习下 PT 的原理:

Peer 客户端(如 Transmission)通过 HTTP/HTTPS 向 Tracker 发送请求注册(announce):
|
|
Tracker 返回:
|
|
之后 Peer 之间开始建立 P2P 连接,这个过程不再经过 Tracker,数据是点对点直传的。很明显,若设备没有公网地址,除非在下载时主动和其他 Peer 建立了连接,该设备是不可能被动地被其他 Peer 发现并做种的,这也就是为什么我将 50+ 个已经下载完成的种子添加后,几天都没有一点上传的原因。
那么,为什么同样没有公网 IP,之前 OpenWrt 做种做的飞起呢?
原因是 IPv6,若客户端通过 IPv6 连接 Tracker 或在 announce 中上报了 IPv6 地址,Tracker 也会拿到其 IPv6 地址,从而让其他 Peer 可以通过公网 IPv6 发现该 Peer。威联通 NAS 出于安全考量,默认关闭了 IPv6,可通过 控制台 → 网络与虚拟交换机 → 网络适配器 → 设定 将所有网卡的 IPv6 打开,如图:

连接类型具体选哪个,看你路由器 RA 的配置模式:
- SLAAC(无状态地址自动配置):最常见,客户端根据路由器通告的前缀自己生成地址。国内运营商及商用路由器绝大多数都是这种方式。
- DHCPv6(有状态地址自动配置):由路由器的 DHCPv6 服务器分配地址,相对少见。根据笔者经验,一般折腾 OpenWrt 时会选择配置 DHCPv6 便于做防火墙规则、端口转发、DNS 绑定等。
这里配置好之后一般就能够获取到 IPv6 地址了。
注意家用路由器一般会默认启用 IPv6 防火墙,为了外部 Peer 能正常连接到家庭网络中的 NAS,需在防火墙上为 NAS 获取到的 IPv6 地址的 51413 端口放行 TCP 和 UDP 的流量。

不过如果你和我一样,路由器上跑了 fancyss 之类的代理服务,虽然获取到了地址,但很可能 DNS 解析会存在问题。
|
|
还需要在 fancyss 这类服务的设置中找一下,关掉类似 “过滤 AAAA 记录” 或 “DNS 过滤 IPv6” 的开关,避免 AAAA 记录被过滤掉。也可以直接修改 NAS 上的 DNS 服务器为公共 DNS,绕过路由器的 DNS(但这可能也绕过 AdGuard Home 等服务)。

主机 IPv6 已经通了,但是运行 docker exec transmission curl -6 ifconfig.co 在容器中测试 IPv6 连通性仍然失败。
原因是 Transmission 官方文档中给出的容器启动方式中,容器的网络模式是 bridge,容器默认没有 IPv6。最简单的解决办法是改成 host 模式,容器直接共享宿主机网络,IPv6 立刻可用。
|
|
停止容器,修改参数后重新启动,终于一切正常,硬盘马上开始炒豆子了。打开正在做种的种子,peers 列表中已经有 IPv6 地址的 Peer 了。