Transmission 屏蔽迅雷等吸血客户端

2022-04-26 • 更新于 2025-06-04

一直跟你索取数据,你有求必应地给它了,等你跟它请求的时候,不好意思,没有,不信你看我进度,我可是 0% 啊!——这就是吸血。

然而 BT 协议非常宽松,大多数开源客户端并不屏蔽吸血客户端,有些客户端如 qBittorrent-Enhanced-Edition,可以通过 Peer/Client ID 识别它们并屏蔽。

个人使用的 Transmission 就只能屏蔽 IP,而且作者表示不会加入屏蔽客户端这种功能1

于是我写了个 Shell 脚本 qianbinbin/transmission-block,可以按客户端屏蔽其 IP,还支持在线黑名单。

近年来出现了 PeerBanHelper 反吸血项目,支持包括 Transmission 在内的很多客户端。然而它太过重量级,而 Transmission 正是以资源占用少著称。

项目创建于 2022 年,2025 年进行了重大更新。

以下是全新的 README,具体请移步我的仓库安装脚本。


Transmission 辅助脚本,屏蔽迅雷等吸血客户端以及在线屏蔽列表(黑名单)中的 IP 地址。

特性:

  • 支持屏蔽指定客户端(已预设,详见配置文件中的 LEECHER_CLIENTS)。
  • 支持抓取多个指定在线黑名单,支持文本、gzip、zip 格式(详见配置文件中的 EXTERNAL_BL)。
  • 完全端到端访问,理论支持容器中的 Transmission,甚至可以运行在另一主机。
  • 支持受限用户运行。
  • 理论兼容 POSIX Shell 环境。
  • 同步转换 BTN-Collected-Rules 为 Transmission 兼容的黑名单(详见 blocklist 分支)。

依赖:

  • transmission-remote 命令,通常已经与 Transmission 一起安装。隔离安装(如某些 NAS 系统)的 transmission-remote 可能需要设置 PATH,详见配置文件。
  • curl、file 命令(如果使用在线黑名单)。
  • HTTP 服务程序,nginx、busybox httpd、python3 任意一种(排序分先后)。前两者资源占用极低,后两者普遍预装。
  • systemd 235 或以上版本(如果使用 systemd 管理)。要在更低版本上使用,参考问题排查

使用

删除旧版 trans-block.sh 脚本(可选)

以 root 权限运行:

rm /path/to/trans-block.sh # 旧脚本保存路径
systemctl disable transmission-block.service
systemctl stop transmission-block.service
rm /etc/systemd/system/transmission-block.service
systemctl daemon-reload

删除配置目录下的旧黑名单:

rm -i /path/to/config/blocklists/leechers.txt*

如果不知道配置目录,可以使用以下命令获取(替换自己的用户名和密码):

transmission-remote --auth username:password --session-info | sed -n -E 's/.*Configuration directory: (.*)/\1/p'

设置 Transmission

  • 启用远程访问;设置用户名和密码(可选)。
  • 启用黑名单,并设置为 http://127.0.0.1:9098/blocklist.p2p.gz

以 transmission-daemon 为例,在配置文件中:

{
  "rpc-enabled": true,                                      <--- 启用远程访问
  "rpc-authentication-required": true,                      <--- 启用用户验证
  "rpc-username": "username",                               <--- 用户名
  "rpc-password": "password",                               <--- 密码
  "blocklist-enabled": true,                                <--- 启用黑名单
  "blocklist-url": "http://127.0.0.1:9098/blocklist.p2p.gz" <--- 黑名单地址
}

[!NOTE] 修改密码建议在 daemon 关闭状态下,因为密码会在启动后加盐哈希。

如不使用默认 HTTP 监听地址(见配置文件中的 BL_SERVER),则 "blocklist-url" 要相应修改。

如果 daemon 正在运行,使用 systemctl reload transmission-daemon.service 重新加载配置,直接重启不会生效。

自动运行(systemd)

下载脚本及配置文件,以 root 权限运行:

mkdir -p /usr/local/bin /usr/local/lib/systemd/system /usr/local/etc/transmission-block
chmod 700 /usr/local/etc/transmission-block
curl https://raw.githubusercontent.com/qianbinbin/transmission-block/master/transmission-block.sh \
  -o /usr/local/bin/transmission-block \
  https://raw.githubusercontent.com/qianbinbin/transmission-block/master/transmission-block.service \
  -o /usr/local/lib/systemd/system/transmission-block.service \
  https://raw.githubusercontent.com/qianbinbin/transmission-block/master/transmission-block.conf \
  -o /usr/local/etc/transmission-block/transmission-block.conf
chmod +x /usr/local/bin/transmission-block
systemctl daemon-reload

如果启用了用户验证,在 /usr/local/etc/transmission-block/transmission-block.conf 中设置 TR_AUTH 用户名和密码。其余均为可选参数,用法由注释给出。

[!TIP] 推荐启用 BTN-Collected-Rules 黑名单:

EXTERNAL_BL=https://raw.githubusercontent.com/qianbinbin/transmission-block/blocklist/btn-all.p2p
# 更新较为频繁
RENEW_INTERVAL=1h
列表CDN备注
完整列表Cloudflare jsDelivr包括 IPv4 和 IPv6 地址,适用于 Transmission v4.0.0 及以上版本
仅 IPv4Cloudflare jsDelivr仅 IPv4 地址,适用于 Transmission v4.0.0 以下版本

