mirror of
https://github.com/remnawave/panel.git
synced 2026-04-04 03:21:22 +00:00
570 lines
26 KiB
Markdown
570 lines
26 KiB
Markdown
---
|
||
sidebar_position: 99
|
||
title: Node Plugins β
|
||
---
|
||
|
||
Плагины – это дополнительные модули, которые можно активировать на Remnawave Node для дополнительных функций: **Torrent Blocker**, **Ingress Filter**, **Egress Filter**, настройка **Connection Drop**.
|
||
|
||
<!-- truncate -->
|
||
|
||
:::tip
|
||
|
||
Плагины для нод доступны начиная с версии Remnawave Panel & Remnawave Node **v2.7.0**.
|
||
|
||
:::
|
||
|
||
<img src={require('/node-plugins/plugins-preview.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Node Plugins" />
|
||
|
||
## Требования {#requirements}
|
||
|
||
Для корректной работы плагинов в обязательном порядке требуется добавить директиву `cap_add: NET_ADMIN` в конфигурацию Remnawave Node.
|
||
|
||
```yaml title="docker-compose.yml"
|
||
services:
|
||
remnanode:
|
||
container_name: remnanode
|
||
hostname: remnanode
|
||
image: remnawave/node:latest
|
||
network_mode: host
|
||
restart: always
|
||
// highlight-next-line-green
|
||
cap_add:
|
||
// highlight-next-line-green
|
||
- NET_ADMIN
|
||
ulimits:
|
||
nofile:
|
||
soft: 1048576
|
||
hard: 1048576
|
||
environment:
|
||
- NODE_PORT=<NODE_PORT>
|
||
- SECRET_KEY=<SECRET_KEY>
|
||
```
|
||
|
||
#### nftables {#nftables}
|
||
|
||
Убедитесь, что на хостовой машине доступен `nftables`. На большинстве современных дистрибутивов он уже установлен по умолчанию.
|
||
|
||
```bash title="Проверка версии nftables"
|
||
nft --version
|
||
```
|
||
|
||
#### Linux-ядро {#linux-kernel-version}
|
||
|
||
Требуется версия ядра **5.7** или выше.
|
||
|
||
```bash title="Проверка версии ядра"
|
||
uname -r
|
||
```
|
||
|
||
> **Примечание:** если версия ядра ниже 5.7, плагин работать не будет. Обновите ядро или обратитесь к документации вашего дистрибутива.
|
||
|
||
:::danger
|
||
|
||
Отнеситесь к настройке плагинов с осторожностью, плагины Torrent Blocker, Ingress Filter, Egress Filter будут работать напрямую с фаерволом на вашем сервере.
|
||
|
||
:::
|
||
|
||
<details>
|
||
<summary>Какую именно таблицу создаст Remnawave Node для работы плагинов?</summary>
|
||
|
||
```nftables title="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
|
||
}
|
||
}
|
||
|
||
```
|
||
|
||
</details>
|
||
|
||
## Поддержка CIDR {#cidr-support}
|
||
|
||
:::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`.
|
||
|
||
:::
|
||
|
||
## Структура конфигурации {#configuration-structure}
|
||
|
||
<img src={require('/node-plugins/configuration.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Node Plugins" />
|
||
|
||
```json title="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 {#torrent-blocker}
|
||
|
||
:::danger
|
||
|
||
Для работы этого плагина необходима **минимальная** версия Xray-Core – **26.3.27**. Эта версия ядра идет по умолчанию с Remnawave Node **v2.7.0**.
|
||
|
||
:::
|
||
|
||
Torrent Blocker – это плагин, который блокирует IP-адрес, с которого был обнаружен Torrent-трафик.
|
||
|
||
### Конфигурация {#torrent-blocker-configuration}
|
||
|
||
```json
|
||
"torrentBlocker": {
|
||
"enabled": false,
|
||
"ignoreLists": {
|
||
"ip": [],
|
||
"userId": []
|
||
},
|
||
"blockDuration": 3600
|
||
},
|
||
```
|
||
|
||
| Field | Type | Description |
|
||
| --------------- | ------- | --------------------------------------------------------------------------- |
|
||
| `enabled` | boolean | Включает или выключает плагин, по умолчанию выключен |
|
||
| `ignoreLists` | object | Список IP-адресов и ID пользователей, которые будут игнорироваться плагином |
|
||
| `blockDuration` | number | Время блокировки в секундах |
|
||
|
||
```jsonc title="ignoreLists"
|
||
{
|
||
"ip": [],
|
||
"userId": []
|
||
}
|
||
```
|
||
|
||
| Field | Type | Description |
|
||
| -------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------ |
|
||
| `ip` | array | Список IP-адресов, которые будут игнорироваться плагином (CIDR не поддерживается). Можно использовать списки из конфигурации Shared Lists. |
|
||
| `userId` | array | Список ID пользователей, которые будут игнорироваться плагином |
|
||
|
||
### Техническая информация {#technical-information}
|
||
|
||
Плагин использует одно из нововведений в Xray-Core – `webhook` (PR: [#5722](https://github.com/XTLS/Xray-core/pull/5722)). Поэтому для работы плагина необходима версия Xray-Core **26.3.27** или выше.
|
||
|
||
<details>
|
||
<summary>Как включение плагина влияет на конфигурацию Xray-Core</summary>
|
||
|
||
Если этот плагин включен, Remnawave Node автоматически применит необходимые изменения в конфигурацию Xray-Core, с вашей стороны кроме включения плагина ничего делать не требуется.
|
||
|
||
:::warning
|
||
|
||
Как и написано выше – здесь описывается лишь то, что именно будет изменено в конфигурации Xray-Core. **Не добавляйте эти изменения вручную**, они будут применены автоматически.
|
||
|
||
:::
|
||
|
||
```json
|
||
{
|
||
"inbounds": [],
|
||
"outbounds": [
|
||
{
|
||
"tag": "DIRECT",
|
||
"protocol": "freedom"
|
||
},
|
||
{
|
||
"tag": "BLOCK",
|
||
"protocol": "blackhole"
|
||
},
|
||
// highlight-next-line-green
|
||
{
|
||
// highlight-next-line-green
|
||
"tag": "RW_TB_OUTBOUND_BLOCK",
|
||
// highlight-next-line-green
|
||
"protocol": "blackhole"
|
||
// highlight-next-line-green
|
||
}
|
||
],
|
||
"routing": {
|
||
"rules": [
|
||
// highlight-next-line-green
|
||
{
|
||
// highlight-next-line-green
|
||
"protocol": [
|
||
// highlight-next-line-green
|
||
"bittorrent"
|
||
// highlight-next-line-green
|
||
],
|
||
// highlight-next-line-green
|
||
"outboundTag": "RW_TB_OUTBOUND_BLOCK",
|
||
// highlight-next-line-green
|
||
"webhook": {
|
||
// highlight-next-line-green
|
||
"url": "<REPLACED IN RUNTIME BY REMNAWAVE NODE>",
|
||
// highlight-next-line-green
|
||
"deduplication": 5
|
||
// highlight-next-line-green
|
||
}
|
||
}
|
||
]
|
||
}
|
||
}
|
||
```
|
||
|
||
Правило всегда будет помещаться в начало массива `rules`, перед остальными правилами. А `outbound` будет всегда добавляться в конец массива `outbounds`.
|
||
|
||
</details>
|
||
|
||
### Принцип работы {#principle-of-operation}
|
||
|
||
В рамках 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`, если хотите чтобы пользователь не смог подключаться ко всем серверам.
|
||
|
||
:::
|
||
|
||
<details>
|
||
<summary>Что придет в вебхуке (`torrent_blocker.report`)</summary>
|
||
|
||
Вебхук будет содержать полный объект уже знакомых нам объектов `node` и `user`, а так же объект `report`, который содержит всю доступную информацию.
|
||
|
||
```json
|
||
{
|
||
"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
|
||
}
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
</details>
|
||
|
||
## Ingress Filter {#ingress-filter}
|
||
|
||
Ingress Filter – это плагин, который перманентно блокирует IP-адрес, который находится в списке. **Ingress Filter фильтрует входящий (ingress) трафик**.
|
||
|
||
### Конфигурация {#ingress-filter-configuration}
|
||
|
||
```json
|
||
"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`. |
|
||
|
||
### Принцип работы {#ingress-filter-about}
|
||
|
||
IP-адреса, указанные в списке – будут заблокированы в `nftables`.
|
||
|
||
:::danger
|
||
|
||
Ingress Filter – это очень опасный инструмент. Будьте внимательны и осторожны при составлении списков.
|
||
|
||
:::
|
||
|
||
## Egress 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)_.
|
||
|
||
### Конфигурация {#egress-filter-configuration}
|
||
|
||
```json
|
||
"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}
|
||
|
||
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 для этого функционала.
|
||
|
||
:::
|
||
|
||
### Конфигурация {#connection-drop-configuration}
|
||
|
||
```json
|
||
"connectionDrop": {
|
||
"enabled": false,
|
||
"whitelistIps": []
|
||
}
|
||
```
|
||
|
||
| Field | Type | Description |
|
||
| -------------- | ------- | --------------------------------------------------------------------------------------- |
|
||
| `enabled` | boolean | Включает или выключает плагин, по умолчанию выключен |
|
||
| `whitelistIps` | array | Список IP-адресов, которые будут добавлены в whitelist для функционала Connection Drop. |
|
||
|
||
## Shared Lists {#shared-lists}
|
||
|
||
Shared Lists – это список IP-адресов, которые могут быть использованы в других плагинах.
|
||
|
||
### Конфигурация {#shared-lists-configuration}
|
||
|
||
```json
|
||
"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:
|
||
|
||
```json
|
||
"torrentBlocker": {
|
||
"enabled": false,
|
||
"ignoreLists": {
|
||
"ip": ["ext:my-list"]
|
||
},
|
||
"blockDuration": 3600
|
||
}
|
||
```
|
||
|
||
## Executor {#executor}
|
||
|
||
<img src={require('/node-plugins/executor.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Executor" />
|
||
|
||
**Executor** позволяет вам отправлять команды на выполнение: временная блокировка IP-адресов, снятие блокировки IP-адресов, сброс таблицы `nftables`.
|
||
|
||
:::warning
|
||
Для его работы **необязательно** иметь включенные плагины, однако директива `cap_add: NET_ADMIN` должна быть **обязательно** включена.
|
||
:::
|
||
|
||
### Block IPs {#block-ips}
|
||
|
||
<img src={require('/node-plugins/executor-ip-block.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Node Plugins" />
|
||
|
||
Команда предназначена для **временной блокировки IP-адресов**. Вы можете указать несколько адресов и время блокировки в секундах. 0 – означает до момента перезапуска Remnawave Node или изменения конфигурации плагина, который привязан на этой ноде.
|
||
|
||
:::tip
|
||
|
||
Пожалуйста, не используйте эту команду для перманентной блокировки IP-адресов. Используйте плагин **Ingress Filter** для этого.
|
||
|
||
:::
|
||
|
||
### Unblock IPs {#unblock-ips}
|
||
|
||
<img src={require('/node-plugins/executor-ip-unblock.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Node Plugins" />
|
||
|
||
Команда предназначена для **снятия блокировки IP-адресов**. При ее выполнении – будет отправлен запрос на снятие IP-адреса из таблицы `nftables`.
|
||
|
||
### Reset nftables {#reset-nftables}
|
||
|
||
Команда предназначена для **сброса таблицы `nftables`**. При ее выполнении – будет отправлен запрос на пересоздание таблицы `nftables`.
|