# Node Plugins β

**URL:** https://f.docs.rw/t/topic/205
**Category:** Блог
**Created:** 2026-06-16T19:07:39Z
**Posts:** 1

## Post 1 by @remnawave — 2026-06-16T19:07:39Z

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

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

 ![image](https://f.docs.rw/uploads/default/original/1X/1fa6a9169a5adb4158bf73c6d0b7dcd26f9ce7cc.jpeg)

* * *

## **Требования**

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

```
services:
    remnanode:
        container_name: remnanode
        hostname: remnanode
        image: remnawave/node:latest
        network_mode: host
        restart: always
# success-start
        cap_add:
            - NET_ADMIN
# success-end
        ulimits:
            nofile:
                soft: 1048576
                hard: 1048576
        environment:
            - NODE_PORT=<NODE_PORT>
            - SECRET_KEY=<SECRET_KEY>
```

#### **nftables**

Убедитесь, что на хостовой машине доступен `nftables`. На большинстве современных дистрибутивов он уже установлен по умолчанию.

```
nft --version
```

#### **Linux-ядро**

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

```
uname -r
```

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

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

#### NFT-Таблица

> **Какую именно таблицу создаст 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`.

* * *

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

 ![image](https://f.docs.rw/uploads/default/original/1X/ae352193cc87876503675548914e2ea1e4f6954f.jpeg)

```
{
    "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 – **26.3.27**. Эта версия ядра идет по умолчанию с Remnawave Node **v2.7.0**.

> [!caution] Внимание  
> Для корректной работы **Torrent Blocker** в вашем **инбаунде** обязательно должен быть включен **sniffing** с `destOverride`, включающим необходимые протоколы. Без включенного снифинга Xray-Core не сможет определить протокол трафика (в том числе `bittorrent`), и правило маршрутизации **Torrent Blocker** не сработает.
> 
> ```
> "sniffing": {
> "enabled": true,
> "destOverride": [
> "http",
> "tls",
> "quic"
> ]
> }
> ```

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

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

```
"torrentBlocker": {
    "enabled": false,
    "ignoreLists": {
        "ip": [],
        "userId": []
    },
    "blockDuration": 3600
},
```

| **Field** | **Type** | **Description** |
| --- | --- | --- |
| `enabled` | boolean | Включает или выключает плагин, по умолчанию выключен |
| `ignoreLists` | object | Список IP-адресов и ID пользователей, которые будут игнорироваться плагином |
| `blockDuration` | number | Время блокировки в секундах |
| `includeRuleTags` | array | Необязательное поле. Массив значений `ruleTag` из ваших routing rules, по которым также будет выполняться блокировка IP-адресов. |

Структура `ignoreLists`:

```
{
    "ip": [],
    "userId": []
}
```

| **Field** | **Type** | **Description** |
| --- | --- | --- |
| `ip` | array | Список IP-адресов, которые будут игнорироваться плагином (CIDR не поддерживается). Можно использовать списки из конфигурации Shared Lists. |
| `userId` | array | Список ID пользователей, которые будут игнорироваться плагином |

> **includeRuleTags — блокировка по дополнительным правилам маршрутизации**
>
> По умолчанию Torrent Blocker создаёт собственное правило маршрутизации и добавляет его как **первый элемент** массива `routing.rules`. Это правило отслеживает только протокол `bittorrent`.
> 
> Однако, если в вашей конфигурации Xray-Core уже есть **собственные правила маршрутизации** с тегами (`ruleTag`), которые также связаны с торрент-трафиком, вы можете указать их в `includeRuleTags`. В этом случае Torrent Blocker будет блокировать 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 Blocker обрабатывал срабатывания этих правил и блокировал IP-адреса по ним, укажите их `ruleTag` в `includeRuleTags`:
> 
> ```
> "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 заблокирует IP-адрес источника точно так же, как если бы сработало его собственное правило по протоколу `bittorrent`.

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

Плагин использует одно из нововведений в Xray-Core – `webhook` (PR: [#5722](https://github.com/XTLS/Xray-core/pull/5722)). Поэтому для работы плагина необходима версия Xray-Core **26.3.27** или выше.

> **Как включение плагина влияет на конфигурацию Xray-Core**
>
> Если этот плагин включен, Remnawave Node автоматически применит необходимые изменения в конфигурацию Xray-Core, с вашей стороны кроме включения плагина ничего делать не требуется.
> 
> > [!warning] Внимание  
> > Как и написано выше – здесь описывается лишь то, что именно будет изменено в конфигурации Xray-Core. **Не добавляйте эти изменения вручную** , они будут применены автоматически.
> > 
> > ```
> > {
> > "inbounds": [],
> > "outbounds": [
> > {
> > "tag": "DIRECT",
> > "protocol": "freedom"
> > },
> > {
> > "tag": "BLOCK",
> > "protocol": "blackhole"
> > },
> > # success-start
> > {
> > "tag": "RW_TB_OUTBOUND_BLOCK",
> > "protocol": "blackhole"
> > }
> > # success-end
> > ],
> > "routing": {
> > "rules": [
> > # success-start
> > {
> > "protocol": [
> > "bittorrent"
> > ],
> > "outboundTag": "RW_TB_OUTBOUND_BLOCK",
> > "webhook": {
> > "url": "<REPLACED IN RUNTIME BY REMNAWAVE NODE>",
> > "deduplication": 5
> > }
> > }
> > # success-end
> > ]
> > }
> > }
> > ```
> > 
> > Правило всегда будет помещаться в начало массива `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
}
```

| **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`.

> [!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
}
```

| **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-адреса в whitelist для функционала Connection Drop.

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

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

> [!tldr] Заметка  
> Функции Connection Drop будут работать **всегда** , здесь настраивается только включение или выключение whitelist для этого функционала.

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

```
"connectionDrop": {
    "enabled": false,
    "whitelistIps": []
}
```

| **Field** | **Type** | **Description** |
| --- | --- | --- |
| `enabled` | boolean | Включает или выключает плагин, по умолчанию выключен |
| `whitelistIps` | array | Список 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"]
    }
]
```

| **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**

 ![image](https://f.docs.rw/uploads/default/original/1X/647fd0394e5da3e700aab35eefb54144d33f0234.jpeg)

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

> [!warning] Внимание  
> Для его работы **необязательно** иметь включенные плагины, однако директива `cap_add: NET_ADMIN` должна быть **обязательно** включена.

### **Block IPs**

 ![image](https://f.docs.rw/uploads/default/original/1X/1fde6d4fad0572bccc4d06169b4b1e17f16c2105.jpeg)

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

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

### **Unblock IPs**

 ![image](https://f.docs.rw/uploads/default/original/1X/1a514188f42399e3fb67b3812fac33ee0f0359b7.jpeg)

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

### **Reset nftables**

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

* * *
