Code Monkey home page Code Monkey logo

pbh-btn / peerbanhelper Goto Github PK

View Code? Open in Web Editor NEW
357.0 5.0 13.0 1.03 MB

自动封禁不受欢迎、吸血和异常的 BT 客户端,并支持自定义规则。PeerId黑名单/UserAgent黑名单/IP CIDR/假进度检测/超量下载检测 支持 qBittorrent/Transmission

License: GNU General Public License v3.0

Java 99.77% Dockerfile 0.09% Shell 0.14%
bittorrent qbittorrent xunlei transmission xl-0002 xl-0003 gt-0002 gt-0003 peerbanhelper dt-torrrent

peerbanhelper's Introduction

PeerBanHelper

自动封禁不受欢迎、吸血和异常的 BT 客户端,并支持自定义规则。

Note

PeerBanHelper 没有内建的更新检查程序,记得时常回来看看是否有新的版本更新,或者 Watch 本仓库以接收版本更新通知 QQ 交流群(临时):932978658,如果在使用过程中需要帮助,您可以在这里和他人一同交流。或者在 Issue Tracker 打开新问题

Tip

❤ PeerBanHelper 是一个社区项目,由贡献者们共同建设。点击此处查看所有一同共建 PeerBanHelper 社区的人们。

主界面 封禁列表 封禁日志 封禁统计
homepage banlist banlogs maxban

安装 PeerBanHelper

请选择您心仪的安装方式:

Docker/Docker Compose Windows Linux
查看 查看 查看

支持的客户端

  • qBittorrent
  • Transmission (3.00-20 或更高版本)

功能介绍

PeerBanHelper 主要由以下几个功能模块组成:

  • PeerID 黑名单(Transmission 不支持)
  • Client Name 黑名单
  • IP 黑名单
  • 虚假进度检查器(提供启发式客户端检测功能)(Transmission不支持过量下载检测)
  • 主动探测
  • 自动 IP 段封禁
  • WebUI (目前支持:活跃封禁名单查看,历史封禁查询,封禁最频繁的 Top 50 IP)

PeerID 黑名单

顾名思义,它根据客户端交换的 Peer ID 来封禁客户端。
通过在列表中添加不受欢迎的客户端的 Peer ID,即可封禁对应客户端。

Warning

Transmission 由于 API 限制,无法使用此功能,请换用 Client Name 黑名单作为替代

查看示例配置文件
  # PeerId 封禁
  # 此模块对 Transmission 不起效
  peer-id-blacklist:
    enabled: true
    # 字符串匹配规则:
    # <匹配方式>@<规则内容> 不区分大小写
    # startsWith - 匹配开头
    # endsWith - 匹配结尾
    # contains - 包含子串
    # equals - 完全匹配
    # regex - 正则匹配
    # length - 长度匹配,规则内容填写整数形式的长度
    banned-peer-id:
      - '{"method":"CONTAINS","content":"-xl0019","hit":"FALSE"}' # 排除迅雷 0019
      - '{"method":"STARTS_WITH","content":"-xl"}'
      - '{"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":"STARTS_WITH","content":"-sp"}'
      - '{"method":"STARTS_WITH","content":"-gt0002"}'
      - '{"method":"STARTS_WITH","content":"-gt0003"}'
      - '{"method":"STARTS_WITH","content":"-dt"}'
      - '{"method":"STARTS_WITH","content":"-tt"}'
      - '{"method":"STARTS_WITH","content":"-tt"}'
      - '{"method":"CONTAINS","content":"cacao"}'
      - '{"method":"STARTS_WITH","content":"-hp"}'

Client Name 黑名单

部分客户端(如 Aria 2)会使用其它 BT 客户端(如:Transmission)的 Peer ID 伪装自己,但客户端名称仍然是自己的真实名称,这种情况可通过 Client Name 黑名单进行封禁。

查看示例配置文件
  # 客户端名称封禁
  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"}'

IP 黑名单

有的客户端(如迅雷离线下载服务器)会使用匿名模式连接,使用通用客户端名称(libtorrent)和通用 Peer ID(-LTXXXX-)来连接您,但封禁通用名称/Peer ID 会误伤不少正常客户端。
对于这种情况,您可以直接封禁这些离线下载服务器的 IP 地址或 IP 段,或者使用的端口。

与 qBittorrent 等客户端内置的 IP 黑名单不同,PeerBanHelper 的 IP 黑名单允许您使用 CIDR 来表示一组 IP 地址,同时支持 IPV4 和 IPV6 的 CIDR 表示法,有效提升了 IP 封禁效率。

查看示例配置文件
  # IP 地址/端口 封禁
  ip-address-blocker:
    enabled: true
    # IP,支持 CIDR,其语法大致如下:
    # ::/64
    # a:b:c:d::a:b/64
    # a:b:c:d:e:f:1.2.3.4/112
    # 1.2.3.4/16
    # 1.2.255.4/255.255.0.0
    ips:
    #- 8.8.8.8
    #- 9.9.9.9
    # 端口
    ports:
    #- 2003

