Node Plugins β
Les plugins sont des modules supplémentaires qui peuvent être activés sur Remnawave Node pour des fonctionnalités additionnelles : Torrent Blocker, Ingress Filter, Egress Filter et la configuration de Connection Drop.
Les plugins pour nœuds sont disponibles à partir de la version Remnawave Panel & Remnawave Node v2.7.0.
Prérequis
Pour le bon fonctionnement des plugins, il est obligatoire d'ajouter la directive cap_add: NET_ADMIN à la configuration de Remnawave Node.
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
Assurez-vous que nftables est disponible sur la machine hôte. Sur la plupart des distributions modernes, il est déjà installé par défaut.
nft --version
Version du noyau Linux
La version du noyau 5.7 ou supérieure est requise.
uname -r
Remarque : Si la version du noyau est inférieure à 5.7, le plugin ne fonctionnera pas. Mettez à jour le noyau ou consultez la documentation de votre distribution.
Soyez prudent lors de la configuration des plugins — les plugins Torrent Blocker, Ingress Filter et Egress Filter fonctionneront directement avec le pare-feu de votre serveur.
Quelle table exactement Remnawave Node créera-t-il pour le fonctionnement des plugins ?
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
}
}
Support CIDR
La notation CIDR (IPv4 et IPv6) est prise en charge dans les plugins suivants : Ingress Filter, Egress Filter et Shared Lists.
Dans les plugins Torrent Blocker (ignoreLists.ip) et Connection Drop (whitelistIps), la notation CIDR n'est pas prise en charge — spécifiez uniquement des adresses IP concrètes.
Exemples de valeurs CIDR valides : 192.168.1.1, 10.0.0.0/8, 172.16.0.0/12, 2001:db8::1, 2001:db8::/32.
Structure de configuration
{
"ingressFilter": {
"enabled": false,
"blockedIps": []
},
"egressFilter": {
"enabled": false,
"blockedIps": [],
"blockedPorts": []
},
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
"connectionDrop": {
"enabled": false,
"whitelistIps": []
},
"sharedLists": []
}
L'éditeur de configuration des plugins prend en charge les infobulles (survolez un objet pour lire sa description) ainsi que l'autocomplétion.
Torrent Blocker
Pour le fonctionnement de ce plugin, la version minimale de Xray-Core – 26.3.27 – est requise. Cette version du noyau est fournie par défaut avec Remnawave Node v2.7.0.
Pour que Torrent Blocker fonctionne correctement, le sniffing avec destOverride incluant les protocoles nécessaires doit obligatoirement être activé dans votre inbound. Sans sniffing activé, Xray-Core ne pourra pas déterminer le protocole du trafic (y compris bittorrent), et la règle de routage de Torrent Blocker ne se déclenchera pas.
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls",
"quic"
]
}
Torrent Blocker est un plugin qui bloque l'adresse IP depuis laquelle du trafic Torrent a été détecté.
Configuration
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
| Field | Type | Description |
|---|---|---|
enabled | boolean | Active ou désactive le plugin, désactivé par défaut |
ignoreLists | object | Liste des adresses IP et des IDs d'utilisateurs qui seront ignorés par le plugin |
blockDuration | number | Durée du blocage en secondes |
includeRuleTags | array | Champ optionnel. Tableau de valeurs ruleTag de vos règles de routage, selon lesquelles les IPs seront également bloquées. |
{
"ip": [],
"userId": []
}
| Field | Type | Description |
|---|---|---|
ip | array | Liste des adresses IP qui seront ignorées par le plugin (CIDR non pris en charge). Les listes de la configuration Shared Lists peuvent être utilisées. |
userId | array | Liste des IDs d'utilisateurs qui seront ignorés par le plugin |
includeRuleTags — blocage selon des règles de routage supplémentaires
Par défaut, Torrent Blocker crée sa propre règle de routage et l'ajoute comme premier élément du tableau routing.rules. Cette règle ne surveille que le protocole bittorrent.
Cependant, si votre configuration Xray-Core contient déjà des règles de routage personnalisées avec des tags (ruleTag) également liés au trafic torrent, vous pouvez les spécifier dans includeRuleTags. Dans ce cas, Torrent Blocker bloquera les adresses IP détectées non seulement par sa propre règle, mais aussi par toutes les règles spécifiées.
Exemple
Supposons que votre configuration Xray-Core contienne les règles de routage suivantes :
{
"domain": [
"geosite:category-public-tracker"
],
"ruleTag": "TORRENT_BY_DOMAIN",
"outboundTag": "TORRENT"
},
{
"port": "6881-6889,51413,21413,17417,37305",
"ruleTag": "TORRENT_BY_PORT",
"outboundTag": "TORRENT"
}
La première règle bloque le trafic par les domaines des trackers torrents publics, la seconde par les ports généralement utilisés par les clients torrents.
Pour que Torrent Blocker traite le déclenchement de ces règles et bloque les IPs selon elles, spécifiez leur ruleTag dans includeRuleTags :
"torrentBlocker": {
"enabled": true,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600,
"includeRuleTags": ["TORRENT_BY_DOMAIN", "TORRENT_BY_PORT"]
}
En conséquence, si Xray-Core détecte du trafic relevant des règles TORRENT_BY_DOMAIN ou TORRENT_BY_PORT, Torrent Blocker bloquera l'adresse IP source exactement comme si sa propre règle pour le protocole bittorrent s'était déclenchée.
Informations techniques
Le plugin utilise l'une des nouveautés de Xray-Core – webhook (PR : #5722). C'est pourquoi la version de Xray-Core 26.3.27 ou supérieure est requise pour le fonctionnement du plugin.
Comment l'activation du plugin affecte la configuration Xray-Core
Si ce plugin est activé, Remnawave Node appliquera automatiquement les modifications nécessaires à la configuration Xray-Core. Vous n'avez rien d'autre à faire qu'activer le plugin.
Comme écrit ci-dessus – cela décrit uniquement ce qui sera modifié dans la configuration Xray-Core. N'ajoutez pas ces modifications manuellement, elles seront appliquées automatiquement.
{
"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": 5
}
}
]
}
}
La règle sera toujours placée au début du tableau rules, avant les autres règles. Et outbound sera toujours ajouté à la fin du tableau outbounds.
Principe de fonctionnement
Dans le cadre de Xray-Core, il est impossible de bloquer complètement le trafic Torrent. Xray-Core ne peut surveiller que ~10-30% du trafic torrent, donc par « blocage », on entend qu'après la détection initiale d'au moins un paquet – l'adresse IP d'où ce paquet provient sera bloquée pendant la durée spécifiée dans la configuration.
Après réception du paquet, Xray-Core enverra des informations le concernant au webhook, qui sera traité par Remnawave Node. Après réception, Remnawave Node bloque instantanément l'adresse IP (dans nftables) et interrompt également la connexion (analogue à la commande ss -k, conntrack -D).
Le principe de fonctionnement peut être décrit point par point ainsi :
- Remnawave Node ajoute les modifications nécessaires à la configuration Xray-Core.
- L'utilisateur utilise des torrents.
- Son trafic tombe sous la règle ajoutée par Remnawave Node à la configuration Xray-Core.
- Xray-Core envoie les informations du paquet au
webhook. - Remnawave Node bloque l'adresse IP et interrompt la connexion.
- Dans ~15-30 secondes, ces informations seront transmises à Remnawave Panel.
- Remnawave Panel enverra une notification à l'administrateur sur Telegram et enverra également un webhook (
torrent_blocker.report, scope :torrent_blocker).
Il est important de noter que les actions ultérieures concernant le contrevenant doivent être mises en œuvre par vous-même. Remnawave Panel offre toutes les possibilités pour cela. Après réception du webhook du panel, vous pouvez changer le statut de l'utilisateur en DISABLED si vous souhaitez qu'il ne puisse pas se connecter à tous les serveurs.
Ce qui arrivera dans le webhook (torrent_blocker.report)
Le webhook contiendra l'objet complet des objets déjà connus node et user, ainsi qu'un objet report contenant toutes les informations disponibles.
{
"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 est un plugin qui bloque de façon permanente l'adresse IP figurant dans la liste. Ingress Filter filtre le trafic entrant (ingress).
Configuration
"ingressFilter": {
"blockedIps": [],
"enabled": false
}
| Field | Type | Description |
|---|---|---|
enabled | boolean | Active ou désactive le plugin, désactivé par défaut |
blockedIps | array | Liste des adresses IP ou sous-réseaux CIDR (IPv4/IPv6) qui seront bloqués par le plugin. Les listes de la configuration Shared Lists peuvent être utilisées. Exemples : 192.168.1.1, 10.0.0.0/8, 2001:db8::/32. |
Principe de fonctionnement
Les adresses IP spécifiées dans la liste seront bloquées dans nftables.
Ingress Filter est un outil très dangereux. Soyez attentif et prudent lors de la compilation des listes.
Egress Filter
Egress Filter est un plugin pour bloquer le trafic sortant. Il permet d'interdire les connexions à certaines adresses IP ou ports côté destination. Par exemple, il est possible de bloquer l'accès à des adresses IP spécifiques de services internes (par exemple, 10.0.0.1, 10.0.0.2) ou externes (par exemple, 8.8.8.8, 8.8.4.4) ou de fermer des ports indésirables (par exemple, 25, 465, 587).
Configuration
"egressFilter": {
"blockedIps": [],
"blockedPorts": [],
"enabled": false
}
| Field | Type | Description |
|---|---|---|
blockedIps | array | Liste des adresses IP ou sous-réseaux CIDR (IPv4/IPv6) qui seront bloqués par le plugin. Les listes de la configuration Shared Lists peuvent être utilisées. Exemples : 192.168.1.1, 10.0.0.0/8, 2001:db8::/32. |
blockedPorts | array | Liste des ports qui seront bloqués par le plugin. |
enabled | boolean | Active ou désactive le plugin, désactivé par défaut |
Connection Drop
Connection Drop n'est pas un plugin complet, mais un petit complément permettant d'ajouter des adresses IP à la liste blanche pour la fonctionnalité Connection Drop.
À partir de la version Remnawave Node v2.6.0 – et lors de l'activation de la directive cap_add: NET_ADMIN – Remnawave Node interrompt automatiquement les connexions lors de la suppression d'un utilisateur de Xray-Core. En cas d'utilisation de ponts, cela pouvait entraîner l'interruption de la connexion de pont par cette fonction.
À partir de la version Remnawave Node v2.7.0 – vous pouvez activer la liste blanche pour la fonctionnalité Connection Drop.
Les fonctions Connection Drop fonctionneront toujours. Ici, seule l'activation ou la désactivation de la liste blanche pour cette fonctionnalité est configurée.
Configuration
"connectionDrop": {
"enabled": false,
"whitelistIps": []
}
| Field | Type | Description |
|---|---|---|
enabled | boolean | Active ou désactive le plugin, désactivé par défaut |
whitelistIps | array | Liste des adresses IP qui seront ajoutées à la liste blanche pour la fonctionnalité Connection Drop. |
Shared Lists
Shared Lists est une liste d'adresses IP pouvant être utilisée dans d'autres plugins.
Configuration
"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 | Nom de la liste, doit commencer par ext: |
type | string | Type de liste, doit être ipList |
items | array | Liste des adresses IP ou sous-réseaux CIDR (IPv4/IPv6). Exemples : 127.0.0.1, 10.0.0.0/8, 2001:db8::/32. |
Exemple d'utilisation dans la configuration de Torrent Blocker :
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": ["ext:my-list"]
},
"blockDuration": 3600
}
Executor
Executor vous permet d'envoyer des commandes à exécuter : blocage temporaire d'adresses IP, déblocage d'adresses IP, réinitialisation de la table nftables.
Pour son fonctionnement, il n'est pas obligatoire d'avoir des plugins activés, cependant la directive cap_add: NET_ADMIN doit être obligatoirement activée.
Block IPs
La commande est destinée au blocage temporaire d'adresses IP. Vous pouvez spécifier plusieurs adresses et la durée du blocage en secondes. 0 – signifie jusqu'au redémarrage de Remnawave Node ou à la modification de la configuration du plugin lié à ce nœud.
Veuillez ne pas utiliser cette commande pour le blocage permanent d'adresses IP. Utilisez le plugin Ingress Filter pour cela.
Unblock IPs
La commande est destinée au déblocage d'adresses IP. Lors de son exécution, une demande sera envoyée pour supprimer l'adresse IP de la table nftables.
Reset nftables
La commande est destinée à la réinitialisation de la table nftables. Lors de son exécution, une demande sera envoyée pour recréer la table nftables.