Skip to main content

Node Plugins β

Плагины – это дополнительные модули, которые можно активировать на Remnawave Node для дополнительных функций: Torrent Blocker, Ingress Filter, Egress Filter, настройка Connection Drop.

warning

🚧 Эта страница находится в стадии разработки.

tip

Плагины для нод доступны начиная с версии Remnawave Panel & Remnawave Node v2.7.0.

Node Plugins

Требования

Для корректной работы плагинов в обязательном порядке требуется добавить директиву cap_add: NET_ADMIN в конфигурацию Remnawave Node.

docker-compose.yml
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. На большинстве современных дистрибутивов он уже установлен по умолчанию.

Проверка версии nftables
nft --version

Linux-ядро

Требуется версия ядра 5.7 или выше.

Проверка версии ядра
uname -r

Примечание: если версия ядра ниже 5.7, плагин работать не будет. Обновите ядро или обратитесь к документации вашего дистрибутива.

danger

Отнеситесь к настройке плагинов с осторожностью, плагины Torrent Blocker, Ingress Filter, Egress Filter будут работать напрямую с фаерволом на вашем сервере.

Какую именно таблицу создаст Remnawave Node для работы плагинов?
nftables
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

info

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.

Структура конфигурации

Node Plugins
Plugin configuration
{
"ingressFilter": {
"enabled": false,
"blockedIps": []
},
"egressFilter": {
"enabled": false,
"blockedIps": [],
"blockedPorts": []
},
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
"connectionDrop": {
"enabled": false,
"whitelistIps": []
},
"sharedLists": []
}
tip

Редактор конфигурации плагинов поддерживает подсказки (наведитесь на объект, чтобы прочитать описание), а так же автокомплит.

Torrent Blocker

danger

Для работы этого плагина необходима минимальная версия Xray-Core – ??.??.??. Эта версия ядра идет по умолчанию с Remnawave Node v2.7.0.

Torrent Blocker – это плагин, который блокирует IP-адрес, с которого был обнаружен Torrent-трафик.

Конфигурация

"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
FieldTypeDescription
enabledbooleanВключает или выключает плагин, по умолчанию выключен
ignoreListsobjectСписок IP-адресов и ID пользователей, которые будут игнорироваться плагином
blockDurationnumberВремя блокировки в секундах
ignoreLists
{
"ip": [],
"userId": []
}
FieldTypeDescription
iparrayСписок IP-адресов, которые будут игнорироваться плагином (CIDR не поддерживается). Можно использовать списки из конфигурации Shared Lists.
userIdarrayСписок ID пользователей, которые будут игнорироваться плагином

Техническая информация

Плагин использует одно из нововведений в Xray-Core – webhook (PR: #5722). Поэтому для работы плагина необходима версия Xray-Core ??.??.?? или выше.

Как включение плагина влияет на конфигурацию Xray-Core

Если этот плагин включен, Remnawave Node автоматически применит необходимые изменения в конфигурацию Xray-Core, с вашей стороны кроме включения плагина ничего делать не требуется.

warning

Как и написано выше – здесь описывается лишь то, что именно будет изменено в конфигурации 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": 30
}
}
]
}
}

Правило всегда будет помещаться в начало массива rules, перед остальными правилами. А outbound будет всегда добавляться в конец массива outbounds.

Принцип работы

В рамках Xray-Core невозможно полностью блокировать Torrent-трафик. Xray-Core способен отслеживать только ~10-30% torrent-трафика, поэтому под "блокировкой" имеется в виду то, что после изначального обнаружения хотя бы одного пакета – IP-адрес, с которого пришел этот пакет, будет заблокирован на время, указанное в конфигурации.

После получения пакета, Xray-Core отправит информацию о нем в webhook, который будет обрабатываться Remnawave Node. После его получения – Remnawave Node моментально блокирует IP-адрес (в nftables), а так же обрывает соединение (аналог команды ss -k, conntrack -D).

Итак, принцип работы по пунктам можно описать вот так:

  1. Remnawave Node добавляет необходимые изменения в конфигурацию Xray-Core.
  2. Пользователь использует торрент
  3. Его трафик попадает под правило, добавленное Remnawave Node в конфигурацию Xray-Core.
  4. Xray-Core отправляет информацию о пакете в webhook.
  5. Remnawave Node блокирует IP-адрес и обрывает соединение.
  6. В течении ~15-30 секунд эта информация будет передана в Remnawave Panel.
  7. Remnawave Panel отправит уведомление администратору в Telegram и так же отправит вебхук (torrent_blocker.report, scope: torrent_blocker).