虚假进度检查器

此模块可谓是 PeerBanHelper 的灵魂,有助于您在不更新规则的情况下,发现那些伪装过的异常客户端。
其大体原理如下:

  • 大部分吸血客户端都不会正常上报下载进度(如:进度一直是0%,或者每次连接进度都不同)
  • 虚假进度检查器通过我们上传给此对等体的数据量,计算此对等体的最低真实进度
  • 如果对等体汇报的进度比最低真实进度差别过大,或者给此对等体的总上传量超过了种子本身的体积很多
  • 判定为异常客户端

Warning

Transmission 由于 API 限制,超量下载检测不起作用,暂时没有解决方案

查看示例配置文件
  # 假进度检查
  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

自动 IP 段封禁

批量部署的恶意客户端通常在同一个 IP 段下,PBH 现在允许用户分别为 IPv4 和 IPv6 设置一个前缀长度。在封禁发现的吸血客户端时,会将其所处 IP 地址的指定范围的其余 IP 地址均加入屏蔽列表,实现链式封禁。

查看示例配置文件
  # 范围 IP 段封禁
  # 在封禁 Peer 后,被封禁的 Peer 所在 IP 地址的指定前缀长度内的其它 IP 地址都将一同封禁
  auto-range-ban:
    # 是否启用
    enabled: true
    # IPV4 前缀长度
    ipv4: 30 # /32 = 单个 IP,/24 = 整个 ?.?.?.x 段
    # IPV6 前缀长度
    ipv6: 64 # /64 = ISP 通常分配给家宽用户的前缀长度

添加下载器

PeerBanHelper 能够连接多个支持的下载器,并共享 IP 黑名单。但每个下载器只能被一个 PeerBanHelper 添加,多个 PBH 会导致操作 IP 黑名单时出现冲突。

查看示例配置文件
# 客户端设置
client:
  # 名字,可以自己起,会在日志中显示,只能由字母数字横线组成,数字不能打头
  qbittorrent-001:
    # 客户端类型
    # 支持的客户端列表:
    # qBittorrent
    # Transmission
    # 其它也许以后会加
    type: qBittorrent
    # 客户端地址
    endpoint: "http://ip:8085"
    # 登录信息(暂不支持 Basic Auth)
    # 用户名
    username: "username"
    # 密码
    password: "password"
    # Basic Auth - 不知道这是什么的话,请保持默认
    basic-auth:
      user: ""
      pass: ""
  transmission-002:
    type: Transmission
    endpoint: "http://127.0.0.1:9091"
    username: "admin"
    password: "admin"

手动部署

PeerBanHelper 需要使用 Java 17 或更高版本前置运行环境。

Windows 手动部署

展开手动部署步骤

Eclipse Adoptium 网站下载 Java JDK,版本必须大于等于 Java 17,下载时请选择 .msi 格式的安装包。

运行 MSI 安装包,遇到图中页面时,点击所有条目前面的磁盘小图标,全部选择 “整个功能将安装在本地硬盘上”,随后一路下一步安装到系统中。

image

新建一个文件夹,下载 PeerBanHelper 的最新版本 JAR 文件,并放入你新创建的文件夹中。(从 Release 中,任选一个系统版本,压缩包内包含通用 JAR 文件)

新建一个 start.bat 批处理文件,使用记事本打开,并复制下面的内容保存:

@echo off
chcp 65001
title PeerBanHelper
:main
java -Xmx256M -XX:+UseSerialGC -Dfile.encoding=UTF-8 -Dstdout.encoding=UTF-8 -Dstderr.encoding=UTF-8 -Dconsole.encoding=UTF-8 -Duser.language=en -Duser.region=US -jar PeerBanHelper.jar
timeout /t 5 /nobreak >nul
echo Restarting...
goto main

完成后,双击 start.bat 启动 PeerBanHelper 即可。

Linux 手动部署

我相信 Linux 用户可以自己搞定这一切 ;),如有需要,你还可以配置为系统服务并开机自启。

Docker 部署

Docker 镜像为:ghostchu/peerbanhelper
如需使用 docker-compose 启动,请参见仓库的 docker-compose.yml 文件。

Important

如果您设置了 Docker 镜像源,拉取的镜像可能严重过期。需要显式指定明确的版本号,版本号可在 DockerHub 找到。

使用 Docker CLI 启动

sudo docker run -d --name peerbanhelper -p 9898:9898 -v ${PWD}/peerbanhelper-data/:/app/data/ -v /etc/timezone:/etc/timezone ghostchu/peerbanhelper:最新版本号

使用 Docker Compose 文件启动

