mistgate 文档
中文

在管理后台:节点

BT 下载拦截

按节点启用的 BitTorrent 拦截功能、可识别的流量、它如何拦截 AmneziaWG 和 Hysteria2 流量、事件显示的内容,以及它无法拦截的情况。

本页内容

许多服务商会在收到 BitTorrent 下载滥用投诉后暂停服务器。每个节点都可以拦截已识别的用户 BitTorrent 流量。此功能默认关闭,需按节点设置。

开启拦截#

打开节点的设置,勾选拦截已识别的 BitTorrent 流量,然后点击保存。与其他节点设置一样,所有者和协作者都可以更改此选项。

  • 节点的 Agent 必须支持此功能(报告 torrentguard/1 的 Linux Agent)。旧版 Agent 会将开关显示为灰色,并提示「请更新此节点的 Agent,以启用该设置」;参见更新。关闭此功能始终有效。
  • 保存更改后,节点上的 Hysteria2 协议配置会重启,因此已有连接无法继续使用旧策略。用户会在几秒内重新连接。AmneziaWG 协议配置不会重启。

可识别的流量#

只识别明文 BitTorrent 流量,并且必须符合经过验证的协议结构。端口号不能作为证据。

协议标签 可识别的内容
bittorrent_tcp TCP 流开头的 BitTorrent 握手。
bittorrent_dht DHT 查询(采用 bencode 编码的 KRPC 查询)。
bittorrent_tracker UDP tracker 的连接请求:16 字节,包含协议规定的固定 64 位魔数。
bittorrent_utp 独立的 uTP SYN,没有已确认的数据包,并且符合两种客户端报文头结构之一。

只有 tracker 连接握手会被识别。Announce 和 scrape 请求没有固定标记,因此不能仅凭其数据结构作为证据;真实客户端总会先连接,而连接会被拦截。系统不会检查 DNS:目标端口为 53 和 5353 的数据报会被放行,因为 DNS 查询的字节内容任意,有时可能恰好符合 BitTorrent 数据结构。

Transmission 的 DHT 查询使用 4 字节事务 ID;检测器除了接受其他客户端使用的两字节 ID,也接受这种 ID。

系统只会检测用户客户端发出的流量,不会检测互联网返回的流量。远端节点无法利用伪造数据包让用户被拦截或报告;普通 DHT 响应、uTP 数据包和 QUIC 流量也不会计入。

拦截方式#

AmneziaWG#

Agent 会在转发路径中添加自己的 nftables 表 mistgate_torrentguard。只有客户端通过节点 AmneziaWG 接口发出的流量会传到 Agent,而且只处理每条连接的初始流量:客户端发起的 TCP 连接的首批数据包,以及尚未收到回复的 UDP 流数据报。两个 AmneziaWG 接口之间的流量不在拦截范围内。

数据包匹配后,内核会标记其连接并将其丢弃;该连接后续双向传输的数据包也会被丢弃。匹配的 UDP 数据报会被丢弃。其他流量留在内核中,不会到达 Agent。此队列采用故障时放行机制:如果 Agent 停止监听,未检查的流量会继续传输,不会因此中断。

Hysteria2#

Hysteria2 引擎会检查为用户建立的连接。如果出站 TCP 连接的首批字节是 BitTorrent 握手,就会关闭连接;如果 UDP 数据报包含可识别的请求,就会丢弃该数据报。同一用户的其他流量会继续传输。在判断流量类型之前,引擎最多会暂存数据流的前 19 个字节;TLS、HTTP 和其他普通流量的开头会立即显示出与握手不同。

无法拦截的情况#

检测尽力而为。以下流量仍可能通过:

  • 加密的 BitTorrent(消息流加密);
  • 在其他 VPN 或代理中传输的 BitTorrent;
  • HTTPS 网络种子;
  • 分片数据包,以及解析器不认识的格式。

此功能可以减少投诉,但无法保证投诉为零。

事件#

每条被检测到的流量仍会被拦截。强匹配(tracker_connect、dht_query 和 tcp_handshake)会立即作为节点事件中的 torrent_attempt 警告报告。uTP SYN 是较弱的证据:单个 SYN 无法确定用户。只有在 10 分钟内,同一用户和协议配置在至少三个目标端口上被检测到至少 5 次时,Agent 才会报告。之后适用五分钟事件限额。

事件会显示协议配置、传输方式(tcp 或 udp)和 BitTorrent 协议。节点能够可靠判断用户时才会显示用户:Hysteria2 会显示登录的用户;AmneziaWG 会显示其隧道地址只属于该协议配置中一个用户的设备。否则会显示「未知用户」。每条事件还会显示节点匹配到的内容(evidence)和目标端口(dst_port)。

evidence 节点匹配到的内容
tracker_connect UDP tracker 连接请求(协议魔数)。
dht_query DHT 查询。
utp_syn uTP 连接的开始。
tcp_handshake TCP 流开头的 BitTorrent 握手。

系统只保留目标端口,不保留地址:客户端地址和目标地址都不会离开节点。可以在节点的事件标签页,以及 API 和 MCP 中查看事件(使用代码 torrent_attempt 调用 events_search)。

告警和 Telegram#

尝试使用 BT 下载的用户会在运行状况的用户标签页和用户页面的连接区域中收到一条 BT 下载尝试告警,例如「alice 正在 EE 上尝试使用 BT 下载:一天内 7 次尝试,均已被拦截」。告警会显示节点名称(最多五个,超出部分显示「+N」)、过去 24 小时的尝试次数、最近一次尝试的判定依据和目标端口(最多五个)。次数按已记录事件计算,并受上述五分钟限额限制。

每位用户只有一条告警,与涉及的节点数无关。尝试持续期间告警保持打开;一天内没有新尝试后告警关闭。告警打开时 Telegram 会发送一次通知,因此每位用户每天最多收到一条消息。持续尝试不会重复通知,告警关闭时也不会发送消息。安静一天后再次尝试,会产生新告警并发送新消息。此告警不计入告警角标,也可以像其他告警一样设为静默。

此版本不会针对节点无法归属到用户的事件(「未知用户」)发出告警,也不会针对已停用或已删除的用户发出告警。缺少 evidence 的旧版 Agent 产生的事件仍会保留在节点的事件标签页中,但不会触发用户告警。

如果节点无法启动 AmneziaWG 部分(例如内核不支持 netfilter queue),节点会显示一条 torrent_guard_degraded 警告事件和原因。该节点上的 AmneziaWG 流量随后会未经检查直接传输;Hysteria2 部分仍会独立工作。

在 GitHub 上编辑此页