info

Важно заметить, что дальнейшие действия относительно нарушителя вам необходимо реализовать самостоятельно. Remnawave Panel предоставляет все возможности для этого. После получения вебука от панели – вы можете перевести пользователя в статус DISABLED, если хотите чтобы пользователь не смог подключаться ко всем серверам.

Что придет в вебхуке (torrent_blocker.report)

Вебхук будет содержать полный объект уже знакомых нам объектов 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
}
FieldTypeDescription
enabledbooleanВключает или выключает плагин, по умолчанию выключен
blockedIpsarrayСписок IP-адресов или CIDR-подсетей (IPv4/IPv6), которые будут заблокированы плагином. Можно использовать списки из конфигурации Shared Lists. Примеры: 192.168.1.1, 10.0.0.0/8, 2001:db8::/32.

Принцип работы

IP-адреса, указанные в списке – будут заблокированы в nftables.

danger

Ingress Filter – это очень опасный инструмент. Будьте внимательны и осторожны при составлении списков.

Egress Filter

Egress Filter — плагин для блокировки исходящего трафика. Позволяет запретить подключения к определённым IP-адресам или портам на стороне назначения.
Например, можно заблокировать доступ к конкретным IP-адресам внутренних (например, 10.0.0.1, 10.0.0.2) или внешних сервисов (например, 8.8.8.8, 8.8.4.4) или закрыть нежелательные порты (например, 25, 465, 587).

Конфигурация

"egressFilter": {
"blockedIps": [],
"blockedPorts": [],
"enabled": false
}
FieldTypeDescription
blockedIpsarrayСписок IP-адресов или CIDR-подсетей (IPv4/IPv6), которые будут заблокированы плагином. Можно использовать списки из конфигурации Shared Lists. Примеры: 192.168.1.1, 10.0.0.0/8, 2001:db8::/32.
blockedPortsarrayСписок портов, которые будут заблокированы плагином.
enabledbooleanВключает или выключает плагин, по умолчанию выключен

Connection Drop

Connection Drop – это не полноценный плагин, а небольшая надстройка для того, чтобы была возможность добавлять IP-адреса в whitelist для функционала Connection Drop.

Начиная с версии Remnawave Node v2.6.0 – и при включении директивы cap_add: NET_ADMIN – Remnawave Node автоматически сбрасывает соединения при удалении пользователя из Xray-Core. В случае использования мостов – это могло привести к тому, что мостовое соединение могло быть разорвано в результате работы этой функции.

Начиная с версии Remnawave Node v2.7.0 – вы можете включить whitelist для функционала Connection Drop.

note

Функции Connection Drop будут работать всегда, здесь настраивается только включение или выключение whitelist для этого функционала.

Конфигурация

"connectionDrop": {
"enabled": false,
"whitelistIps": []
}
FieldTypeDescription
enabledbooleanВключает или выключает плагин, по умолчанию выключен
whitelistIpsarrayСписок IP-адресов, которые будут добавлены в whitelist для функционала Connection Drop.

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"]
}
]
FieldTypeDescription
namestringИмя списка, должно начинаться с ext:
typestringТип списка, должен быть ipList
itemsarrayСписок 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

Executor позволяет вам отправлять команды на выполнение: временная блокировка IP-адресов, снятие блокировки IP-адресов, сброс таблицы nftables.

warning

Для его работы необязательно иметь включенные плагины, однако директива cap_add: NET_ADMIN должна быть обязательно включена.

Block IPs

Node Plugins

Команда предназначена для временной блокировки IP-адресов. Вы можете указать несколько адресов и время блокировки в секундах. 0 – означает до момента перезапуска Remnawave Node или изменения конфигурации плагина, который привязан на этой ноде.

tip

Пожалуйста, не используйте эту команду для перманентной блокировки IP-адресов. Используйте плагин Ingress Filter для этого.

Unblock IPs

Node Plugins

Команда предназначена для снятия блокировки IP-адресов. При ее выполнении – будет отправлен запрос на снятие IP-адреса из таблицы nftables.

Reset nftables

Команда предназначена для сброса таблицы nftables. При ее выполнении – будет отправлен запрос на пересоздание таблицы nftables.