PBH-BTN / PeerBanHelper

自动封禁不受欢迎、吸血和异常的 BT 客户端,并支持自定义规则。PeerId黑名单/UserAgent黑名单/IP CIDR/假进度/超量下载/进度回退/多播追猎/连锁封禁/伪装检测 支持 qBittorrent/Transmission/Deluge/BiglyBT
GNU General Public License v3.0
539 stars 15 forks source link

关于Transmission中的封禁无法起作用的问题 #146

Closed leosejin closed 1 week ago

leosejin commented 3 weeks ago

首先感谢您为BT所作出的巨大贡献!

现状描述: 1.PBH安装于黑群晖7.1.1 Docker,镜像版本为4.0.6; 2.群晖Qbit(4.3.9)和Transmission(4.0.5-26)均可以正常使用,套件版,非Docker版; 3.PBH的dashboard可以正常显示两个下载器

问题描述: 1.Docker启动过程中有一个ERROR,但后面还是能跑起来,且后面它自己在更新规则 1 2

2.Dashboard里面只有Qbit的封禁记录,没有Transmission的记录,且迅雷依然在Transmission里吸血 3

我的配置文件: config文件

config-version: 8
# 客户端设置
client:
  # 名字,可以自己起,会在日志中显示,只能由字母数字横线组成,数字不能打头
  qbittorrent-001:
    # 客户端类型
    # 支持的客户端列表:
    # qBittorrent
    # Transmission
    # 其它也许以后会加
    type: qBittorrent
    # 客户端地址
    endpoint: http://192.168.x.x:8085
    # 登录信息(暂不支持 Basic Auth)
    # 用户名
    username: admin
    # 密码
    password: admin
    # Basic Auth - 不知道这是什么的话,请保持默认
    basic-auth:
      user: ''
      pass: ''
    # 验证 SSL 证书有效性
    verify-ssl: true
    # Http 协议版本
    http-version: HTTP_1_1
    # 增量封禁(有助于缓解保存封禁列表时的下载器压力,但可能不稳定,可能在部分下载器上会导致无法封禁Peers)
    increment-ban: false
  transmission-002:
    type: Transmission
    endpoint: "http://192.168.x.x:9091"
    username: "admin"
    password: "admin"
    verify-ssl: true
    http-version: "HTTP_1_1"
    rpc-url: "/transmission/rpc"
# Http 服务器设置
server:
  # 监听端口
  http: 9898
  # 客户端远程 URL 设置
  # Docker 网络请改 host 模式使用或者设置容器端口暴露
  # 当客户端需要与 PBH 通信时,客户端的 URL 会被更改为 http://<address>:<http-port>/<client-api-route>
  address: 127.0.0.1
  # 在 PBH 需要给下载器传递地址时,将使用此地址传递,请确保此地址最终可被下载器访问,请【不要】以 / 结尾
  prefix: http://127.0.0.1:9898
  # 要访问 WebUI 端点,则必须输入此 Token 以进行身份验证
  token: 5aea05c0-2666-4bbb-9cf6-xxxxxxx
# 日志记录器配置
logger:
  # 是否隐藏 [完成] 已检查 XX 的 X 个活跃 Torrent 和 X 个对等体 的日志消息?
  # 在 DSM 的 ContainerManager 上有助于大幅度减少日志数量,并仅记录有价值的封禁等日志条目
  hide-finish-log: false
lookup:
  # 启用 DNS 反查,能够通过 IP 反查域名,但可能增加你所使用 DNS 服务器的压力,并可能导致 DNS 服务器对你采取降低服务质量的措施
  dns-reverse-lookup: false
# 数据持久化
persist:
  # 封禁日志保留天数(开发中)
  ban-logs-keep-days: 30
  # 持久保存封禁列表
  banlist: true
# BitTorrent Threat Network 威胁防护网络(测试版)
btn:
  # 启用 BTN 模块
  # 启用后,才可以使用由 BTN 提供的云规则功能
  enabled: false
  # 启用数据提交(匿名)
  # BTN 网络基于所有启用此功能的用户提交的数据,对 Peers 进行可信度验证
  # 通过启用此选项,您也会加入 BTN 网络并提交您的 Torrent 上的活动
  # 以下信息将被发送到 BTN 实例;
  # 您的 Torrent 列表(包括:Torrent 种子摘要的二次不可逆哈希和 Torrent 大小)
  # 连接到您的 Torrent 的所有 Peers (包括:IP地址、端口号、PeerID、UserAgent(ClientName),Peer协议,Peer总下载量,Peer总上传量,Peer瞬时上传速度,Peer瞬时下载速度,Peer下载进度,以及您的下载器名称)
  submit: true
  # 部分 BTN 实例可能要求您登录验证以确认您的身份或下发不同的配置文件。如果是这样的话,您需要在下面输入凭据信息
  # 如果 BTN 实例未要求您登录验证,则通常不需要填写
  app-id: example-app-id
  app-secret: example-app-secret
  # 填写实例 URL,您需要自行寻找一个 BTN 实例服务器
  config-url: http://127.0.0.1:9988/ping/config
