إنتقل إلى المحتوى الرئيسي

Node Plugins β

الإضافات هي وحدات إضافية يمكن تفعيلها على Remnawave Node للحصول على وظائف إضافية: Torrent Blocker، وIngress Filter، وEgress Filter، وإعداد Connection Drop.

تلميح

إضافات العقد متاحة اعتباراً من الإصدار Remnawave Panel & Remnawave Node v2.7.0.

Node Plugins

المتطلبات

لكي تعمل الإضافات بشكل صحيح، يجب إضافة التوجيه cap_add: NET_ADMIN إلى إعدادات Remnawave Node بشكل إلزامي.

docker-compose.yml
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

تأكد من توفر nftables على الجهاز المضيف. في معظم التوزيعات الحديثة يكون مثبتاً بشكل افتراضي.

التحقق من إصدار nftables
nft --version

إصدار نواة Linux

يلزم إصدار نواة 5.7 أو أعلى.

التحقق من إصدار النواة
uname -r

ملاحظة: إذا كان إصدار النواة أقل من 5.7، فلن تعمل الإضافة. قم بتحديث النواة أو راجع وثائق توزيعتك.

خطر

تعامل مع إعداد الإضافات بحذر، فإضافات Torrent Blocker وIngress Filter وEgress Filter ستعمل مباشرةً مع جدار الحماية على خادمك.

ما الجدول الذي سينشئه Remnawave Node لتشغيل الإضافات؟
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
}
}

دعم 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.

بنية الإعداد

Node Plugins
Plugin configuration
{
"ingressFilter": {
"enabled": false,
"blockedIps": []
},
"egressFilter": {
"enabled": false,
"blockedIps": [],
"blockedPorts": []
},
"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
"connectionDrop": {
"enabled": false,
"whitelistIps": []
},
"sharedLists": []
}
تلميح

يدعم محرر إعداد الإضافات التلميحات (مرّر المؤشر فوق الكائن لقراءة الوصف) فضلاً عن الإكمال التلقائي.

Torrent Blocker

خطر

يتطلب عمل هذه الإضافة الحد الأدنى من إصدار Xray-Core – 26.3.27. يأتي هذا الإصدار من النواة افتراضياً مع Remnawave Node v2.7.0.

warning

لكي يعمل Torrent Blocker بشكل صحيح، يجب أن يكون sniffing مع destOverride الذي يشمل البروتوكولات اللازمة مفعّلاً في inbound الخاص بك بشكل إلزامي. بدون تفعيل الـsniffing، لن يتمكن Xray-Core من تحديد بروتوكول حركة المرور (بما في ذلك bittorrent)، ولن تُطبَّق قاعدة التوجيه الخاصة بـTorrent Blocker.

"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls",
"quic"
]
}

Torrent Blocker هو إضافة تحجب عنوان IP الذي اكتُشف منه حركة مرور التورنت.

الإعداد

"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
FieldTypeDescription
enabledbooleanتُفعّل الإضافة أو تُوقفها، معطّلة افتراضياً
ignoreListsobjectقائمة عناوين IP ومعرّفات المستخدمين التي ستُتجاهل من قِبَل الإضافة
blockDurationnumberمدة الحجب بالثواني
includeRuleTagsarrayحقل اختياري. مصفوفة من قيم ruleTag من قواعد التوجيه الخاصة بك، وفقها سيُنفَّذ حجب عناوين IP أيضاً.
ignoreLists
{
"ip": [],
"userId": []
}
FieldTypeDescription
iparrayقائمة عناوين IP التي ستُتجاهل من قِبَل الإضافة (CIDR غير مدعوم). يمكن استخدام القوائم من إعداد Shared Lists.
userIdarrayقائمة معرّفات المستخدمين التي ستُتجاهل من قِبَل الإضافة
includeRuleTags — الحجب وفق قواعد التوجيه الإضافية

يُنشئ Torrent Blocker افتراضياً قاعدة توجيه خاصة به ويضيفها كـالعنصر الأول في مصفوفة routing.rules. تتتبع هذه القاعدة بروتوكول bittorrent فقط.

أما إذا كانت في إعداد Xray-Core الخاص بك قواعد توجيه مخصصة بعلامات (ruleTag) مرتبطة أيضاً بحركة مرور التورنت، يمكنك تحديدها في includeRuleTags. في هذه الحالة سيحجب Torrent Blocker عناوين IP المكتشفة ليس فقط عبر قاعدته، بل عبر جميع القواعد المحددة أيضاً.

مثال

لنفترض أن إعداد Xray-Core الخاص بك يحتوي على قواعد التوجيه التالية:

قواعد التوجيه المخصصة في 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:

إعداد Torrent Blocker مع 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). لذلك يلزم لعمل الإضافة إصدار Xray-Core 26.3.27 أو أعلى.

كيف يؤثر تفعيل الإضافة على إعداد Xray-Core

إذا كانت هذه الإضافة مفعّلة، فسيطبّق Remnawave Node التغييرات اللازمة على إعداد Xray-Core تلقائياً، ولا يُطلب منك سوى تفعيل الإضافة.

warning