请参见仓库的 docker-compose.yml 文件,使用 docker-compose up 快速部署。

在群晖 DSM 上,使用 Container Manager 启动

查看手把手DSM配置步骤

首先,为 PBH 创建文件夹,用于存放 PBH 的配置文件。

image

在 Container Manager 中,选择项目,点击新增按钮,来源选择 “创建 docker-compose.yml”(请务必先选择来源,否则后续操作将覆盖已设置的内容)。

image

随后,点击 设置路径 按钮,配置 Docker Compose 的位置到我们刚刚创建的好的文件夹:

image

image

从仓库的 docker-compose.yml 文件中复制所有内容,并粘贴到编辑框中:(需要特别注意的是,如果你配置了 Docker 镜像源,则需要手动指定最新版本号,否则你可能拉取到一个史前版本的镜像,最新的版本号可以在这里找到)

image

如果询问你是否设置网页门户,请不要启用

image

一路下一步,启动容器。首次启动完成后,配置文件应该会自动生成,配置好配置文件后再次重启 Docker 容器即可使用。

image

常见问题

PeerBanHelper 运行在 Docker 里时,下载器 IP 地址怎么填,127.0.0.1 不管用

如果您的 Docker 容器和下载器运行在同一台服务器上,且使用 桥接 网络模式(默认就是桥接),那么您不能使用 127.0.0.1。

前往 Container Manager,找到网络选项卡,查看 bridge 中的网关地址,使用网关地址作为下载器 IP。

image

Transmission 的有限支持

由于 Transmission 有以下问题,因此支持是有限的

  • API 无法获取 PeerID,因此 PeerID 黑名单模块不起作用
  • API 无法获取客户端累计上传下载量,因此 ProgressCheatBlocker 的过量下载检测不起作用
  • API 设置黑名单只能让 Transmission 请求 URL 更新,因此 PBH 需要打开一个 API 端点,且您需要保证 Transmission 能够访问到它(可在 config.yml 中配置细节)
  • API 设置黑名单时不会实时生效,必须使用某种手段使种子上已连接的对等体断开。PBH 会短暂的暂停您的 Torrent 然后恢复它。

Credit

peerbanhelper's People

Contributors

bunipendix avatar gaojianli avatar ghost-chu avatar ovler-young avatar zhongfly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

peerbanhelper's Issues

在Windows上运行错误

用的客户端是qBittorent Enhanced Edition v4.6.3.10
在启动后报错,输出如下日志,并且qBittorent无响应
今天突然变成这样的,不知道什么原因

