이 예제에서는 Remnawave 패널의 서비스 사용자를 활용하여 서버 라우팅을 설정하는 방법을 살펴보겠습니다.
서버 라우팅
일부 사용자는 Remnawave가 서버 설정에서 clients 배열을 자동으로 지우는 문제를 겪었을 수 있습니다. 이것은 오류나 버그가 아닙니다. 패널의 일부 기능이 올바르게 동작하려면 이 배열에 불필요한 항목이 없어야 하므로, 패널이 자동으로 배열을 지웁니다.
두 개의 서버가 있다고 가정합시다. RU-001과 DE-001이라고 부르겠습니다.
사용자들은 RU-001 서버에 접속하고, 우리는 트래픽을 _라우팅_합니다. 예를 들어, .ru 사이트는 직접 전송하고 나머지는 DE-001 서버로 전송합니다.
이 작업을 수행하려면 라우팅을 처리할 _서비스 사용자_를 생성해야 합니다.
DE-001용 프로필 생성
Config Profiles 섹션으로 이동하여 새 프로필을 만듭니다. Bridge Profile이라는 이름을 붙이겠습니다.
{
"log": {
"loglevel": "warning"
},
"dns": {},
"inbounds": [
{
"tag": "BRIDGE_DE_IN",
"port": 9999,
"listen": "0.0.0.0",
"protocol": "shadowsocks",
"settings": {
"clients": [],
"network": "tcp,udp"
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls", "quic"]
}
}
],
"outbounds": [
{
"tag": "DIRECT",
"protocol": "freedom"
},
{
"tag": "BLOCK",
"protocol": "blackhole"
}
],
"routing": {
"rules": []
}
}
업데이트된 설정을 저장합니다.
Internal Squad 섹션으로 이동합니다 (새 스쿼드를 만들려면 오른쪽 모서리의 더하기 아이콘을 클릭합니다). 이 스쿼드에서는 Bridge Profile에서 방금 만든 inbound BRIDGE_DE_IN만 활성화합니다.
노드 카드 (우리의 경우 DE-001 노드)에서도 이 inbound와 프로필을 활성화하는 것을 잊지 마십시오.
서비스 사용자 생성
Users 섹션으로 이동하여 bridge_user_001이라는 사용자를 만듭니다. 이 사용자에게 트래픽 제한이 없는지 확인하고 구독 만료일을 2099년경으로 설정합니다. (트래픽 한도 도달이나 구독 만료로 인해 패널이 사용자를 비활성화하는 것을 원하지 않기 때문입니다.)
이 사용자에 대한 스쿼드를 활성화하는 것을 잊지 마세요 — 우리의 경우 위에서 만든 스쿼드를 활성화합니다.
사용자가 성공적으로 생성되면 카드를 열고 메뉴(More Actions 버튼)에서 Detailed Info 섹션을 클릭합니다.
이 섹션에서 맨 아래로 스크롤하여 inbound 유형에 따라 정보를 복사합니다.
| 프로토콜 | 패널에서의 명칭 |
|---|---|
| Shadowsocks | SS Password |
| VLESS | VLESS UUID |
| Trojan | Trojan Password |
결국 연결을 위한 비밀번호를 손에 쥐어야 합니다.
공개 프로필 설정
이미 이런 프로필이 있고 사용자들이 접속에 사용하고 있을 것입니다. inbounds 섹션은 건드릴 필요가 없습니다. 우리가 관심 있는 것은 outbounds 섹션과 routing.rules입니다.
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "PUBLIC_RU_INBOUND",
"port": 443,
"listen": "0.0.0.0",
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"target": "USE OWN VALUE!",
"show": false,
"xver": 0,
"shortIds": [""],
"privateKey": "USE OWN KEY!",
"serverNames": ["REPLACE WITH OWN VALUES!"]
}
}
}
],
"outbounds": [
{ "protocol": "freedom", "tag": "DIRECT" },
{ "protocol": "blackhole", "tag": "BLOCK" }
],
"routing": {
"rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{
"domain": ["geosite:private"],
"outboundTag": "BLOCK"
},
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" }
]
}
}
초기 과제는: 사용자가 VLESS 프로토콜로 RU-001 서버에 접속하고, 그 후 라우팅으로 트래픽을 리디렉션하는 것입니다.
Outbound
먼저 outbound를 구성해야 합니다.
{
"tag": "SS_OUTBOUND_TO_DE",
"protocol": "shadowsocks",
"settings": {
"servers": [
{
"address": "ADDRESS OF DE-001",
"password": "PASSWORD FROM PREVIOUS STEP",
"port": 9999,
"level": 0,
"method": "chacha20-ietf-poly1305"
}
]
}
}
| 값 | 입력 내용 |
|---|---|
| address | 서버를 향한 IP 또는 도메인 이름, 예를 들어 DE-001 서버의 IP 주소 |
| port | inbound 포트, 우리의 경우 BRIDGE_DE_IN inbound의 포트 |
| password | 연결용 사용자 비밀번호 (프로토콜에 따라 값이 다를 수 있습니다. 위 참조) |
Shadowsocks의 경우 — chacha20-ietf-poly1305 이외의 방법은 사용하지 마십시오. Remnawave는 이 방법만 지원합니다.
라우팅
위에서 지정한 outbound로 모든 트래픽을 보내는 규칙 예시.
{
"inboundTag": ["PUBLIC_RU_INBOUND"],
"outboundTag": "SS_OUTBOUND_TO_DE"
}
RU 사이트를 직접 (RU-001 노드에서 바로 출구) 보내고 나머지는 DE-001로 보내는 규칙 예시.
{
"ip": [
"geoip:ru"
],
"outboundTag": "DIRECT"
},
{
"domain": [
"geosite:category-ru"
],
"outboundTag": "DIRECT"
}
전체 설정을 조합하면 다음과 같습니다.
{
"log": { "loglevel": "none" },
"inbounds": [
{
"tag": "PUBLIC_RU_INBOUND",
"port": 443,
"listen": "0.0.0.0",
"protocol": "vless",
"settings": { "clients": [], "decryption": "none" },
"sniffing": { "enabled": true, "destOverride": ["http", "tls", "quic"] },
"streamSettings": {
"network": "raw",
"security": "reality",
"realitySettings": {
"target": "USE OWN VALUE!",
"show": false,
"xver": 0,
"shortIds": [""],
"privateKey": "USE OWN KEY!",
"serverNames": ["REPLACE WITH OWN VALUES!"]
}
}
}
],
"outbounds": [
{ "protocol": "freedom", "tag": "DIRECT" },
{ "protocol": "blackhole", "tag": "BLOCK" },
{
"tag": "SS_OUTBOUND_TO_DE",
"protocol": "shadowsocks",
"settings": {
"servers": [
{
"address": "ADDRESS OF DE-001",
"password": "PASSWORD FROM PREVIOUS STEP",
"port": 9999,
"level": 0,
"method": "chacha20-ietf-poly1305"
}
]
}
}
],
"routing": {
"rules": [
{ "ip": ["geoip:private"], "outboundTag": "BLOCK" },
{ "domain": ["geosite:private"], "outboundTag": "BLOCK" },
{ "protocol": ["bittorrent"], "outboundTag": "BLOCK" },
{ "ip": ["geoip:ru"], "outboundTag": "DIRECT" },
{ "domain": ["geosite:category-ru"], "outboundTag": "DIRECT" },
{
"inboundTag": ["PUBLIC_RU_INBOUND"],
"outboundTag": "SS_OUTBOUND_TO_DE"
}
]
}
}
outbound SS_OUTBOUND_TO_DE를 outbounds 배열에 추가하고, 규칙을 routing 객체 내 rules 배열에 추가했습니다.
Xray의 규칙은 우선순위 원칙으로 동작합니다. 우리의 규칙은 대략 다음과 같이 해석됩니다:
- IP가
geoip:private에 속하는 경우 — BLOCK (_blackhole_인 BLOCK outbound로 전송되어 차단됩니다). - 도메인이
geosite:private카테고리에 속하는 경우 — 동일한 처리. bittorrent트래픽도 동일.- IP가
geoip:ru에 속하는 경우 —DIRECTOutbound로 전송되어 트래픽이RU-001서버에서 나갑니다. - 도메인이
geosite:category-ru카테고리에 속하는 경우 — 마찬가지로DIRECT로 전송됩니다. - 트래픽이 inbound
PUBLIC_RU_INBOUND에서 온 경우 — outboundSS_OUTBOUND_TO_DE로 전송되어DE-001서버로 이동합니다.
결론
이 예제에서 다음과 같은 구조를 만들었습니다:
- 사용자가
VLESS프로토콜을 사용하여RU-001서버에 접속합니다 - 트래픽이 규칙을 따릅니다:
- 러시아 사이트(또는 IP) — 직접 출력 (DIRECT)
- 나머지 모든 트래픽 —
shadowsocks프로토콜을 통해 다른 서버DE-001로 전송
전송 프로토콜로 VLESS도 사용할 수 있으며, 주된 차이는 outbound에만 있을 것입니다.