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 表。