[14:09:58] [main/INFO]: PeerBanHelper - v1.5 - by Ghost_chu [14:09:58] [main/INFO]: 加载配置文件…… [14:09:58] [main/INFO]: + qBittorrent -> my-really-good-best-ever-bittorrent-downloader (http://127.0.0.1:8080) [14:09:58] [main/INFO]: 正在启动功能模块…… [14:09:58] [main/INFO]: [注册] IP Blacklist [14:09:58] [main/INFO]: [注册] PeerId Blacklist [14:09:58] [main/INFO]: [注册] ClientName Blacklist [14:09:58] [main/INFO]: [注册] Progress Cheat Blocker [14:10:59] [Peer check/WARN]: 在处理 my-really-good-best-ever-bittorrent-downloader (http://127.0.0.1:8080/api/v2) 的 WebAPI 操作时出现了一个非预期的错误 kong.unirest.UnirestException: java.net.SocketTimeoutException: Read timed out at kong.unirest.DefaultInterceptor.onFail(DefaultInterceptor.java:43) ~[PeerBanHelper.jar:?] at kong.unirest.CompoundInterceptor.lambda$onFail$2(CompoundInterceptor.java:54) ~[PeerBanHelper.jar:?] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?] at java.util.Collections$2.tryAdvance(Collections.java:5073) ~[?:?] at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) ~[?:?] at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) ~[?:?] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) ~[?:?] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?] at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) ~[?:?] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?] at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:647) ~[?:?] at kong.unirest.CompoundInterceptor.onFail(CompoundInterceptor.java:56) ~[PeerBanHelper.jar:?] at kong.unirest.apache.ApacheClient.request(ApacheClient.java:138) ~[PeerBanHelper.jar:?] at kong.unirest.Client.request(Client.java:57) ~[PeerBanHelper.jar:?] at kong.unirest.BaseRequest.request(BaseRequest.java:365) ~[PeerBanHelper.jar:?] at kong.unirest.BaseRequest.asString(BaseRequest.java:218) ~[PeerBanHelper.jar:?] at com.ghostchu.peerbanhelper.downloader.impl.qbittorrent.QBittorrent.getPeers(QBittorrent.java:82) ~[PeerBanHelper.jar:?] at com.ghostchu.peerbanhelper.PeerBanHelperServer.banDownloader(PeerBanHelperServer.java:129) ~[PeerBanHelper.jar:?] at com.ghostchu.peerbanhelper.PeerBanHelperServer.banWave(PeerBanHelperServer.java:83) [PeerBanHelper.jar:?] at com.ghostchu.peerbanhelper.PeerBanHelperServer$1.run(PeerBanHelperServer.java:69) [PeerBanHelper.jar:?] at java.util.TimerThread.mainLoop(Timer.java:566) [?:?] at java.util.TimerThread.run(Timer.java:516) [?:?] Caused by: java.net.SocketTimeoutException: Read timed out at sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:278) ~[?:?] at sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:304) ~[?:?] at sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:346) ~[?:?] at sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:796) ~[?:?] at java.net.Socket$SocketInputStream.read(Socket.java:1109) ~[?:?] at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137) ~[PeerBanHelper.jar:?] at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153) ~[PeerBanHelper.jar:?] at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280) ~[PeerBanHelper.jar:?] at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138) ~[PeerBanHelper.jar:?] at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56) ~[PeerBanHelper.jar:?] at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259) ~[PeerBanHelper.jar:?] at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163) ~[PeerBanHelper.jar:?] at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157) ~[PeerBanHelper.jar:?] at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273) ~[PeerBanHelper.jar:?] at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) ~[PeerBanHelper.jar:?] at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272) ~[PeerBanHelper.jar:?] at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186) ~[PeerBanHelper.jar:?] at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89) ~[PeerBanHelper.jar:?] at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110) ~[PeerBanHelper.jar:?] at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185) ~[PeerBanHelper.jar:?] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:118) ~[PeerBanHelper.jar:?] at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56) ~[PeerBanHelper.jar:?] at kong.unirest.apache.ApacheClient.request(ApacheClient.java:129) ~[PeerBanHelper.jar:?] ... 9 more

疑似新的或伪装的吸血客户端

[2024/04/14 12:44:21] [WARNING] [封禁] PeerAddress(ip=220.88.111.208, address=220.88.111.208, port=57951), PeerId=-UT360W-, ClientName=uTorrent 3.6.0.32, Progress=0.0, Uploaded=263437312, Downloaded=0, Torrent=***, Reason=客户端进度:0.00%,实际进度:0.15%,差值:0.15%

不定期根据日志手动补充IP封禁库时发现的

针对服务器提出几种可以潜在发现可疑ip的方法

本人不会java,也不太了解bittorrent协议的细节,就简单说一下我的设想
1. 一般可疑ip会成群出现image
他们会拥有部分相同的ip字段

2.ping和tcp扫描确定是否为服务器
由于使用的是机房的服务器,可以通过ping猜测ip地址是否为公网ip(一般用户nat4 ping不通,ipv6防火墙默认开启),然后扫描tcp端口确定此ip是否向外界提供大量服务
image
image
其它诸如客户端诱饵(在上传一部分内容后断开连接并通过一个伪装成需要下载的客户端请求之前的ip请求之前已经上传的内容,确定对方是否为吸血客户端)之类的想法比较难以实现,暂时不考虑

自簽HTTPS無法連接

登录到 qbittorrent-001 失败:N/A - javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

增加开关豁免私有种子

对于Private的种子类型来说,吸血行为由PT站本身来管理,希望增加开关对于Private种子进行豁免避免误伤

[社区公告] 计划移除 Native-Image 二进制可执行文件支持

在 PBH 过去一段时间的维护中,native-image 制造了相当大量的麻烦。
据统计,我们约有 70% 的时间浪费在如何让一个功能在 native-image 上面正常工作。

因此,PBH 正计划删除 native-image 功能,不再发布平台二进制版本。目前正在向社区征求意见。任何好的建议都欢迎在群聊/本 Issue 下提出。


以下功能在放弃 Native-Image 后有希望继续推进:

  • Windows/Linux 平台下的 GUI 用户界面
  • Windows/Linux 平台下的 “最小化到系统托盘”
  • 现代 WebUI 支持
  • 跨平台/CPU 架构支持,借助 OpenJDK,我们将有能力扩展 PBH 到 ARM、Power PC、Loongarch 和 RISC-V 平台

[bug]启用PBH 后,qb的WEBUI 高频断开连接

环境:
DOCKER部署的qbittorrent v4.6.4
DOCKER部署的PeerBanHelper v2.8
如题,在启用PBH后,从电脑浏览器访问qb的时候间隔几分钟就会在webui的左下方提示:无法访问 qBittorrent 客户端。此时必须刷新页面重新登录qb,过数分钟后又断开,如此反复,复现概率100%。
发生错误时的qb日志:

(N) 2024-04-12T14:45:26 - WebAPI 登录成功。IP:::ffff:192.168.31.225
(I) 2024-04-12T14:45:31 - 检测到外部 IP。IP:“...
(N) 2024-04-12T14:45:50 - WebAPI 登录成功。IP:::ffff:192.168.31.214
(N) 2024-04-12T14:47:46 - WebAPI 登录成功。IP:::ffff:192.168.31.214
(N) 2024-04-12T14:52:20 - WebAPI 登录成功。IP:::ffff:192.168.31.214

发生错误时的PBH日志:

2024-04-12 14:46:51 | stderr | [2024/04/12 06:46:51] [INFO ] [完成] 已检查 qbittorrent-7893 的 1 个活跃 Torrent 和 6 个对等体
(省略一大堆,都是如此,没有任何报错,另PBH输出的时间似乎有误?)

其中,214是我的pc的IP,225为PBH所在docker宿主机的IP

建议默认加上 dt/ 开头的客户端屏蔽

参考:anacrolix/torrent#891 (reply in thread)

上述链接中有人反馈 -GT000*- 系列吸血客户端已变种,我自己也发现了有一批这样的可疑客户端。建议添加到默认配置中。

日志:

[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.24.53, port=9765), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.9045138955116272, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=59.47.225.219, port=15265), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.3246527910232544, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.24.65, port=23241), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.9105703830718994, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.24.67, port=4103), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.7872318029403687, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.24.78, port=29174), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.023757195100188255, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.24.78, port=4442), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.1041862890124321, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.25.93, port=3559), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.5520146489143372, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.25.95, port=681), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.11454735696315765, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=218.7.138.17, port=27020), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.0684981718659401, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=218.7.138.29, port=14552), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.6730507612228394, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=36.102.218.216, port=6284), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.3364207148551941, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=36.102.218.217, port=31920), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.13741496205329895, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=36.102.218.223, port=10713), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.8214547634124756, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/WARN]: [封禁] PeerAddress(ip=59.47.225.152, port=74), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.5097854733467102, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/
[19:00:52] [Peer check/INFO]: [完成] 已检查 qbee 的 79 个活跃 Torrent 和 26 个对等体
[19:00:57] [Peer check/WARN]: [封禁] PeerAddress(ip=1.180.24.222, port=18034), PeerId=-DT0001-, ClientName=dt/torrent/v1.02, Progress=0.0012035582913085818, Uploaded=0, Downloaded=0, Reason=匹配 ClientName 规则:startsWith@dt/

