Node Plugins β
插件是可在 Remnawave Node 上激活以获得附加功能的额外模块:Torrent Blocker、Ingress Filter、Egress Filter,以及 Connection Drop 的配置。
节点插件从 Remnawave Panel & Remnawave Node v2.7.0 版本开始可用。
要求
为使插件正常工作,必须在 Remnawave Node 的配置中添加 cap_add: NET_ADMIN 指令。
services:
remnanode:
container_name: remnanode
hostname: remnanode
image: remnawave/node:latest
network_mode: host
restart: always
cap_add:
- NET_ADMIN
ulimits:
nofile:
soft: 1048576
hard: 1048576
environment:
- NODE_PORT=<NODE_PORT>
- SECRET_KEY=<SECRET_KEY>
nftables
确保宿主机上可用 nftables。大多数现代发行版默认已安装。
nft --version
Linux 内核版本
需要内核版本 5.7 或更高。
uname -r
注意: 如果内核版本低于 5.7,插件将无法工作。请升级内核或参阅您的发行版文档。
请谨慎配置插件——Torrent Blocker、Ingress Filter 和 Egress Filter 插件将直接操作您服务器上的防火墙。
Remnawave Node 将为插件运行创建哪张表?
table ip remnanode {
counter processed {
packets 32 bytes 2060
}
counter ingress-filter-ip {
packets 0 bytes 0
}
counter torrent-blocker {
packets 0 bytes 0
}
counter egress-filter-ip {
packets 0 bytes 0
}
counter egress-filter-port {
packets 0 bytes 0
}
set ingress-filter-ip {
type ipv4_addr
flags timeout
counter
}
set torrent-blocker {
type ipv4_addr
flags timeout
counter
}
set egress-filter-ip {
type ipv4_addr
flags timeout
counter
}
set egress-filter-port {
type inet_proto . inet_service
flags timeout
counter
}
chain input {
type filter hook input priority filter - 10; policy accept;
counter name "processed"
ip saddr @ingress-filter-ip log prefix "ingress-filter-ip: " counter name "ingress-filter-ip" drop
ip saddr @torrent-blocker log prefix "torrent-blocker: " counter name "torrent-blocker" drop
}
chain forward {
type filter hook forward priority filter - 10; policy accept;
counter name "processed"
ip saddr @ingress-filter-ip log prefix "ingress-filter-ip: " counter name "ingress-filter-ip" drop
ip saddr @torrent-blocker log prefix "torrent-blocker: " counter name "torrent-blocker" drop
}
chain output {
type filter hook output priority filter - 10; policy accept;
ip daddr @egress-filter-ip counter name "egress-filter-ip" drop
meta l4proto . th dport @egress-filter-port counter name "egress-filter-port" drop
}
}
table ip6 remnanode6 {
counter processed {
packets 0 bytes 0
}
counter ingress-filter-ip6 {
packets 0 bytes 0
}
counter torrent-blocker6 {
packets 0 bytes 0
}
counter egress-filter-ip6 {
packets 0 bytes 0
}
counter egress-filter-port6 {
packets 0 bytes 0
}
set ingress-filter-ip6 {
type ipv6_addr
flags timeout
counter
}
set torrent-blocker6 {
type ipv6_addr
flags timeout
counter
}
set egress-filter-ip6 {
type ipv6_addr
flags timeout
counter
}
set egress-filter-port6 {
type inet_proto . inet_service
flags timeout
counter
}
chain input {
type filter hook input priority filter - 10; policy accept;
counter name "processed"
ip6 saddr @ingress-filter-ip6 log prefix "ingress-filter-ip: " counter name "ingress-filter-ip6" drop
ip6 saddr @torrent-blocker6 log prefix "torrent-blocker: " counter name "torrent-blocker6" drop
}
chain forward {
type filter hook forward priority filter - 10; policy accept;
counter name "processed"
ip6 saddr @ingress-filter-ip6 log prefix "ingress-filter-ip: " counter name "ingress-filter-ip6" drop
ip6 saddr @torrent-blocker6 log prefix "torrent-blocker: " counter name "torrent-blocker6" drop
}
chain output {
type filter hook output priority filter - 10; policy accept;
ip6 daddr @egress-filter-ip6 counter name "egress-filter-ip6" drop
meta l4proto . th dport @egress-filter-port6 counter name "egress-filter-port6" drop
}
}
CIDR 支持
CIDR 表示法(IPv4 和 IPv6)在以下插件中受支持:Ingress Filter、Egress Filter 和 Shared Lists。
在 Torrent Blocker(ignoreLists.ip)和 Connection Drop(whitelistIps)插件中,不支持 CIDR 表示法——请仅指定具体的 IP 地址。
有效的 CIDR 值示例:192.168.1.1、10.0.0.0/8、172.16.0.0/12、2001:db8::1、2001:db8::/32。
配置结构
{
"ingressFilter": {
"enabled": false,
"blockedIps": []
},
"egressFilter": {
"enabled": false,
"blockedIps": [],
"blockedPorts": []
},
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
"connectionDrop": {
"enabled": false,
"whitelistIps": []
},
"sharedLists": []
}
插件配置编辑器支持提示(将鼠标悬停在对象上可读取描述)以及自动补全。
Torrent Blocker
此插件的运行需要 Xray-Core 的最低版本——26.3.27。该内核版本默认随 Remnawave Node v2.7.0 一起提供。
为使 Torrent Blocker 正常工作,必须在您的 inbound 中开启包含必要协议的 destOverride 的 sniffing。如果未启用 sniffing,Xray-Core 将无法识别流量协议(包括 bittorrent),Torrent Blocker 的路由规则将不会触发。
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls",
"quic"
]
}
Torrent Blocker 是一个插件,用于封锁检测到 Torrent 流量的 IP 地址。
配置
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
| Field | Type | Description |
|---|---|---|
enabled | boolean | 启用或禁用插件,默认禁用 |
ignoreLists | object | 插件将忽略的 IP 地址和用户 ID 列表 |
blockDuration | number | 封锁时长(秒) |
includeRuleTags | array | 可选字段。来自您路由规则的 ruleTag 值数组,这些规则也将执行 IP 地址封锁。 |
{
"ip": [],
"userId": []
}
| Field | Type | Description |
|---|---|---|
ip | array | 插件将忽略的 IP 地址列表(不支持 CIDR)。可以使用 Shared Lists 配置中的列表。 |
userId | array | 插件将忽略的用户 ID 列表 |
includeRuleTags — 按附加路由规则封锁
默认情况下,Torrent Blocker 创建自己的路由规则,并将其作为 routing.rules 数组的第一个元素添加。该规则仅追踪 bittorrent 协议。
但是,如果您的 Xray-Core 配置中已有带标签(ruleTag)且与 Torrent 流量相关的自定义路由规则,您可以在 includeRuleTags 中指定它们。在这种情况下,Torrent Blocker 不仅会封锁由其自身规则检测到的 IP 地址,还会封锁由所有指定规则检测到的 IP 地址。
示例
假设您的 Xray-Core 配置包含以下路由规则:
{
"domain": [
"geosite:category-public-tracker"
],
"ruleTag": "TORRENT_BY_DOMAIN",
"outboundTag": "TORRENT"
},
{
"port": "6881-6889,51413,21413,17417,37305",
"ruleTag": "TORRENT_BY_PORT",
"outboundTag": "TORRENT"
}
第一条规则按公共 Torrent 跟踪器的域名封锁流量,第二条按 Torrent 客户端通常使用的端口封锁。
要让 Torrent Blocker 处理这些规则的触发并相应地封锁 IP 地址,请在 includeRuleTags 中指定它们的 ruleTag:
"torrentBlocker": {
"enabled": true,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600,
"includeRuleTags": ["TORRENT_BY_DOMAIN", "TORRENT_BY_PORT"]
}
因此,如果 Xray-Core 检测到属于 TORRENT_BY_DOMAIN 或 TORRENT_BY_PORT 规则的流量,Torrent Blocker 将像其 bittorrent 协议自身规则触发一样封锁源 IP 地址。
技术信息
该插件使用 Xray-Core 的新特性之一——webhook(PR:#5722)。因此,插件的运行需要 Xray-Core 26.3.27 或更高版本。
启用插件如何影响 Xray-Core 配置
如果此插件已启用,Remnawave Node 将自动将必要的更改应用到 Xray-Core 配置中。除启用插件外,您无需进行其他操作。
如上所述——这里仅描述 Xray-Core 配置中将发生的具体更改。不要手动添加这些更改,它们将自动应用。
{
"inbounds": [],
"outbounds": [
{
"tag": "DIRECT",
"protocol": "freedom"
},
{
"tag": "BLOCK",
"protocol": "blackhole"
},
{
"tag": "RW_TB_OUTBOUND_BLOCK",
"protocol": "blackhole"
}
],
"routing": {
"rules": [
{
"protocol": [
"bittorrent"
],
"outboundTag": "RW_TB_OUTBOUND_BLOCK",
"webhook": {
"url": "<REPLACED IN RUNTIME BY REMNAWAVE NODE>",
"deduplication": 5
}
}
]
}
}
该规则将始终放置在 rules 数组的开头,位于其他规则之前。outbound 将始终添加到 outbounds 数组的末尾。
工作原理
在 Xray-Core 框架内,不可能完全封锁 Torrent 流量。Xray-Core 只能追踪约 10-30% 的 Torrent 流量,因此"封锁"意味着在最初检测到至少一个数据包后——该数据包来源的 IP 地址将在配置中指定的时间内被封锁。
收到数据包后,Xray-Core 将向 Remnawave Node 处理的 webhook 发送其相关信息。收到后,Remnawave Node 立即封锁 IP 地址(在 nftables 中),并断开连接(相当于命令 ss -k、conntrack -D)。
工作原理逐步描述如下:
- Remnawave Node 将必要更改添加到 Xray-Core 配置中。
- 用户使用 Torrent。
- 其流量触发 Remnawave Node 添加到 Xray-Core 配置中的规则。
- Xray-Core 将数据包信息发送到
webhook。 - Remnawave Node 封锁 IP 地址并断开连接。
- 约 15-30 秒内,该信息将传送到 Remnawave Panel。
- Remnawave Panel 向管理员发送 Telegram 通知,并发送 webhook(
torrent_blocker.report,scope:torrent_blocker)。
需要注意的是,针对违规者的后续处理需要您自行实现。Remnawave Panel 为此提供了所有功能。从面板收到 webhook 后,如果您希望用户无法连接到所有服务器,可以将用户状态更改为 DISABLED。
webhook(torrent_blocker.report)中会收到什么
webhook 将包含已知的 node 和 user 对象的完整对象,以及包含所有可用信息的 report 对象。
{
"scope": "torrent_blocker",
"event": "torrent_blocker.report",
"timestamp": "2026-03-07T16:02:50.564Z",
"data": {
"node": {},
"user": {},
"report": {
"actionReport": {
"blocked": true,
"ip": "<omitted>",
"blockDuration": 60,
"willUnblockAt": "2026-03-07T16:03:48.986Z",
"userId": "2",
"processedAt": "2026-03-07T16:02:48.986Z"
},
"xrayReport": {
"email": "2",
"level": 0,
"protocol": "bittorrent",
"network": "tcp",
"source": "<omitted>:51431",
"destination": "<omitted>:59755",
"routeTarget": null,
"originalTarget": "tcp:<omitted>:59755",
"inboundTag": "VLESS_TCP_REALITY",
"inboundName": "vless",
"inboundLocal": "<omitted>:443",
"outboundTag": "RW_TB_OUTBOUND_BLOCK",
"ts": 1772899368
}
}
}
}
Ingress Filter
Ingress Filter 是一个永久封锁列表中 IP 地址的插件。Ingress Filter 过滤入站(ingress)流量。
配置
"ingressFilter": {
"blockedIps": [],
"enabled": false
}
| Field | Type | Description |
|---|---|---|
enabled | boolean | 启用或禁用插件,默认禁用 |
blockedIps | array | 将被插件封锁的 IP 地址或 CIDR 子网(IPv4/IPv6)列表。可以使用 Shared Lists 配置中的列表。示例:192.168.1.1、10.0.0.0/8、2001:db8::/32。 |
工作原理
列表中指定的 IP 地址将在 nftables 中被封锁。
Ingress Filter 是一个非常危险的工具。编制列表时请仔细谨慎。
Egress Filter
Egress Filter 是用于封锁出站流量的插件。可以禁止连接到目标端特定的 IP 地址或端口。 例如,可以封锁对内部服务(如 10.0.0.1、10.0.0.2)或外部服务(如 8.8.8.8、8.8.4.4)特定 IP 地址的访问,或关闭不需要的端口(如 25、465、587)。
配置
"egressFilter": {
"blockedIps": [],
"blockedPorts": [],
"enabled": false
}
| Field | Type | Description |
|---|---|---|
blockedIps | array | 将被插件封锁的 IP 地址或 CIDR 子网(IPv4/IPv6)列表。可以使用 Shared Lists 配置中的列表。示例:192.168.1.1、10.0.0.0/8、2001:db8::/32。 |
blockedPorts | array | 将被插件封锁的端口列表。 |
enabled | boolean | 启用或禁用插件,默认禁用 |
Connection Drop
Connection Drop 不是一个完整的插件,而是一个小型附加组件,用于将 IP 地址添加到 Connection Drop 功能的白名单中。
从 Remnawave Node v2.6.0 版本开始——并在启用 cap_add: NET_ADMIN 指令后——Remnawave Node 在从 Xray-Core 删除用户时会自动断开连接。在使用桥接的情况下,这可能导致桥接连接因该功能而中断。
从 Remnawave Node v2.7.0 版本开始——您可以为 Connection Drop 功能启用白名单。
Connection Drop 功能将始终运行,这里仅配置是否启用或禁用该功能的白名单。
配置
"connectionDrop": {
"enabled": false,
"whitelistIps": []
}
| Field | Type | Description |
|---|---|---|
enabled | boolean | 启用或禁用插件,默认禁用 |
whitelistIps | array | 将被添加到 Connection Drop 功能白名单的 IP 地址列表。 |
Shared Lists
Shared Lists 是可在其他插件中使用的 IP 地址列表。
配置
"sharedLists": [
{
"name": "ext:my-list",
"type": "ipList",
"items": ["127.0.0.1", "127.0.0.2", "10.0.0.0/8", "2001:db8::/32"]
}
]
| Field | Type | Description |
|---|---|---|
name | string | 列表名称,必须以 ext: 开头 |
type | string | 列表类型,必须为 ipList |
items | array | IP 地址或 CIDR 子网(IPv4/IPv6)列表。示例:127.0.0.1、10.0.0.0/8、2001:db8::/32。 |
在 Torrent Blocker 配置中的使用示例:
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": ["ext:my-list"]
},
"blockDuration": 3600
}
Executor
Executor 允许您发送命令执行:临时封锁 IP 地址、解封 IP 地址、重置 nftables 表。
运行时不需要启用插件,但 cap_add: NET_ADMIN 指令必须强制启用。
Block IPs
该命令用于临时封锁 IP 地址。您可以指定多个地址和封锁时长(秒)。0 表示直到 Remnawave Node 重启或绑定在此节点的插件配置发生更改为止。
请勿使用此命令永久封锁 IP 地址。请使用 Ingress Filter 插件来实现。
Unblock IPs
该命令用于解封 IP 地址。执行时将发送请求,从 nftables 表中删除 IP 地址。
Reset nftables
该命令用于重置 nftables 表。执行时将发送请求以重新创建 nftables 表。