Transmission 的安装与配置 RPC 反代 (Ubuntu 20.10)

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)

在终端里输入以下命令安装 Transmission
sudo 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/ 并输入设置的用户名及密码就可以看到如下界面

Transmission Web UI
Transmission Web UI

使用 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;
    }
                
遇到了 Transmission 客户端在有 v6 时不上报 v4 地址的问题

解决方法是编辑 /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日閲覧)

发表评论

邮箱地址不会被公开。 必填项已用*标注