# 封禁列表处理
# PBH 能够除了调用 BT 客户端的封禁 API 外,还能够进行如下操作,以便适配更多其它客户端
banlist-invoker:
  # 生成 ipfilter.dat 文件
  ipfilter-dat:
    enabled: false
  # 执行指定的系统命令
  # 所有的可用占位符都会被注册到执行的命令的进程环境变量中
  # 如果您的命令没有读取环境变量的能力,则也可以使用 {%占位符名%},这样 PBH 会在执行前替换命令中的占位符,但请注意转义问题
  # 可用占位符列表:
  # peer.ip - 对等体 IP 地址
  # peer.port - 对等体端口
  # meta.context - 封禁模块上下文
  # meta.description - 封禁描述
  # meta.banAt - 封禁时间
  # meta.unbanAt - 解封时间
  # meta.peer.id - PeerID
  # meta.peer.clientName - UserAgent 客户端名称字符串
  # meta.peer.uploaded - 总上传量
  # meta.peer.downloaded - 总下载量
  # meta.peer.progress - 客户端进度
  # meta.torrent.id - Torrent ID
  # meta.torrent.name - Torrent 名称
  # meta.torrent.hash - Torrent 的 Info Hash
  # meta.torrent.size - Torrent 大小
  command-exec:
    enabled: false
    reset:
    - /bin/sh -c 'ipset destroy peerbanhelper-blocklist'
    - /bin/sh -c 'ipset create peerbanhelper-blocklist hash:ip'
    - /bin/sh -c 'iptables -I INPUT -m set --match-set peerbanhelper-blocklist src
      -j DROP'
    - /bin/sh -c 'iptables -A OUTPUT -m set --match-set peerbanhelper-blocklist dst
      -j DROP'
    ban:
    - /bin/sh -c 'ipset add peerbanhelper-blocklist ${peer.ip}'
    unban:
    - /bin/sh -c 'ipset remove peerbanhelper-blocklist ${peer.ip}'
# Maxmind GeoIP/ASN 数据库
# https://www.maxmind.com/
# 在您填写相关密钥信息后,PBH 将自动下载所需的数据库文件,这视为您同意 Maxmind 的最终用户许可协议:https://www.maxmind.com/en/end-user-license-agreement
ip-database:
  # ==== 密钥信息开始 ==== - 在 LicenseKeys 页面创建凭据时,网页会提供这些信息
  account-id: ''
  license-key: ''
  # 允许自动更新 Maxmind GeoIP 数据库文件
  auto-update: true
  # ==== 密钥信息结束 ====
  # GeoIP-City 的数据库名称,默认使用免费版(GeoLite2-City),如果您购买了付费的数据库,可以自行替换
  database-city: GeoLite2-City
  # GeoIP-City 的数据库名称,默认使用免费版(GeoLite2-ASN),如果您购买了付费的数据库,可以自行替换
  database-asn: GeoLite2-ASN

profile文件:

