2017年我曾经写过一篇介绍在 Ubuntu 16.04 上安装与配置 Transmission 的文章,转眼4年过去了,我也早已弃用 DigitalOcean 并购入了实体服务器放置在家中。于是便想着对之前的文章进行一些更新以便后人及自己更好地参考。
Server: Fujitsu TX1310 M3
OS: Ubuntu 20.10
Network: IPv4(公网 IP): PPPoE, IPv6(公网 IP): IPoE
Transmission 介绍 (0x00)
Transmission 是一个强大的 BitTorrent 开源客户端,实现了 BT 协议中描述的大多数功能(除了创建种子不太方便以外)。并且它基本上也覆盖了全平台的 OS。
在 Ubuntu 的发行版中,Transmission 软件包下面包含多个套件,他们是
- transmission-gtk: GTK+ 界面的 Transmission BT 客户端。
- transmission-qt: QT 界面的 Transmission BT 客户端。
- transmission-cli: 命令行界面的 Transmission BT 客户端,与 QT, GTK+ 版本功能一样,是命令行下一个完备的 BT 客户端。
- transmission-daemon: 是一个 Transmission 的后台守护程序,本身不具备操作指令,只能通过 Web 客户端或者 transmission-remote-cli 来进行控制。
- transmission-remote-cli: 用来控制 transmission-daemon 的命令套件,本身不具备下载 BT 的功能,只能够配合 daemon 使用。
而我希望的是,在服务器上运行 transmission-daemon ,然后本地客户端连接到远程运行的 transmission-daemon 来控制下载。
Transmission 的安装 (0x01)
在终端里输入以下命令安装 Transmissionsudo apt install transmission-daemon
安装过程中会顺带把transmission-cli也安装上,所以安装完毕后系统会多出如下一些命令行工具。
- transmission-cli:独立的命令行客户端。
- transmission-create:用来建立 .torrent 种子文件的命令行工具。
- transmission-daemon::后台守护程序。
- transmission-edit:用来修改 .torrent 种子文件的 announce URL。
- transmission-remote:控制 daemon 的程序。
- transmission-show:查看 .torrent 文件的信息。
配置文件目录里面包含如下一些文件:
- settings.json: 主要的配置文件,设置 daemon 的各项参数,包括 RPC 的用户名密码配置。它实际上是一个符号链接,指向的原始文件是 /etc/transmission-daemon/settings.json。里面的参数解释可以参考官网的配置说明。
- torrents/: 用户存放 .torrent 种子文件的目录,凡是添加到下载任务的种子,都存放在这里。.torrent 的命名包含,种子文件本身的名字和种子的 HASH 值。
- resume/: 该存放了.resume 文件,.resume 文件包含了一个种子的信息,例如该文件哪些部分被下载了,下载的数据存储的位置等等。
- blocklists/: 存储被屏蔽的 peer 的地址。
- dht.dat: 存储DHT节点信息。
安装时会创建一个用户来专门运行 transmission-daemon,用户名为:debian-transmission
注意: 如果使用另外一个用户来运行 transmission-daemon 的话,会在该用户的目录下,创建一个 .config/transmission-daemon 的文件夹,在这个文件夹里有单独的 settings.json 配置文件来配置这个用户对应的 daemon 进程,下载目录也会变为 $HOME/Download 。
按照默认用户和默认配置目录来正确启动和停止 transmission-daemon 的方式如下。
sudo systemctl start transmission-daemon.service sudo systemctl stop transmission-daemon.service
Transmission 的配置 (0x02)
配置主要是通过修改 /var/lib/transmission-daemon/info/settings.json
文件中的参数来实现的。
注意:在编辑 Transmission 配置文件的时候,需要先停止 daemon 进程,否则编辑的参数将会被恢复到原来的状态。
配置 Transmission 及 RPC
sudo vi /var/lib/transmission-daemon/info/settings.json
详细配置文件说明请见官方 Wiki
{ "download-dir": "/mnt/download/bt", #下载目录的绝对路径 "incomplete-dir": "/var/lib/transmission-daemon/Downloads", #临时文件目录 "incomplete-dir-enabled": false, #是否启用临时文件目录(SSD 慎用) "peer-port": 51413, #传入端口 "port-forwarding-enabled": false, #是否启用 UPnP 或 NAT-PMP(不建议开启,建议直接路由器添加端口转发) "rpc-authentication-required": true, #启用验证 "rpc-bind-address": "0.0.0.0", # RPC绑定 IP 地址 "rpc-enabled": true, #允许通过 RPC 访问 "rpc-host-whitelist": "your.domain.name", #域名白名单 "rpc-host-whitelist-enabled": true, #是否启用域名白名单(使用反代时需要) "rpc-password": "123456", #RPC 验证密码,请修改为自己的(保存并启动后 daemon 会计算并替换为 HASH 值) "rpc-port": 9091, #RPC 端口 "rpc-username": "transmission", #RPC 验证用户名,可以改成自己希望的 "rpc-whitelist": "127.0.0.1,192.168.*.*", #RPC 访问白名单,允许本地及内网访问 "rpc-whitelist-enabled": true, #如需直接公网访问需要设置为 false "umask": 2, #设置保存文件的权限掩码为 664,如需所有用户可读写请更改为 0 }
内网使用 Web 界面控制 Transmission daemon (0x03)
经过上述配置后,就可以通过Web界面来访问和控制 Transmission daemon 了。在浏览器中访问 http://your.ip.address:9091/transmission/web/
并输入设置的用户名及密码就可以看到如下界面

使用 Nginx 反代 Transmission RPC (0x04)
Nginx 的安装及 letsencrypt 证书的申请网络上有很多现成的资料,在此不再赘述。
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name your.domain.name; #改为你的域名 ssl_certificate /etc/nginx/ssl/certificate.crt; #SSL证书路径 ssl_certificate_key /etc/nginx/ssl/private.key; #SSL私钥路径 ssl_session_timeout 5m; ssl_protocols TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_session_cache builtin:1000 shared:SSL:10m; #openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048 #ssl_dhparam /etc/nginx/ssl/dhparam.pem; #如使用 Diffie-Hellman key exchange 的话请先运行上面的命令 #include rewrite/none.conf; #error_page 404 /404.html; location ^~ /transmission { proxy_http_version 1.1; add_header Front-End-Https on; proxy_set_header Connection ""; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass_header X-Transmission-Session-Id; location /transmission/rpc { proxy_pass http://127.0.0.1:9091; } #如果不需要代理web管理面板则不需要开启 #location /transmission/web/ { # proxy_pass http://127.0.0.1:9091; #} #location /transmission/upload { # proxy_pass http://127.0.0.1:9091; #} #location /transmission/ { # return 301 https://$server_name/transmission/web; #} } access_log /var/log/nginx/your.domain.name.log; }

解决方法是编辑 /etc/gai.conf
,在文件末尾添加 precedence ::ffff:0:0/96 100
参考文献
Setting IPv4 as preferred protocol over IPv6
https://serverfault.com/questions/93717/setting-ipv4-as-preferred-protocol-over-ipv6(2021年4月13日閲覧)