[BUG] Transmission 更改 `rpc-url` 设置后无法正常连接

问题描述

Transmission 更改 rpc-url 设置后无法正常连接

默认的 rpc-url 设置是这样的"rpc-url": "/transmission/",,当我更改为"rpc-url": "/tr/",时会报错如下

[2024/04/20 21:03:24] [WARNING] 在处理 Transmission-BGmi (http://192.168.31.90) 的 API 操作时出现了一个非预期的错误 
java.util.NoSuchElementException: No value present
	at [email protected]/java.util.Optional.orElseThrow(Optional.java:377)
	at cordelia.client.TrClient.session(TrClient.java:123)
	at cordelia.client.TrClient.execute(TrClient.java:94)
	at cordelia.client.TrClient.execute(TrClient.java:85)
	at com.ghostchu.peerbanhelper.downloader.impl.transmission.Transmission.login(Transmission.java:62)
	at com.ghostchu.peerbanhelper.PeerBanHelperServer.lambda$handleDownloader$5(PeerBanHelperServer.java:220)
	at [email protected]/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768)
	at [email protected]/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1760)
	at [email protected]/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:507)
	at [email protected]/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1491)
	at [email protected]/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:2073)
	at [email protected]/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:2035)
	at [email protected]/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:187)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:853)
	at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:829)

原因分析

具体原因在于这行代码指定了Transmission 更改 rpc-url 路径,导致出现此BUG,建议修改为自定义项。

https://github.com/Ghost-chu/PeerBanHelper/blob/01de7ddfa51d8f5bef47f84a1ae2c9c85e6e4f60/src/main/java/com/ghostchu/peerbanhelper/downloader/impl/transmission/Transmission.java#L38

封禁列表持久化

RT,目前升级PBH之后只要一重启服务,封禁列表就会丢失,应该考虑持久化

[FEATURE] 建议提供预编译构件 (Native-Image)

我简单翻了一下代码,发现没有用到太多的反射特性,于是挂个 tracing agent 本地跑了一下构建

感觉编译通过的希望还是很大的

image

不清楚是不是 graal 的问题,但是到连接的时候爆炸了。如果能 AOT 的话,可以进一步压缩资源占用并且提供更快的冷启动速度

当然,这只是一个建议,不是说非要不可(

Full log: https://angry.im/paste/3K2rIDp

[开发预览] IP 段连锁封禁 & 封禁历史 & 持久化数据存储 & 简易分析 (2024/04/11)

欢迎来到开发预览!这里将推送一下目前处于开发分支的新功能预览。在他们正式被合并到主分支之前,欢迎各位提出改进意见!

另寻前端朋友,JS 和 HTML 糊的心态炸裂。

IP段连锁封禁

批量部署的恶意客户端通常在同一个 IP 段下,PBH 现在允许用户分别为 IPv4 和 IPv6 设置一个前缀长度。在封禁发现的吸血客户端时,会将其所处 IP 地址的指定范围的其余 IP 地址均加入屏蔽列表,实现链式封禁。

(图片仅供演示,正式版不会默认封禁整个 /24)

Snipaste_2024-04-11_00-12-43

Snipaste_2024-04-11_00-12-35

封禁历史

在 PBH 引入嵌入式数据库后,现在有能力持久记录封禁的历史记录。你可以在这里找到目前和过去被封禁的客户端的具体情况。

Snipaste_2024-04-11_00-08-18

简易分析

我觉得简单到看一眼图片应该能懂

Snipaste_2024-04-11_00-08-33

会封禁卡在下载元数据的种子的peer

[2024/04/05 03:54:17] [WARNING] [封禁] PeerAddress(ip=***, port=***), PeerId=, ClientName=, Progress=0.0, Uploaded=0, Downloaded=0, Torrent=***, Reason=客户端下载过量:种子大小:-1,上传给此对等体的总量:0,最大允许的过量下载总量:-1 

由于未完成元数据下载的种子的种子总大小未-1,导致 (种子总大小 * excessive-threshold) < 0,就算尚未上传也会ban掉对方。

使用了 latest 版本

请问配置文件生成在什么位置?

第一次接触Java...
平台是macOS。按照指南运行之后显示
WARNING: Runtime environment or build system does not support multi-release JARs. This will impact location-based features.
[02:27:48] [main/INFO]: PeerBanHelper - v1.5 - by Ghost_chu
[02:27:48] [main/INFO]: 加载配置文件……
[02:27:48] [main/WARN]: 请配置 config.yml 和 profile.yml 后,重新启动 PeerBanHelper。

不知道是否成功运行了。在Jar文件那层目录下没有找到。

[样本记录] 123 云盘离线下载

使用 qb 随机选择磁盘上的随机文件夹,搓了一个新的种子上传。

29cb33e7ff403dc36ca3329fc5b09abc

上传种子开始下载后,123 云盘使用下面的 IP、PeerID 和 Client Name 连接到我的 QB,且下载器和网页的进度保持同步:

123.186.146.159:54016
PeerId=-GT0003-, ClientName=offline-download (devel) (anacrolix/torrent unknown), Progress=0.19651740789413452, Uploaded=10657493

通过连接到 QB 的 IP 地址,访问 17778 gotty 端口,发现上面有活动:

17cd4720911f2f5933b49ca22f4fb211

image

此外,抽取 UA 为 hp/torrent/v2.01 的连接,访问 17778 gotty 端口,能够连接但是当前没有活动,且编码名称也不太一样,是否真的属于 123 云盘暂不确定,需要持续观测。

ip=36.102.218.217, address=36.102.218.217, port=4425), PeerId=-HP0001-, ClientName=hp/torrent/v2.01, Progress=0.5314083695411682, Uploaded=16732

image

[开发预览] Windows / Linux 跨平台 GUI

对 PBH 添加了一个简单的 GUI,目前还在测试过程中,欢迎提供反馈。

GUI 的目的主要是:

  • 在已经安装了 JDK 的设备上,双击即可运行 PBH,免去打开黑色控制台的烦恼
  • 在支持图形化环境的系统上,可以提供一个稍微友好一丢丢的界面显示日志信息
  • 在支持系统托盘的系统上,可以关闭窗口到系统托盘
1bd1e0b169f6de1d07f39e9c180334c5 8fb7ebf5a13972067d356b446639b3d2 986d53e1078431def356040469a61599

可疑的新客户端

如图,这个客户端有多个可以连接,似乎可以正常下载完,不过流量非常大。
截屏2024-03-02 11 07 57
还需要更多证据

群晖6.x系统上三方仓库的Transmission无法正确的启用黑名单

Transmission版本为3.0.19,群晖为DS918+黑群晖 版本为DSM 6.2.1-23824 Update 6。

目前遇到了以下2个问题:
1)Transmission的client-name用的是peer-id,所以需要从peer-id复制规则到Client-name。
[2024/04/07 14:22:32] [WARNING] [封禁] PeerAddress(ip=1.180.24.85, port=13042), PeerId=, ClientName=-DT0001-, Progress=0.3825, Uploaded=-1, Downloaded=-1, Torrent=*, Reason=匹配 ClientName (UserAgent): contains@DT0001

2)黑名单没有起作用,在检测到有恶意client后,种子会被停止,但不会再次开启,黑名单也没有用,再次打开种子还会连接到恶意client,再次触发自动停止。
[2024/04/07 14:29:49] [WARNING] [封禁] PeerAddress(ip=1.180.24.85, port=13042), PeerId=, ClientName=-DT0001-, Progress=0.5272, Uploaded=-1, Downloaded=-1, Torrent=e, Reason=匹配 ClientName (UserAgent): contains@DT0001
[2024/04/07 14:29:49] [INFO ] [重置] 正在断开 Transmission 上的 1 个种子连接的对等体,以便应用 IP 屏蔽列表的更改
[2024/04/07 14:30:04] [WARNING] [封禁] PeerAddress(ip=1.180.24.85, port=13042), PeerId=, ClientName=-DT0001-, Progress=0.5312, Uploaded=-1, Downloaded=-1, Torrent=
, Reason=匹配 ClientName (UserAgent): contains@DT0001
[2024/04/07 14:30:05] [INFO ] [重置] 正在断开 Transmission 上的 1 个种子连接的对等体,以便应用 IP 屏蔽列表的更改

compose文件是不是應該這樣寫

services:
  peerbanhelper:
    image: "ghostchu/peerbanhelper:latest-native-linux"
    restart: unless-stopped
    container_name: "peerbanhelper"
    volumes:
      - ./:/app/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "9898:9898"
    environment:
# 取消注释以使用 Native Image 本地二进制文件,占用资源更少,但可能有 BUG
#      - USE_NATIVE_IMAGE=1

[bug]启用PBH 后,qb的WEBUI 高频断开连接

环境:
DOCKER部署的qbittorrent v4.6.4
DOCKER部署的PeerBanHelper v2.8
如题,在启用PBH后,从电脑浏览器访问qb的时候间隔几分钟就会在webui的左下方提示:无法访问 qBittorrent 客户端。此时必须刷新页面重新登录qb,过数分钟后又断开,如此反复,复现概率100%。
发生错误时的qb日志:

(N) 2024-04-12T14:45:26 - WebAPI 登录成功。IP:::ffff:192.168.31.225
(I) 2024-04-12T14:45:31 - 检测到外部 IP。IP:“...
(N) 2024-04-12T14:45:50 - WebAPI 登录成功。IP:::ffff:192.168.31.214
(N) 2024-04-12T14:47:46 - WebAPI 登录成功。IP:::ffff:192.168.31.214
(N) 2024-04-12T14:52:20 - WebAPI 登录成功。IP:::ffff:192.168.31.214

发生错误时的PBH日志:

2024-04-12 14:46:51 | stderr | [2024/04/12 06:46:51] [INFO ] [完成] 已检查 qbittorrent-7893 的 1 个活跃 Torrent 和 6 个对等体
(省略一大堆,都是如此,没有任何报错,另PBH输出的时间似乎有误?)

其中,214是我的pc的IP,225为PBH所在docker宿主机的IP

[Dev Preview] The new WebUI

Hello guys, I have wrote a new WebUI in these days with @XiaoXice, and now it can basically work, I am glad to introduce it to you.
This new UI is based on the latest FE stack, fixed bugs like #52 and brings many new features.

To have a try: https://pbh.u2b.eu/
Currently it is an independent project, you can test it by changing the endpoint in the settings.

I need some helps to integrate it into the pbh. Also there are still many bugs in it, I am looking for help to improve it.

[开发预览] 外部执行器 & BTN 网络 (2024/04/14)

外部执行器

在我们开发 PBH 的过程中,我们注意到相当一部分的 BT 软件(如:uTorrent、BitComet、Aria2)并没有完善的 IP 封禁列表功能。为了能够兼容这些客户端,我们推出了 “外部执行器” 功能。

目前外部执行器有两种:

  • ipfilter.dat 执行器
    • 在 Banlist 发生更改时,会更新 data/ipfilter.dat 文件,以供其它 BT 客户端使用
  • command-exec 执行器
    • command-exec 执行器能够在本机上执行一个或者多个系统命令,并在执行命令前,设置此命令进程的环境变量,并替换命令中的占位符,你可以用它来执行命令,设置系统防火墙,阻断IP地址

要在只读模式下兼容这些客户端,需要进行架构更改。此功能也在 v3 分支中逐步进行适配,也欢迎关注开发进度。

示例配置文件:

# 封禁列表处理
# PBH 能够除了调用 BT 客户端的封禁 API 外,还能够进行如下操作,以便适配更多其它客户端
banlist-invoker:
  # 生成 ipfilter.dat 文件
  ipfilter-dat:
    enabled: true
  # 执行指定的系统命令
  # 所有的可用占位符都会被注册到执行的命令的进程环境变量中
  #如果您的命令没有读取环境变量的能力,则也可以使用 {%占位符名%},这样 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:
      - "cmd /c echo reset!"
    ban:
      - "cmd /c echo ban!"
    unban:
      - "cmd /c echo unban!"

BTN 网络

BTN 全名 Bittorrent Threat Network,是一个基于用户上报数据、根据信誉度生成规则的系统。用户通过 BTN 兼容客户端上报自己下载器上连接的 Peers 以及这些 Peers 的有关信息到 BTN 网络,BTN 可以根据这些信息分析哪些客户端明显异常。尽管更改 PeerID 和 Client Name 能够绕过单机检测,但这种小把戏无法欺骗更多的人。一旦数据汇总,便会出现明显异常(如:IP段下大量客户端,有大量下载但无上传,PeerID/UA 频繁更改等等)。

BTN 除了收集和汇总数据,也支持服务器规则下发。BTN 兼容客户端可以和 BTN 网络联系以更新自己的规则。

目前 BTN 正在活跃开发,一旦完成基本功能,BTN 将会以 MIT 协议开源。

示例配置文件:

# BitTorrent Threat Network 威胁防护网络
btn:
  # 启用 BTN 模块
  enabled: true
  # 启用数据提交(匿名)
  # BTN 网络基于所有启用此功能的用户提交的数据,对 Peers 进行可信度验证
  # 通过启用此选项,您也会加入 BTN 网络并提交您的 Torrent 上的活动
  # 以下信息将被发送到 BTN 实例;
  # 您的 Torrent 列表(包括:Torrent 种子摘要的二次不可逆哈希和 Torrent 大小)
  # 连接到您的 Torrent 的所有 Peers (包括:IP地址、端口号、PeerID、UserAgent(ClientName),Peer协议,Peer总下载量,Peer总上传量,Peer瞬时上传速度,Peer瞬时下载速度,Peer下载进度,以及您的下载器名称)
  submit: true
  # 部分 BTN 实例可能要求您登录验证,如果是这样的话,您可在下面输入凭据信息
  app-id: "xxxxxxxxxxxxxxxxxxxx"
  app-secret: "xxxxxxxxxxxxxxxxxxx"
  # 填写实例 URL
  config-url: "https://xxxxxxxxxxx/ping/config"

如果您想要加入 BTN 网络测试,请加入 PBH QQ 讨论群。

UTF-8 兼容问题

除了锁定编码,还得锁定能正常显示中文的字体才行哦~

image

虽然只要自己手动修改一次就可以了……但如果作为便携版使用的话则会因为配置信息丢失而使用默认值,导致再次出现无法显示中文字符的问题。搞搞它!

Native image can't run on alpine

Source: Github Release
Log:

[2024/04/16 05:46:30] [SEVERE ] [错误] PeerBanHelper 启动失败,遇到致命错误,请检查控制台日志 
com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: Error opening connection
	at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:584)
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:571)
	at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:98)
	at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80)
	at com.ghostchu.peerbanhelper.database.DatabaseManager.setupDatabase(DatabaseManager.java:37)
	at com.ghostchu.peerbanhelper.database.DatabaseManager.<init>(DatabaseManager.java:25)
	at com.ghostchu.peerbanhelper.PeerBanHelperServer.prepareDatabase(PeerBanHelperServer.java:134)
	at com.ghostchu.peerbanhelper.PeerBanHelperServer.<init>(PeerBanHelperServer.java:97)
	at com.ghostchu.peerbanhelper.Main.main(Main.java:89)
	at java.base@22/java.lang.invoke.LambdaForm$DMH/sa346b79c.invokeStaticInit(LambdaForm$DMH)
Caused by: java.sql.SQLException: Error opening connection
	at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:283)
	at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:67)
	at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:28)
	at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:19)
	at org.sqlite.JDBC.createConnection(JDBC.java:106)
	at org.sqlite.JDBC.connect(JDBC.java:79)
	at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:120)
	at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:360)
	at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202)
	at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:461)
	at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:550)
	... 8 more
Caused by: org.sqlite.NativeLibraryNotFoundException: No native library found for os.name=Linux-Musl, os.arch=x86_64, paths=[/usr/lib64:/lib64:/lib:/usr/lib]
	at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:361)
	at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:75)
	at org.sqlite.core.NativeDB.load(NativeDB.java:69)
	at org.sqlite.SQLiteConnection.open(SQLiteConnection.java:280)
	... 18 more

写了个多拨检测模块,但是持久化不太会写,请问能否接手?

有一组青岛ip是同时下载一个种子,但是每个都正常报告进度,估计是有比较复杂的检测对抗逻辑。

针对这种情况开发了一个基于多拨检测的封禁模块(同一网段集中下载同一个种子视为多拨,因为多拨和PCDN强相关所以可以直接封禁),主要逻辑和配置都写好了,但是不熟悉SQLite所以持久化的部分只写了一半,怕写出bug,能否请老兄接手检查补充,做成完整的模块?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.