config-version: 7
# 检查频率(单位:毫秒)
check-interval: 5000
# 更新 Peers UI 频率(单位:毫秒),此项仅用于显示数据,不影响封禁,建议设置一个不会给下载器增加太多压力的值
update-live-peers-interval: 13000
# 封禁持续时间(单位:毫秒)
ban-duration: 86400000
# 功能模块
module:
  # PeerId 封禁
  # 此模块对 Transmission 不起效
  peer-id-blacklist:
    enabled: true
    # method = 匹配方式
    #  + STARTS_WITH = 匹配开头
    #  + ENDS_WITH = 匹配结尾
    #  + LENGTH = 匹配字符串长度
    #     + 支持的额外字段
    #       * min = 最小长度
    #       * max = 最大长度
    #  + CONTAINS = 匹配包含
    #  + EQUALS = 匹配相同
    #  + REGEX = 匹配正则表达式(大小写敏感)
    # content = 匹配的内容(除正则外忽略大小写)
    # if = 表达式控制器,当 if 的表达式为 true 时,则检查此规则;否则此规则被忽略。
    #  + if 表达式可以为 true/false, 1/0 或者一个嵌套的规则
    # hit = 匹配成功返回的行为代码
    #  + TRUE = 在 if 中代表 true,在规则中代表 BAN(封禁)
    #  + FALSE = 在 if 中代表 false,在规则中代表 SKIP(排除)
    #  + DEFAULT = 在 if 中代表 true,在规则中代表 NO_ACTION(默认行为)
    # miss = 匹配失败返回的行为代码(与上相同)
    # 规则从上到下执行
    banned-peer-id:
    - '{"method":"STARTS_WITH","content":"-xl0019", hit: "FALSE"}'
    - '{"method":"STARTS_WITH","content":"-xl"}'
    - '{"method":"STARTS_WITH","content":"-hp"}'
    - '{"method":"STARTS_WITH","content":"-dt"}'
    - '{"method":"STARTS_WITH","content":"-gt0002"}'
    - '{"method":"STARTS_WITH","content":"-gt0003"}'
    - '{"method":"STARTS_WITH","content":"-sd"}'
    - '{"method":"STARTS_WITH","content":"-xf"}'
    - '{"method":"STARTS_WITH","content":"-qd"}'
    - '{"method":"STARTS_WITH","content":"-bn"}'
    - '{"method":"STARTS_WITH","content":"-dl"}'
    - '{"method":"STARTS_WITH","content":"-ts"}'
    - '{"method":"STARTS_WITH","content":"-fg"}'
    - '{"method":"STARTS_WITH","content":"-tt"}'
    - '{"method":"STARTS_WITH","content":"-nx"}'
    - '{"method":"CONTAINS","content":"cacao"}'

    # 排除列表
    # 这些规则优先级更高,一旦匹配到任何一条,则直接跳过其他所有规则检查,并放行此 Peer
    exclude-peer-id: []
   # 客户端名称封禁
  client-name-blacklist:
    enabled: true
    banned-client-name:
      - '{"method":"STARTS_WITH","content":"-xl00"}'
      - '{"method":"CONTAINS","content":"xunlei"}'
      - '{"method":"STARTS_WITH","content":"taipei-torrent"}'
      - '{"method":"STARTS_WITH","content":"xfplay"}'
      - '{"method":"STARTS_WITH","content":"bitspirit"}'
      - '{"method":"CONTAINS","content":"flashget"}'
      - '{"method":"CONTAINS","content":"tudou"}'
      - '{"method":"CONTAINS","content":"torrentstorm"}'
      - '{"method":"CONTAINS","content":"qqdownload"}'
      - '{"method":"CONTAINS","content":"github.com/anacrolix/torrent"}'
      - '{"method":"STARTS_WITH","content":"qbittorrent/3.3.15"}'
      - '{"method":"STARTS_WITH","content":"dt/torrent"}'
      - '{"method":"STARTS_WITH","content":"dt"}'
      - '{"method":"STARTS_WITH","content":"go.torrent.dev"}'
      - '{"method":"STARTS_WITH","content":"github.com/thank423/trafficconsume"}'
      - '{"method":"STARTS_WITH","content":"taipei-torrent"}'
      - '{"method":"STARTS_WITH","content":"hp/torrent"}'
      - '{"method":"STARTS_WITH","content":"hp"}'
  # - "startsWith@aria2" # 冒充 Transmission 的 PeerId
  # 假进度检查
  progress-cheat-blocker:
    enabled: true
    # Torrent 小于此值不进行检查(单位:字节),对等体可能来不及同步正确的下载进度
    minimum-size: 50000000
    # 最大差值,单位百分比(1.0 = 100% 0.5=50%)
    # PeerBanHelper 根据 BT 客户端记录的向此对等体实际上传的字节数,计算该对等体的最小下载进度
    # 并与对等体汇报给 BT 客户端下载进度进行比较
    # 如果对等体汇报的总体下载进度远远低于我们上传给此对等体的数据量的比例,我们应考虑客户端正在汇报假进度
    # 默认值为:8%
    # 即:假设我们上传了 50% 的数据量给对方,对方汇报自己的下载进度只有 41%,差值大于 8%,进行封禁
    # 对于自动识别迅雷、QQ旋风的变种非常有效,能够在不更新规则的情况下自动封禁报假进度的吸血客户端
    maximum-difference: 0.08
    # 进度倒退检测
    # 默认:最多允许倒退 5% 的进度
    # (考虑到有时文件片段在传输时可能因损坏而未通过校验被丢弃,我们允许客户端出现合理的进度倒退)
    # 设置为 -1 以禁用此检测
    rewind-maximum-difference: 0.05
    # 过量下载:禁止那些在同一个种子的累计下载量超过种子本身大小的客户端
    # 此模块对 Transmission 不起效
    block-excessive-clients: true
    # 过量下载计算阈值
    # 计算方式是: 是否过量下载 = 上传总大小 > (种子总大小 * excessive-threshold)
    excessive-threshold: 1.5
    # IPV4 前缀长度,前缀相同的 IP 都被视为同一个用户
    # 32 = 单个 IP 地址,IPV4 资源宝贵,通常 ISP 不会分配多个 IP 地址
    ipv4-prefix-length: 32
    # IPV4 前缀长度,前缀相同的 IP 都被视为同一个用户
    # 64 = 常见的 ISP 为单个接入用户分配的前缀长度
    ipv6-prefix-length: 64
  # IP 地址/端口 封禁
  ip-address-blocker:
    enabled: true
  #  - ISO_CODE 输入国家或地区的 ISO 代码,大小写敏感,如:CN;UK;TW;HK;JP 等
  # 范围 IP 段封禁
  # 在封禁 Peer 后,被封禁的 Peer 所在 IP 地址的指定前缀长度内的其它 IP 地址都将一同封禁
  auto-range-ban:
    # 是否启用
    enabled: true
    # IPV4 前缀长度
    ipv4: 30 # /32 = 单个 IP,/24 = 整个 ?.?.?.x 段
    # IPV6 前缀长度
    ipv6: 64 # /64 = ISP 通常分配给家宽用户的前缀长度
  # 启用来自 BTN 网络的规则
  btn:
    enabled: true
  # 多拨封禁(实验性功能)
  multi-dialing-blocker:
    enabled: false
    # 子网掩码长度
    # IP地址前多少位相同的视为同一个子网,位数越少范围越大,一般不需要修改
    subnet-mask-length: 24
    # 对于同小区IPv6地址应该取多少位掩码没有调查过,64位是不会误杀的保险值
    subnet-mask-v6-length: 64
    # 容许同一网段下载同一种子的IP数量,正整数
    # 防止DHCP重新分配IP、碰巧有同一小区的用户下载同一种子等导致的误判
    tolerate-num: 3
    # 缓存持续时间(秒)
    # 所有连接过的peer会记入缓存,DHCP服务会定期重新分配IP,缓存时间过长会导致误杀
    cache-lifespan: 86400
    # 是否追猎
    # 如果某IP已判定为多拨,无视缓存时间限制继续搜寻其同伙
    keep-hunting: true
    # 追猎持续时间(秒)
    # keep-hunting为true时有效,和cache-lifespan相似,对被猎杀IP的缓存持续时间
    keep-hunting-time: 2592000
  # 订阅规则
  ip-address-blocker-rules:
    enabled: false
    # 检查间隔
    check-interval: 86400000 # 24小时检查一次 毫秒
    # 规则列表
    rules:
      # 规则ID(任意)
      example:
        # 是否启用
        enabled: false
        # 显示名称
        name: Example
        # 规则文件订阅地址
        url: https://example.com/example.txt
Ghost-chu commented 3 weeks ago

封禁列表还原失败没有影响,PBH 会在出现新的封禁时更新 TR 的封禁列表。

leosejin commented 3 weeks ago

封禁协议未能成功,PBH 会在新的封禁时更新 TR 的封禁协议。

您好,提前祝您端午安康,并感谢您的积极回复!

关于问题中的截图没有速度这一点是我截图中的失误,当时它确实没有速度。不过我确定当迅雷有速度时我在Dashboard的封禁列表中也没有发现此IP的封禁记录,事实上从昨天工作到现在Dashboard里还没有出现一条关于Tr的封禁记录。

Ghost-chu commented 3 weeks ago

封禁协议未能成功,PBH 会在新的封禁时更新 TR 的封禁协议。

您好,提前祝您端午安康,并感谢您的积极回复!

关于问题中的截图没有速度这一点是我截图中的失误,当时它确实没有速度。不过我确定当迅雷有速度时我在Dashboard的封禁列表中也没有发现此IP的封禁记录,事实上从昨天工作到现在Dashboard里还没有出现一条关于Tr的封禁记录。

嗯 应该是bug,TR的API改过很多次,加个群看看吧,最近挺忙的,可能没大有时间修。

Ghost-chu commented 1 week ago

应该修好了