Files
panel/docs/learn/node-plugins.md

24 KiB
Raw Blame History

sidebar_position, title
sidebar_position title
99 Node Plugins β

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

:::warning

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

:::

:::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" />

Требования

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

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

nft --version

Linux-ядро

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

uname -r

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

:::danger

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

:::

Какую именно таблицу создаст Remnawave Node для работы плагинов?
table ip remnanode {
        counter processed {
                packets 53172 bytes 7154272
        }

        counter blacklist {
                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 blacklist {
                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 @blacklist log prefix "blacklist: " counter name "blacklist" 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 @blacklist log prefix "blacklist: " counter name "blacklist" 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 blacklist6 {
                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 blacklist6 {
                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 @blacklist6 log prefix "blacklist: " counter name "blacklist6" 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 @blacklist6 log prefix "blacklist: " counter name "blacklist6" 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
        }
}

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

<img src={require('/node-plugins/configuration.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Node Plugins" />

{
    "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
},
Field Type Description
enabled boolean Включает или выключает плагин, по умолчанию выключен
ignoreLists object Список IP-адресов и ID пользователей, которые будут игнорироваться плагином
blockDuration number Время блокировки в секундах
{
    "ip": [],
    "userId": []
}
Field Type Description
ip array Список IP-адресов, которые будут игнорироваться плагином. Можно использовать списки из конфигурации Shared Lists.
userId array Список 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"
        },
        // 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": 30
                    // highlight-next-line-green
                }
            }
        ]
    }
}

Правило всегда будет помещаться в начало массива 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-адресов, которые будут заблокированы плагином. Можно использовать списки из конфигурации Shared Lists.

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

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-адресов, которые будут заблокированы плагином. Можно использовать списки из конфигурации Shared Lists.
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.

:::note

Функции 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"]
    }
]
Field Type Description
name string Имя списка, должно начинаться с ext:
type string Тип списка, должен быть ipList
items array Список IP-адресов

Пример использования в конфигурации Torrent Blocker:

"torrentBlocker": {
    "enabled": false,
    "ignoreLists": {
        "ip": ["ext:my-list"]
    },
    "blockDuration": 3600
}

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

<img src={require('/node-plugins/executor-ip-block.webp').default} width="100%" style={{borderRadius: '8px'}} alt="Node Plugins" />

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

:::tip

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

:::

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

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