V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
AkaGhost
V2EX  ›  分享创造

做了一个屏蔽坏 Peer 的小工具 PeerBanHelper,支持 qBittorrent 和 Transmission

  •  1
     
  •   AkaGhost · 44 天前 · 1045 次点击
    这是一个创建于 44 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前情提要

    个人是 P2P 爱好者,平常分享大文件(如 MC 旧地图归档)都用 BT 分发。因此也有长期 NAS 开机做种的习惯。
    自上个月早些时候开始,有一些奇妙 Peer ,顶着 dt/torrent,或者 github.com/anacrolix/torrent (devel) (anacrolix/torrent unknown) 的 UA 开始无限制的拉取文件,单个文件的分享率被拉到 500.0 +,消耗了大量带宽和流量,并似乎因此招来了联通师傅上门检查 PCDN 。

    Imgur

    github.com/anacrolix/torrent (devel) (anacrolix/torrent unknown) 为关键字检索,在 https://github.com/anacrolix/torrent/discussions/891 上有大量类似受害者参与讨论。

    小工具的目的

    这似乎是首次对 BT 社区的攻击。有第一次,就一定不会是最后一次。
    Github 上的脚本和工具都是针对迅雷等吸血 Peer 进行屏蔽,但从未考虑过诸如此类纯恶意的客户端。
    在 PBH 诞生前,使用 BT 客户端内建的 IP 屏蔽名单是唯一的对抗手段。

    因此,使用可持续的手段与攻击作斗争是必要的投入。在一个月的敲敲打打中,功能终于完善的差不多了,也终于可以发到 V2 上一起分享一下了。

    你这个小工具能干什么

    • 它能够像你熟悉的那些脚本一样,对吸血雷或者磁力播放器进行屏蔽,配置文件在功能和复杂性取得了折中,相信 V2 的大家都能够一看就会,轻松上手轻松编写规则
    • 它能够增强 BT 客户端自带的 IP 屏蔽功能,例如:可以支持 CIDR 表示,同时支持 IPV4 和 IPV6 ;并能够屏蔽来自特定端口的连接
    • 善于发现异常客户端,能够检测汇报假下载进度的行为,并能够拦截像本次攻击一样无限下载文件的恶意行为;在客户端出现进度异常或者下载了远远超过文件原本大小数据时阻断它们
    • 除了被动检查,也可以主动出击;能够对连接到下载器的 Peer 主动发起 TCP 端口测通、ICMP 测试和 HTTP/HTTPS 请求。如果攻击者采用批量部署,那么可以使用此功能检测攻击者的特征服务并屏蔽它

    console

    如何部署

    可以参见 Ghost-chu/PeerBanHelper 仓库的 README ,通过 Docker 快速部署或者手动设置服务。

    结尾

    首次在 V2 上分享自己的小工具,如果能帮到忙那就太好了,以及希望没有发错节点。
    最后,PBH 没有内建的更新检查系统,所以也许需要偶尔回来看看有没有新的更新。

    3 条回复
    wu67
        1
    wu67  
       44 天前
    之前自己写了一个类似的工具, 思路是直接把非常规 peerid 给 ban 掉的, 配合最小加密, 目前用着挺正常

    https://github.com/wu67/block_BT_vampire

    另外有个问题想咨询, 就是部分场景下 peerid 会被填充成%00%00%00 这样的字符串, 就全是%00, 这种是什么情况下触发的? 感觉不像是恶意攻击, 因为我自己用的 aria2 也出现过, 甚至不知道怎么的把我本机 ip 给 ban 了...
    AkaGhost
        2
    AkaGhost  
    OP
       44 天前
    @wu67 没有遇到过,但从这个百分号来看不排除可能是某种格式化字符串的占位符。从 Aria2 的 RPC 源代码顺过来看,问题可能出在 https://github.com/aria2/aria2/blob/a8cb271b044230f38085be7fc185c30eb1f52d36/src/util.cc#L425 这个函数。

    提醒:我并不会 CPP ,这只是根据已有代码的推断,如果有错误还请指正:

    从函数大概来看对于数字和字母的处理方式是原样复制,其它的会用 `fmt("%%%02X", target[i]) ` 这个解码成百分号打头的某种编码。如果是空 byte ( 0x00 )我觉得时可能会出现你说的这个情况。

    至于空数组怎么来的:可能是因为连接未完全完成(连接已建立但还没有交换 PeerID ),RPC 返回了一个空字节数组。
    wu67
        3
    wu67  
       44 天前
    @AkaGhost
    就是%+两位十六进制的数字, 用来表示一个非数字和字母的字符.
    绝大部分标准 bt 客户端的 peerid 都是-开头、长度至少 24 的, 就是%2d 开头的字符串, 其他的我也搞不懂了, 就纯纯的凑合着用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2985 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:57 · PVG 21:57 · LAX 06:57 · JFK 09:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.