注:jsDelivr 有一定延迟,部分地区可能存在 DNS 污染。

其他黑名单可以查看 blocklist其他黑名单

运行:

systemctl enable transmission-block.service # 开机启动
systemctl start transmission-block.service # 立即启动
systemctl status transmission-block.service # 查看状态
journalctl -f -u transmission-block.service # 查看 log

在 Transmission Web 管理页面,点击 🔧 > Peers,查看屏蔽规则是否生效。

手动运行

手动运行

curl https://raw.githubusercontent.com/qianbinbin/transmission-block/master/transmission-block.sh \
  -o ./transmission-block.sh
chmod +x ./transmission-block.sh
export TR_AUTH=username:password # 用户名和密码,可以加入到环境变量
./transmission-block.sh # ./transmission-block.sh -h 查看更多参数

补充吸血客户端和可疑 IP

欢迎在 https://github.com/qianbinbin/transmission-block/issues/9 补充吸血客户端和可疑 IP。

通过 transmission-remote --auth username:password --torrent all --peer-info 查看所有连接。

[!TIP] 如何确定可疑 IP?在 https://iknowwhatyoudownload.com/en/peer/ 上查询该 IP 的下载记录,如果下载量远超普通用户,说明可能是离线下载服务器或刷流量的。

问题排查

  • 加入黑名单后不会立即生效,系 Transmission bug,预计 v4.1.0 版本将修复这个问题。对于小于此版本,脚本尝试通过重启任务解决(见配置文件中的 RESTART_TORRENT),但偶尔会重启失败。
  • Transmission v4.0.0 以下不支持屏蔽 IPv6 地址。
  • 一些客户端被离线下载服务器使用,但不排除有正常用户使用。例如 libtorrent (Rasterbar) 2.0.7libTorrent (Rakshasa) 0.13.8 可能是迅雷或 PikPak 服务器,脚本默认屏蔽。
  • 一些数据中心 IP 会被激进的在线黑名单拉黑,如 Vultr。
  • systemd 235 以下版本(通过 systemctl --version 查看)不支持 DynamicUser 和 StateDirectory,有条件建议升级。如果无法升级,需自行创建工作目录并修改 systemd 单元文件:
    mkdir /var/lib/transmission-block
    chown nobody:nogroup /var/lib/transmission-block # nobody:nogroup 可改为自己想要的用户和用户组
    sed -i -e 's/DynamicUser=yes/User=nobody/' \ # User= 要与上面的用户相同
      -e '/StateDirectory=%p/d' \
      -e 's,"$STATE_DIRECTORY",/var/lib/transmission-block,' \
      /usr/local/lib/systemd/system/transmission-block.service
    systemctl daemon-reload
    
    如果你不在乎安全问题,可以删除文件中 DynamicUser=User= 的行,这将直接以 root 用户运行。

鸣谢

blocklist 分支同步并转换以下数据为 Transmission 兼容的格式:

其他黑名单

以下黑名单搜集自网络,仅供参考。

原理

原理

脚本主要做以下几件事:

  1. 匹配指定客户端,并将其 IP 加入客户端黑名单(可选)。
  2. 下载在线黑名单(可选)。
  3. 将两种黑名单合并,在本地建立 HTTP 服务,提供给 Transmission 访问。

其中客户端黑名单和在线黑名单,两者至少需要选择一种。

要屏蔽的客户端是由 LEECHER_CLIENTS 指定的,使用区分大小写的 BRE(POSIX 基本正则表达式)匹配,即 grep 不加 -i-E 的匹配方式。

考虑到普通用户的 IP 动态分配,客户端黑名单默认每 7 天清空一次;在线黑名单默认每 1 天检查更新一次。这些都是可定制项。

systemd 方式默认工作目录为 /var/lib/transmission-block/(请勿手动创建),结构示例如下:

/var/lib/transmission-block/
├── extern                                      <--- 在线黑名单目录
│   ├── b56582a4987b9324003eadc4fced8127.data   <--- 在线黑名单原始文件
│   └── b56582a4987b9324003eadc4fced8127.etag   <--- 在线黑名单 Etag 信息
├── leechers.p2p                                <--- 客户端黑名单
└── web                                         <--- HTTP 服务根目录
    └── blocklist.p2p.gz                        <--- 最终黑名单文件

Transmission 会更新黑名单到配置目录下的 blocklists/blocklist.bin

[!TIP] 如果遇到可疑 IP,你可以在配置目录下新建一个文本文件,格式为 描述:起始IP-结束IP,例如 suspect:106.8.130.0-106.8.130.255,然后重新加载或重启 Transmission。

加戏时间

不吸血我怎么办?开会员?

更不能用。

一个号称离线下载的?

正经人谁用离线啊。

是啊。

你用离线吗?

我不用,你用吗?

玩 P2P 的能用离线下载?

用离线下载的能叫 P2P?

(异口同声)__!

LinuxmacOSShellBitTorrent

本作品根据 署名-非商业性使用-相同方式共享 4.0 国际许可 进行授权。

在 Android 上部署 Linux

Dnsmasq 去 DNS 污染和广告