Featured image of post 威联通 NAS Transmission 做种配置

威联通 NAS Transmission 做种配置

在没有公网 IPv4 地址的情况下,通过 IPv6 被 Peer 发现

之前一直在 OpenWrt 主路由上跑 Transmission 以及一揽子服务,后来大概是各种写日志把系统盘坏了,结果不仅服务没了,家里也上不了网了。

为了保障网络的稳定性,将 OpenWrt 换成了刷了固件的华硕硬路由,只安装 fancyss 和 ZeroTier。其余服务全部移到威联通的 NAS 上。

其他服务运行都正常,唯独 Transmission 从 OpenWrt 编译进固件的应用换到 NAS 上的 Docker 后,连续好几天 50+ 个种子没有任何一点上传。而之前使用 OpenWrt 时,每天固定都有一定上传量。

先来复习下 PT 的原理:

PT 架构

Peer 客户端(如 Transmission)通过 HTTP/HTTPS 向 Tracker 发送请求注册(announce):

1
GET /announce?info_hash=xxx&peer_id=xxx&port=51413&uploaded=0&downloaded=0&left=xxx&passkey=xxx

Tracker 返回:

1
2
3
4
5
6
7
{
  peers: [
    PeerA IP:Port,
    PeerB IP:Port,
    ...
  ]
}

之后 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 的流量。

华硕路由器中的防火墙配置(我的 QNAP TS-464C 有两个网口)

不过如果你和我一样,路由器上跑了 fancyss 之类的代理服务,虽然获取到了地址,但很可能 DNS 解析会存在问题。

1
2
curl -6 ifconfig.co                                      
# 返回 curl: (6) Could not resolve host: ifconfig.co

还需要在 fancyss 这类服务的设置中找一下,关掉类似 “过滤 AAAA 记录”“DNS 过滤 IPv6” 的开关,避免 AAAA 记录被过滤掉。也可以直接修改 NAS 上的 DNS 服务器为公共 DNS,绕过路由器的 DNS(但这可能也绕过 AdGuard Home 等服务)。

fancyss中 DNS 设定相关内容的说明

主机 IPv6 已经通了,但是运行 docker exec transmission curl -6 ifconfig.co 在容器中测试 IPv6 连通性仍然失败。

原因是 Transmission 官方文档中给出的容器启动方式中,容器的网络模式是 bridge,容器默认没有 IPv6。最简单的解决办法是改成 host 模式,容器直接共享宿主机网络,IPv6 立刻可用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker run -d \
  --name=transmission \
  --network=host \
  -e PUID=1000 \
  -e PGID=100 \
  -e TZ=Asia/Shanghai \
  -e USER=root \
  -e PASS=your_password \
  -e WHITELIST=192.168.5.* \
  -v /path_to_transmission_conf:/config \
  -v /path_to_downloads:/downloads \
  --restart unless-stopped \
  lscr.io/linuxserver/transmission:latest

停止容器,修改参数后重新启动,终于一切正常,硬盘马上开始炒豆子了。打开正在做种的种子,peers 列表中已经有 IPv6 地址的 Peer 了。

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy