在这里插入图片描述

github: https://github.com/qbittorrent/qBittorrent
official: https://www.qbittorrent.org/
docs: https://github.com/qbittorrent/qBittorrent/wiki/Installing-qBittorrent

Docker qbittorrent 服务一键部署:https://github.com/LawssssCat/Self-Host-qBittorrent(docker-compose)
(通过网页API定时检查并屏蔽迅雷等吸血客户端,以及定时更新tracker功能脚本)

参考


正文

qBittorrent是功能最全的开源bt下载工具了 —— Why the name qBittorrent?

功能 —— Why use qBittorrent instead of another client?

  • 协议:支持bt(torrent)、pt、磁力(Magnet)
  • 寻址:内置tracker、DHT、Peer Exchange
  • 传输:Full encryption、支持下载排程
  • 其他:支持ipv6(国内重要功能)、IP过滤、RSS订阅、种子搜索(省事)、分类浏览

工作原理

理解了bittorrent网络的工作原理,对于后面设置tracker、监听端口、announce_to_all_trackers等设置就不言自明了。

qb工作流程 - 下载:

  1. 我们的一个下载资源请求称为一个torrent;
  2. torrent开启后,qb(我们)会访问tracker服务器;
  3. tracker告诉qb(我们)哪些peers(别的qb客户端)有这个资源;
  4. 于是qb(我们)直接向那些peers请求资源。

qb工作流程 - 上传:

  1. 相对的,当qb(我们)把资源下载下来后会向tracker公告,告诉tracker我们有这个资源
  2. 当peers(别的qb客户端)需要这个资源时,tracker会告诉它们我们qb有这个资源
  3. 那些peers(别的qb客户端)就会访问我们的qb(通过我们qb开放的”监听端口“访问)
1-谁有“资源01”
2-P2有“资源01”,它的监听端口3386
?-我有“资源01”
3-我要“资源01”
(访问P2监听端口)
4-给你“资源01”
peer 01
peer 02
tracker 01

部署

使用docker-compose部署

使用linuxserver的docker镜像: https://hub.docker.com/r/linuxserver/qbittorrent
github: https://github.com/linuxserver/docker-qbittorrent

docker-compose.yml

 version: "2"
 services:
   qbittorrent:
     image: linuxserver/qbittorrent
     container_name: qbittorrent
     environment:
       - PUID=1000
       - PGID=1000
       - TZ=Asia/Shanghai # 你的时区
       - UMASK_SET=022    # (可选)默认022
       - WEBUI_PORT=8081  # WEB UI 端口 
     volumes:
       - /tmp/yourname/qbittorrent/config:/config
       - /tmp/yourname/qbittorrent/d:/downloads
     ports:
       - 6881:6881 # 最好更改,否者某些PT站点会屏蔽6881端口,为了避免被ISP屏蔽。⚠修改后,要在web界面同步修改
       - 6881:6881/udp
       - 8081:8081 # 考虑到CSRF和映射问题,内外端口必须与WEBUI_PORT一致。
     restart: unless-stopped
$ ls
docker-compose.yml
$ docker-compose up # -d 后台
qbittorrent  | [migrations] started
qbittorrent  | [migrations] no migrations found
qbittorrent  | ───────────────────────────────────────
qbittorrent  | 
qbittorrent  |       ██╗     ███████╗██╗ ██████╗ 
qbittorrent  |       ██║     ██╔════╝██║██╔═══██╗
qbittorrent  |       ██║     ███████╗██║██║   ██║
qbittorrent  |       ██║     ╚════██║██║██║   ██║
qbittorrent  |       ███████╗███████║██║╚██████╔╝
qbittorrent  |       ╚══════╝╚══════╝╚═╝ ╚═════╝ 
qbittorrent  | 
qbittorrent  |    Brought to you by linuxserver.io
qbittorrent  | ───────────────────────────────────────
qbittorrent  | 
qbittorrent  | To support LSIO projects visit:
qbittorrent  | https://www.linuxserver.io/donate/
qbittorrent  | 
qbittorrent  | ───────────────────────────────────────
qbittorrent  | GID/UID
qbittorrent  | ───────────────────────────────────────
qbittorrent  | 
qbittorrent  | User UID:    1000
qbittorrent  | User GID:    1000
qbittorrent  | ───────────────────────────────────────
qbittorrent  | 
qbittorrent  | [custom-init] No custom files found, skipping...
qbittorrent  | WebUI will be started shortly after internal preparations. Please wait...
qbittorrent  | [ls.io-init] done.

打开 WEB UI 管理界面: http://<域名>:8081 (打不开检查网络、防火墙)

默认用户名/密码:admin/adminadmin (登录后记得更改)

在这里插入图片描述

设置

设置:修改语言

save生效

在这里插入图片描述

设置:添加trackers优化下载速度(重要!)

不设置这一步是没有下载速度的,就好比上网不插网线不连wifi一样。

下面分享一些好用的trackers:

💡 注意:
由于UDP协议的Tracker服务器容易被ISP干扰,效果并不好。建议优先选择HTTPS的Tracker服务器,HTTP的次之。

设置:开启announce_to_all_trackers(总是向同级的所有Tracker汇报)

在qBittorrent 的选项->高级,确认“总是向同级的所有Tracker汇报”、“总是向所有等级的Tracker汇报”选中。

之所以在添加Tracker服务器列表后,很多Tracker服务器都处于未联系状态,很多原因与此选项有关。缺省情况下qBittorrent只会使用第一个Tracker服务器。

关于announce_to_all_trackers (总是向同级的所有Tracker汇报)的技术解释,可以参考 这篇文章 ,说得比较清楚。

设置:修改监听端口

在这里插入图片描述

💡 注意:
如果使用docker部署,该端口一般不需要修改。

  • ipv4:如果要修改端口,只需要修改暴露出去的端口即可
  • ipv6:要同步修改映射端口

设置:可访问的监听端口

一般qb不设置在路由器上,通过路由器nat后,qb开放的监听端口很可能无法被外部访问。

这会导致你的资源无法上传给别人;换个角度,别人会以为你在吸血,骂你畜生,把你的地址屏蔽了,以后你要资源时候不给你。

所以开放一个可访问的监听端口很重要。

检查服务端口是否可被外网访问: https://portchecker.co/checking

# 方案一:端口转发(docker)

网络拓扑

outter peers
| 
ISP
| 
| [port filter]
| 
my router (33.33.33.33 9999)
| 
| [port forward]
| [nat]
| 
my pc (192.168.1.22 8888)
| 
| [port forward by docker -p]
| [nat]
| 
my qbittorrent (10.0.2.100 6880)

两点要关注

  1. 公网ip,确保路由器拨号获得的ip是公网的(通过搜索“当前ip”,对比是否与路由器上一致,一致即公网ip),否则没办法
  2. 防护墙,把监听端口打开(iptable设置filter;firewalld设置add-port)
  3. 端口转发,把路由器上的端口请求转发到qb服务器上(iptable设置forward;socat)
# 方案二:启用ipv6(docker)

没有公网ip的用户的唯一选择

⚡注意:
docker版本要求大于20.01

网络拓扑

outter peers
| 
ISP
| 
| [port filter]
| 
my router (pppoe 2000:xxxx:xxxx:xxxx::1/64 9999)
| 
my pc (pppoe 2000:xxxx:xxxx:xxxx::100/64 9999)
| 
| [port forward by docker -p]
| 
my qbittorrent (dhcp ipv6 2000:xxxx:xxxx:xxxx:xx00::33/66 6880)
## 方案一:host方案
---
version: "2.1"
services:
  transmission:
    image: lscr.io/linuxserver/transmission:latest
	...
    network_mode: "host"
## 方案二:映射方案

一般,docker默认不开启ipv6

/etc/docker/daemon.json

{
  "experimental": true,
  "ipv6": true,
  "ip6tables": true,
  "fixed-cidr-v6": "2607:f0d0:1002:51::/66"
}

其中:

  • ip6tables —— 由 Docker 自动配置 IPv6 的防火墙规则。默认false
  • fixed-cidr-v6 —— 指定子网前缀,划分子网段。根据实际情况更改。
$ systemctl restart docker
## 方案二:映射方案 for docker compose

一般docker启用ipv6后,docker compose也会启用

如果另外配置网络的话,必须选择与默认daemon.json不同的 IPv6 子网段

networks:
  example:
    enable_ipv6: true
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "true"
    ipam:
      config:
       - subnet: 172.23.0.0/16
       - subnet: "2607:f0d0:1002:51:4000::/66"
         gateway:2607:f0d0:1002:51:4000::1
## 检查是否开启ipv6
# 检查docker是否开启ipv6
$ docker network inspect bridge
# 测试连接连接状态
$ docker run --rm -it busybox ping -6 -c4 www.google.com
$ docker run --rm -it busybox ip addr

在这里插入图片描述

# 验证端口是否被映射出去的方法

在web ui的底部有图标显示端口开启情况。

如果端口被请求了,会变成🌏图标表示开启成功,否者是🔥图标表示不成功or未被请求

在这里插入图片描述

如何请求端口?

  1. 直接找个资源下一下即可
  2. 通过这个网站测试(不需要webui提示,也能直接找到是否联通)
    https://portchecker.co/canyouseeme

设置:反吸血、自动更新tracker

对于这两个功能,qbittorrent没有提供。因此,网上有很多围绕这两个功能的扩展。

经常被提到的是这两个项目:

这两个都是在qbittorrent的源码基础上扩展,然后重新编译的。

虽然现在对比改动很很方便,但个人不太喜欢。
在这里插入图片描述

其实基于qBittorrent web api提供的功能基础上加些脚本就可以实现这两个功能了。

这是我的脚本: https://github.com/LawssssCat/Self-Host-qBittorrent
(结合docker compose可以实现一键部署)

# 功能介绍:反吸血功能介绍

下面介绍反吸血功能的探究过程:

其实官方ui也自带了“反吸血”功能: 选项》高级》上传连接策略》反吸血

在这里插入图片描述

它的具体策略是这样的: https://github.com/arvidn/libtorrent/blob/master/src/choker.cpp

		// the anti-leech seeding algorithm is based on the paper "Improving
		// BitTorrent: A Simple Approach" from Chow et. al. and ranks peers based
		// on how many pieces they have, preferring to unchoke peers that just
		// started and peers that are close to completing. Like this:
		//   ^
		//   | \                       / |
		//   |  \                     /  |
		//   |   \                   /   |
		// s |    \                 /    |
		// c |     \               /     |
		// o |      \             /      |
		// r |       \           /       |
		// e |        \         /        |
		//   |         \       /         |
		//   |          \     /          |
		//   |           \   /           |
		//   |            \ /            |
		//   |             V             |
		//   +---------------------------+
		//   0%    num have pieces     100%

这只是从特征上防吸血(anti-leech),但实际上会上传更多的比重给那些吸血者(还是我理解错了?光看文字,没看代码)。 https://github.com/qbittorrent/qBittorrent/issues/10258#issuecomment-460659498
【因此,不建议开上述默认反吸血算法的】

下面是github关于这个问题的讨论

由于无法明确识别迅雷这dogB的特征,官方并没给出解决方案。于是有很多基于client名称屏蔽peers的脚本出现
(均是调用这个web api: banPeers

# 功能介绍:自动更新tracker

https://github.com/Jorman/Scripts/blob/master/AddqBittorrentTrackers.sh

External programs: How to

在这里插入图片描述

我的脚本 https://github.com/LawssssCat/Self-Host-qBittorrent/blob/master/script/qbittorrent_webapi_tracker_cli.sh

/script/qbittorrent_webapi_tracker_cli.sh -m add -H "%I"

会在添加torrent时,从订阅中获取trackers,然后添加到那个torrent中

在这里插入图片描述

设置:查询功能

https://github.com/qbittorrent/search-plugins

todo

设置:匿名模式

todo

在这里插入图片描述

设置:魔法过滤

BT的流量不要使用魔法。如果使用魔法要想办法过滤。

原因:

  1. 没必要,而且自己的蓝条(魔法流量)会跑的很快
  2. 如果魔法过于异常,被世人察觉,魔法总部可能会因此消失

设置:文件名过滤 ❗❗❗

这个非常重要。

原因: 纯属自己猜的!

从bt的机制上,存在这种恶意做种的情况:
首先,在一个大文件(用户正真需要的文件)旁放很多小文件(宣传内容),把这些文件打包成一个种子分享出去,起一个吸引人的名字,诱导用户下载并且在上传的时候故意把大文件传一半不传(如删掉)
那么,接收文件的用户就会因为迟迟收不到完整的文件而长时间开着这个torrent。同时,如果该用户愿意上传,那么该torrent的文件可以以指数级的速度传播。
最后,回顾这个过程那些文件被完整的传播了?那些小文件(宣传的内容)!!!

相信用惯torrent的朋友已经能想象到画面了,这是我们使用一些偏老的torrent时经常遇到的情况。真实情况有没有人这样恶意做种?我不敢想象。

如何科学的解决?我还不知道,只知道用屏蔽文件名的粗暴方式将不要的文件排除。
如有更好的解决方案,望告知!

其他

nginx

https://github.com/qbittorrent/qBittorrent/wiki/NGINX-Reverse-Proxy-for-Web-UI

更多详细设置教程

参考qBittorrent参数详细设置教程qBittorrent 设置教程

web ui

client —— 非gui访问工具

alternate web ui —— web api 访问前端

change web ui —— 更改 web 前端

https://github.com/qbittorrent/qBittorrent/wiki/Alternate-WebUI-usage

web api

小结

  • cli 有用,可以编写脚本
  • web ui 没用,花里胡哨,版本升级可能还有适配问题。建议使用原版ui

结合Radarr/Sonarr

todo

https://github.com/Jorman/Scripts

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