كما هو مذكور أعلاه – يصف هذا ما الذي سيتغير تحديداً في إعداد Xray-Core. لا تضف هذه التغييرات يدوياً، فستُطبَّق تلقائياً.

{
"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
}
}
]
}
}

ستُوضع القاعدة دائماً في بداية مصفوفة rules قبل بقية القواعد، وسيُضاف outbound دائماً في نهاية مصفوفة outbounds.

مبدأ العمل

في إطار Xray-Core يستحيل حجب حركة مرور التورنت بشكل كامل. يستطيع Xray-Core تتبع 10-30% فقط من حركة مرور التورنت، لذا يعني "الحجب" هنا أنه بعد الاكتشاف المبدئي لحزمة واحدة على الأقل – سيُحجب عنوان 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 وكذلك تُرسل webhook (torrent_blocker.report، النطاق: torrent_blocker).
معلومات

من المهم ملاحظة أن الإجراءات التالية تجاه المخالف يتعين عليك تنفيذها بنفسك. توفر Remnawave Panel جميع الإمكانيات لذلك. بعد استقبال الـwebhook من اللوحة – يمكنك تغيير حالة المستخدم إلى DISABLED إذا أردت منعه من الاتصال بجميع الخوادم.

ما الذي سيرد في الـwebhook (torrent_blocker.report)

سيحتوي الـwebhook على الكائن الكامل للكائنين المعروفَين 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
}
FieldTypeDescription
enabledbooleanتُفعّل الإضافة أو تُوقفها، معطّلة افتراضياً
blockedIpsarrayقائمة عناوين IP أو شبكات CIDR الفرعية (IPv4/IPv6) التي ستُحجب بواسطة الإضافة. يمكن استخدام القوائم من إعداد Shared Lists. أمثلة: 192.168.1.1، 10.0.0.0/8، 2001:db8::/32.

مبدأ العمل

ستُحجب عناوين IP المحددة في القائمة في nftables.

خطر

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
}
FieldTypeDescription
blockedIpsarrayقائمة عناوين IP أو شبكات CIDR الفرعية (IPv4/IPv6) التي ستُحجب بواسطة الإضافة. يمكن استخدام القوائم من إعداد Shared Lists. أمثلة: 192.168.1.1، 10.0.0.0/8، 2001:db8::/32.
blockedPortsarrayقائمة المنافذ التي ستُحجب بواسطة الإضافة.
enabledbooleanتُفعّل الإضافة أو تُوقفها، معطّلة افتراضياً

Connection Drop

Connection Drop ليست إضافة كاملة، بل إضافة صغيرة تتيح إمكانية إضافة عناوين IP إلى القائمة البيضاء لوظيفة Connection Drop.

اعتباراً من الإصدار Remnawave Node v2.6.0 – وعند تفعيل التوجيه cap_add: NET_ADMIN – يقوم Remnawave Node تلقائياً بإسقاط الاتصالات عند إزالة مستخدم من Xray-Core. في حالة استخدام الجسور، كان يمكن أن يؤدي هذا إلى انقطاع الاتصال الجسري نتيجة عمل هذه الوظيفة.

اعتباراً من الإصدار Remnawave Node v2.7.0 – يمكنك تفعيل القائمة البيضاء لوظيفة Connection Drop.

ملاحظة

ستعمل وظائف Connection Drop دائماً، وهنا يُضبط فقط تفعيل أو تعطيل القائمة البيضاء لهذه الوظيفة.

الإعداد

"connectionDrop": {
"enabled": false,
"whitelistIps": []
}
FieldTypeDescription
enabledbooleanتُفعّل الإضافة أو تُوقفها، معطّلة افتراضياً
whitelistIpsarrayقائمة عناوين IP التي ستُضاف إلى القائمة البيضاء لوظيفة 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"]
}
]
FieldTypeDescription
namestringاسم القائمة، يجب أن يبدأ بـext:
typestringنوع القائمة، يجب أن يكون ipList
itemsarrayقائمة عناوين 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

Executor

يتيح Executor إرسال أوامر للتنفيذ: الحجب المؤقت لعناوين IP، ورفع الحجب عن عناوين IP، وإعادة تعيين جدول nftables.

warning

لكي يعمل ليس بالضرورة أن تكون الإضافات مفعّلة، لكن يجب أن يكون التوجيه cap_add: NET_ADMIN مفعّلاً إلزامياً.

Block IPs

Node Plugins

الأمر مخصص لـالحجب المؤقت لعناوين IP. يمكنك تحديد عدة عناوين ومدة الحجب بالثواني. 0 – يعني حتى إعادة تشغيل Remnawave Node أو تغيير إعداد الإضافة المرتبطة بهذه العقدة.

تلميح

يُرجى عدم استخدام هذا الأمر للحجب الدائم لعناوين IP. استخدم إضافة Ingress Filter لهذا الغرض.

Unblock IPs

Node Plugins

الأمر مخصص لـرفع الحجب عن عناوين IP. عند تنفيذه – سيُرسَل طلب لإزالة عنوان IP من جدول nftables.

Reset nftables

الأمر مخصص لـإعادة تعيين جدول nftables. عند تنفيذه – سيُرسَل طلب لإعادة إنشاء جدول nftables.