본문으로 건너뛰기

Node Plugins β

플러그인은 추가 기능을 위해 Remnawave Node에서 활성화할 수 있는 추가 모듈입니다: Torrent Blocker, Ingress Filter, Egress Filter, Connection Drop 설정.

노드 플러그인은 Remnawave Panel & Remnawave Node v2.7.0 버전부터 사용 가능합니다.

Node Plugins

요구 사항

플러그인이 올바르게 작동하려면 Remnawave Node 설정에 cap_add: NET_ADMIN 지시문을 반드시 추가해야 합니다.

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에 기본으로 포함됩니다.

경고

Torrent Blocker가 올바르게 작동하려면 필요한 프로토콜을 포함하는 destOverride와 함께 inbound에서 sniffing이 반드시 활성화되어 있어야 합니다. sniffing이 활성화되지 않으면 Xray-Core는 트래픽 프로토콜(bittorrent 포함)을 확인할 수 없으며 Torrent Blocker 라우팅 규칙이 작동하지 않습니다.

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

Torrent Blocker는 Torrent 트래픽이 감지된 IP 주소를 차단하는 플러그인입니다.

설정

"torrentBlocker": {
"enabled": false,
"ignoreLists": {
"ip": [],
"userId": []
},
"blockDuration": 3600
},
FieldTypeDescription
enabledboolean플러그인을 활성화 또는 비활성화합니다. 기본적으로 비활성화
ignoreListsobject플러그인이 무시할 IP 주소 및 사용자 ID 목록
blockDurationnumber차단 시간(초 단위)
includeRuleTagsarray선택적 필드. 라우팅 규칙의 ruleTag 값 배열로, 이에 따라 IP 주소 차단도 실행됩니다.
ignoreLists
{
"ip": [],
"userId": []
}
FieldTypeDescription
iparray플러그인이 무시할 IP 주소 목록(CIDR 지원 안 됨). Shared Lists 설정의 목록을 사용할 수 있습니다.
userIdarray플러그인이 무시할 사용자 ID 목록
includeRuleTags — 추가 라우팅 규칙에 의한 차단

기본적으로 Torrent Blocker는 자체 라우팅 규칙을 만들고 이를 routing.rules 배열의 첫 번째 요소로 추가합니다. 이 규칙은 bittorrent 프로토콜만 추적합니다.

그러나 Xray-Core 설정에 Torrent 트래픽과 관련된 태그(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 트래커 도메인으로 트래픽을 차단하고, 두 번째는 Torrent 클라이언트가 일반적으로 사용하는 포트로 차단합니다.

Torrent Blocker가 이 규칙들의 트리거를 처리하고 IP 주소를 차단하려면, includeRuleTags에 해당 ruleTag를 지정하세요:

includeRuleTags를 사용한 Torrent Blocker 설정
"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는 bittorrent 프로토콜에 대한 자체 규칙이 트리거된 것처럼 소스 IP 주소를 차단합니다.

기술 정보

플러그인은 Xray-Core의 새 기능 중 하나인 webhook(PR: #5722)을 사용합니다. 따라서 플러그인 작동에는 Xray-Core 26.3.27 이상이 필요합니다.

플러그인 활성화가 Xray-Core 설정에 미치는 영향

이 플러그인이 활성화되면 Remnawave Node가 Xray-Core 설정에 필요한 변경 사항을 자동으로 적용합니다. 플러그인 활성화 외에 다른 작업은 필요하지 않습니다.

경고

위에 설명한 대로 – 여기서는 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 내에서는 Torrent 트래픽을 완전히 차단하는 것이 불가능합니다. Xray-Core는 Torrent 트래픽의 약 10-30%만 추적할 수 있으므로, "차단"은 최소 하나의 패킷이 처음 감지된 후 해당 패킷이 온 IP 주소가 설정에 지정된 시간 동안 차단됨을 의미합니다.

패킷을 수신하면 Xray-Core는 Remnawave Node가 처리하는 webhook에 정보를 보냅니다. 수신 후 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은 이미 알고 있는 nodeuser 객체의 전체 객체와 사용 가능한 모든 정보를 포함하는 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 주소나 포트에 대한 연결을 금지할 수 있습니다. 예를 들어 내부 서비스(예: 10.0.0.1, 10.0.0.2)나 외부 서비스(예: 8.8.8.8, 8.8.4.4)의 특정 IP 주소 액세스를 차단하거나, 원하지 않는 포트(예: 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은 완전한 플러그인이 아니라 Connection Drop 기능을 위해 IP 주소를 화이트리스트에 추가할 수 있는 작은 애드온입니다.

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플러그인을 활성화 또는 비활성화합니다. 기본적으로 비활성화
whitelistIpsarrayConnection Drop 기능의 화이트리스트에 추가될 IP 주소 목록.

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이어야 합니다
itemsarrayIP 주소 또는 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 테이블 초기화.

경고

작동하기 위해 플러그인이 활성화되어 있을 필요는 없지만, cap_add: NET_ADMIN 지시문은 반드시 활성화되어 있어야 합니다.

Block IPs

Node Plugins

이 명령은 IP 주소의 임시 차단을 위한 것입니다. 여러 주소와 차단 시간(초 단위)을 지정할 수 있습니다. 0 – 이 노드에 연결된 플러그인 설정이 변경되거나 Remnawave Node가 재시작될 때까지.

이 명령을 IP 주소의 영구 차단에 사용하지 마세요. 그 목적으로는 Ingress Filter 플러그인을 사용하세요.

Unblock IPs

Node Plugins

이 명령은 IP 주소 차단 해제를 위한 것입니다. 실행 시 nftables 테이블에서 IP 주소를 제거하는 요청이 전송됩니다.

Reset nftables

이 명령은 nftables 테이블 초기화를 위한 것입니다. 실행 시 nftables 테이블을 재생성하는 요청이 전송됩니다.