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

26 KiB
Raw Blame History

sidebar_position, title
sidebar_position title
99 Node Plugins β

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

:::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.7 или выше.

uname -r

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

:::danger

Отнеситесь к настройке плагинов с осторожностью, плагины 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

:::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.

:::

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

<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 26.3.27. Эта версия ядра идет по умолчанию с 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-адресов, которые будут игнорироваться плагином (CIDR не поддерживается). Можно использовать списки из конфигурации Shared Lists.
userId array Список ID пользователей, которые будут игнорироваться плагином

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

Плагин использует одно из нововведений в Xray-Core webhook (PR: #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"
        },
        // 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.

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

В рамках 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.

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

<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-адресов. Используйте плагин Ingress Filter для этого.

:::

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.