노드를 가져온 뒤 v2rayN의 분기 규칙을 수정하려는 사용자를 위한 안내입니다. 먼저 도메인 필드와 IP 필드를 구분하고, 확인 가능한 JSON 예제로 접두사와 규칙 순서, 도메인 확인 정책을 설명합니다. 마지막으로 클라이언트에서 규칙을 검증하는 방법을 살펴보며, 규칙 미일치와 출구 태그 오류, DNS 조회 실패를 같은 문제로 혼동하지 않도록 합니다.
먼저 구분하기: 필드, 매칭 값, 출구 태그
V2Ray와 Xray의 일반적인 라우팅 설정은 routing.rules 배열에 있습니다. 각 항목은 어떤 연결이 조건에 맞는지, 조건에 맞을 때 어떤 출구로 보낼지를 정의합니다. domain과 ip는 필드 이름이고, domain:, full:, geosite:는 도메인 매칭 값에 붙이는 접두사입니다. 두 문법을 혼동하지 마세요.
아래는 라우팅 규칙 한 항목이며, 코어 설정 전체가 아닙니다. 대상 도메인이 정확히 example.com인 TCP 443 연결을 proxy라는 출구로 보냅니다. 포트는 대상 서버의 포트이며 클라이언트의 로컬 수신 대기 포트가 아닙니다.
{
"type": "field",
"domain": ["full:example.com"],
"network": "tcp",
"port": "443",
"outboundTag": "proxy"
}
- 같은 필드 안에서는 보통 OR 조건입니다:
domain배열에 있는 도메인 조건 중 하나라도 일치하면 해당 필드가 충족됩니다. - 서로 다른 조건 필드 사이는 AND 조건입니다: 위 예시에서는 도메인, TCP, 대상 포트 443 조건을 모두 만족해야 해당 출구가 선택됩니다.
- 태그는 실제로 정의되어 있어야 합니다:
outboundTag는outbounds에 있는tag를 참조합니다. 노드 메모도 아니고, 원하는 한국어 동작 설명을 임의로 입력하는 곳도 아닙니다.
도메인 접두사: domain, full, regexp, geosite
같은 도메인이라도 접두사에 따라 매칭 범위가 크게 달라집니다. 기본 도메인과 모든 하위 도메인을 대상으로 하려면 domain:을, 호스트 이름 하나만 정확히 지정하려면 full:을 사용하세요. 두 방식은 범위가 넓은 키워드 매칭보다 결과를 확인하기 쉽습니다.
| 표기 | 매칭 범위 | 주의 사항 |
|---|---|---|
domain:example.com | example.com 및 하위 도메인(예: api.example.com) | notexample.com은 매칭되지 않음 |
full:example.com | example.com만 | www.example.com은 포함하지 않음 |
regexp:^api[0-9]+\.example\.com$ | 예: api1.example.com, api20.example.com | 정규식 앵커로 전체 이름을 제한 |
geosite:cn | 데이터 파일에서 cn 분류에 속하는 도메인 항목 | 분류 내용은 사용하는 데이터 파일에 따라 다름 |
example.com | 도메인에 해당 문자열이 포함된 대상 | 접미사 경계를 구분하지 않는 일반 문자열 |
geosite:는 로컬 도메인 분류 데이터를 참조하며, 웹사이트의 실제 위치를 실시간으로 조회하지 않습니다. geosite:cn도 .cn으로 끝나는 모든 도메인을 뜻하지 않습니다. 다른 최상위 도메인을 사용하는 항목이 포함될 수도 있고, 새 사이트가 아직 반영되지 않았을 수도 있습니다. 분류 이름과 속성, 항목은 설치된 데이터 파일을 기준으로 확인하세요.
정규식에는 JSON 이스케이프도 고려해야 합니다. 표의 정규식은 매칭 표현식입니다. JSON 문자열에 넣을 때 문자 그대로의 마침표를 나타내는 백슬래시는 두 번 써야 합니다. 클라이언트의 일반 텍스트 입력란에 규칙을 입력할 때는 해당 입력란의 형식에 맞추고, 이스케이프를 기계적으로 한 번 더 적용하지 마세요.
{
"type": "field",
"domain": [
"domain:example.com",
"regexp:^api[0-9]+\\.example\\.net$"
],
"outboundTag": "proxy"
}
요약: 정확한 규칙부터 확인한 뒤 범위를 넓히기
특정 사이트 하나를 점검할 때는 먼저 full: 규칙을 추가하세요. 규칙이 적용되는 것을 확인한 다음 domain:이나 분류 규칙으로 바꿀지 결정하세요. 처음부터 범위가 넓은 정규식으로 많은 대상을 한꺼번에 지정하지 마세요.
IP 규칙: 주소, CIDR, geoip
IP 조건은 ip 배열에 작성합니다. 단일 주소는 그대로 입력하고, 네트워크 대역은 CIDR로 표기하며, 지역이나 특수 주소 집합은 geoip:를 사용합니다. 주소 앞에 ip:를 붙이는 방식은 올바른 문법이 아닙니다. ip:192.168.1.1을 배열 값으로 넣으면 설정을 불러오지 못할 수 있습니다.
주소 및 네트워크 대역
- 설정 필드
ip- 단일 주소
192.168.1.1- IPv4 네트워크 대역
192.168.0.0/16- IPv6 네트워크 대역
fc00::/7
도메인 분류에 의존하지 않고 특정 기기 주소나 사설 네트워크를 지정할 때 적합합니다.
IP 데이터 집합
- 설정 필드
ip- 지역별 집합
geoip:cn- 사설 주소 집합
geoip:private- 데이터 의존성
geoip.dat
집합의 존재 여부와 포함 주소는 현재 사용하는 데이터 파일을 기준으로 확인해야 합니다.
요청이 코어에 전달될 때 이미 대상이 IP 주소라면 IP 규칙을 바로 매칭할 수 있습니다. 대상이 도메인이라면 조회 결과를 이용해 추가로 매칭할 수 있는지는 domainStrategy에 달려 있습니다. 브라우저가 직접 DNS를 조회하는지, 앱이 IP에 직접 연결하는지, 클라이언트 스니핑으로 도메인을 복원하는지에 따라서도 라우터가 최종적으로 확인하는 대상 정보가 달라집니다.
- 도메인 접미사만으로 서버 위치를 추측하지 마세요: 하나의 도메인이 여러 지역의 주소로 확인될 수 있으며, CDN을 사용하면 더욱 흔합니다.
- IPv4 규칙만 추가하지 마세요: 앱이 실제로 IPv6 주소에 연결한다면 IPv4 대역만으로는 해당 연결을 처리할 수 없습니다.
- 사설 주소를 직접 연결할지는 네트워크 환경을 고려하세요: 로컬 네트워크에서는 보통 직접 연결해야 합니다. 원격 네트워크를 통해 접속해야 하는 내부 주소는 별도 규칙을 만들고, 범위가 넓은 직접 연결 규칙보다 앞에 배치하세요.
매칭 우선순위: 더 정확한 규칙이 아니라 먼저 일치하는 규칙
라우팅 규칙은 배열 순서대로 위에서 아래로 검사하며, 조건을 만족하는 첫 번째 규칙이 출구를 결정합니다. 코어는 일치한 규칙을 모두 비교해 가장 정확해 보이는 항목을 고르지 않습니다. 예외를 안정적으로 적용하려면 정확한 도메인 규칙을 범위가 넓은 규칙보다 먼저 배치하세요.
{
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"domain": ["full:ads.example.com"],
"outboundTag": "block"
},
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "proxy"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
아래는 기존 설정에 추가하는 routing 일부이며, 인바운드와 아웃바운드, DNS 설정은 포함하지 않습니다. 세 태그가 모두 정의되어 있다고 가정합니다. ads.example.com은 첫 번째 규칙에 일치해 차단되고, www.example.com은 두 번째 규칙에 일치해 프록시를 사용합니다. 사설 주소에 직접 접속하면 세 번째 규칙에 일치할 수 있으며, 나머지 TCP 및 UDP 연결은 마지막 규칙이 처리합니다.
- 다른 규칙보다 우선 적용해야 하는 정확한 예외부터 배치하세요. 예를 들어 특정 도메인 하나를 차단하거나 지정된 서비스만 프록시로 보낼 수 있습니다.
- 그다음 도메인 집합과 IP 집합을 배치하세요. 두 집합의 범위가 겹칠 수 있다면 어떤 규칙이 먼저 결과를 결정해야 하는지 명확히 하세요.
- 범위가 넓은 기본 규칙은 마지막에 배치하세요.
network: tcp,udp에 해당하는 규칙을 맨 위로 옮기면 뒤에 있는 일반 TCP 및 UDP 규칙은 매칭될 기회가 없습니다.
어떤 규칙에도 일치하지 않으면 일반적인 V2Ray/Xray 설정은 첫 번째 출구를 사용합니다. 중국 본토는 직접 연결하고 그 외 지역은 프록시를 사용한다는 식으로 자동 판단하지 않습니다. 기본 규칙을 명시하면 설정을 이해하기 쉽지만, 도메인 조회 후 재매칭에도 영향을 줍니다. 도메인 정책과 분리해서 조정할 수는 없습니다.
domainStrategy: 도메인을 조회하고 IP 규칙을 다시 확인하는 시점
routing.domainStrategy는 라우팅 매칭 단계에서 도메인을 처리하는 방식을 제어합니다. 클라이언트의 전체 DNS 설정과 같은 의미가 아니며, 앱이 반드시 도메인을 코어에 전달한다는 뜻도 아닙니다. 먼저 인바운드에 도메인과 IP 중 무엇이 전달되는지 확인한 다음 정책을 선택하세요.
| 정책 | 라우팅 단계에서의 동작 | 선택 기준 |
|---|---|---|
AsIs | 라우팅 매칭을 위해 대상 도메인을 먼저 조회하지 않음 | 주로 도메인 규칙을 사용하거나 라우팅 단계의 DNS 조회 의존성을 줄이려는 경우 |
IPIfNonMatch | 도메인 규칙에 일치하지 않으면 조회를 시도해 IP 매칭에 사용 | 도메인 규칙을 우선 적용하고 IP 규칙은 보완용으로 사용 |
IPOnDemand | 매칭 중 IP 판정이 필요한 규칙을 만나면 조회를 시도 | 앞쪽에 있는 IP 규칙도 판단에 참여시켜야 하는 경우 |
주의할 점은 IPIfNonMatch와 무조건 적용되는 기본 규칙을 함께 사용할 때입니다. 첫 번째 검사에서 마지막 TCP·UDP 기본 규칙에 일치하면 이는 ‘미일치’ 상태가 아닙니다. 따라서 도메인을 조회한 뒤 geoip:cn 규칙에 일치하리라고 기대할 수 없습니다. 이 정책을 이용해 IP 규칙으로 분기하려면 매칭을 먼저 끝내 버리는 범용 규칙이 있는지 확인하고, 규칙이 전혀 맞지 않을 때 사용할 기본 출구도 함께 점검하세요.
IPOnDemand에서는 규칙 순서에 특히 주의해야 합니다. 앞쪽의 IP 규칙이 조회를 유발해 먼저 일치하면 뒤에 있는 도메인 예외 규칙은 적용되지 않을 수 있습니다. 특정 도메인을 반드시 프록시로 보내려면 해당 도메인의 정확한 규칙을 이를 덮을 수 있는 IP 규칙보다 앞에 배치하세요.
요약: 도메인 정책을 바꿀 때는 기본 규칙 위치도 확인하기
정책을 IPIfNonMatch로 변경했다면 사이트가 열리는지만 확인하지 마세요. 첫 번째 검사에서 대상이 기본 규칙에 먼저 잡히는지, 로그에 표시된 최종 출구가 예상과 일치하는지도 확인해야 합니다.
v2rayN에서 규칙 수정 및 확인하기
v2rayN의 라우팅 편집 화면은 버전에 따라 달라질 수 있습니다. 일반적으로 「설정」→「라우팅 설정」에서 편집할 수 있습니다. 화면을 연 뒤 수정하려는 규칙 집합이 맞는지 확인하고, 메인 창에서 현재 활성화된 라우팅이 해당 집합인지도 살펴보세요. 목록에 있어도 활성화되지 않은 규칙 집합만 수정하면 기존 연결의 트래픽 분기에는 영향이 없습니다.
- 현재 설정을 보관하세요: 사용 중인 규칙을 백업하고 코어 종류, 도메인 정책, 최종 출구를 기록하세요. 이 글은 V2Ray/Xray 형식을 다룹니다. 구조가 다른 코어의 설정에 그대로 복사하지 마세요.
- 검증 가능한 규칙 하나만 추가하세요: 도메인 조건에
full:과 실제 대상 호스트 이름을 입력하고 출구를 선택한 뒤, 해당 대상을 포함하는 범용 규칙보다 앞에 배치하세요. - 적용한 뒤 연결을 다시 만드세요: 규칙을 저장하고 필요하면 코어를 재시작하세요. 테스트 페이지의 기존 연결을 닫은 뒤 다시 시도하세요. 이미 생성된 장시간 연결은 규칙을 바꿔도 출구가 자동으로 바뀌지 않습니다.
- 로그에서 근거를 확인하세요: 현재 버전의 로그 설정에서 임시로
info또는 문제 해결에 필요한 수준을 선택하고, 대상 도메인과 포트, 출구 태그를 확인하세요. 점검이 끝나면 평소 로그 수준으로 되돌리세요. - 규칙 범위를 단계적으로 넓히세요: 정확한 도메인 테스트가 통과한 뒤
domain:으로 바꾸거나geosite:를 추가하세요. 한 번에 한 가지씩 변경해야 문제가 다시 발생한 원인을 찾기 쉽습니다.
자주 하는 설정 실수와 해결 방법
domain:example.com을 넣었는데 왜 다른 사이트도 프록시를 사용하나요?
일반 문자열, 분류 규칙, 프록시 기본 규칙이 일치하는지 먼저 확인하세요. domain:example.com은 해당 도메인과 하위 도메인만 대상으로 하며 notexample.com에는 일치하지 않습니다. 실제 출구 로그를 확인한 뒤 규칙 범위를 하나씩 좁혀 보세요.
geosite:cn을 설정했는데 코어 시작 시 분류가 없다는 오류가 나는 이유는 무엇인가요?
현재 코어가 사용하는 geosite.dat 파일이 있는지, 파일에 cn 분류가 포함되어 있는지 확인하세요. 클라이언트에서 제공하는 데이터 업데이트 기능으로 갱신한 뒤 다시 시도하세요. 다른 규칙 형식의 파일을 이름만 바꿔 대체하지 마세요.
정규식을 JSON에 넣었더니 이스케이프 오류가 납니다. 어디를 수정해야 하나요?
백슬래시를 확인하세요. 마침표 문자를 매칭하는 정규식 \.은 JSON 문자열에서 \\.로 써야 합니다. 영문 큰따옴표와 배열의 쉼표도 점검하세요. 설정을 불러올 수 있는데도 규칙이 적용되지 않는다면 앵커와 실제 호스트 이름을 확인하세요.
정확한 직접 연결 규칙을 추가했는데도 왜 프록시를 사용하나요?
해당 규칙을 범위가 넓은 프록시 규칙 앞에 배치하고, 수정한 규칙 집합이 실제로 활성화되어 있는지 확인한 뒤 연결을 다시 만드세요. 로그에 대상 IP만 표시된다면 앱이 직접 DNS를 조회하는지, 스니핑 설정을 사용할 수 있는지 살펴보세요. 코어가 도메인을 확인하지 못하면 정확한 도메인 규칙이 바로 적용될 수 없습니다.
domain과 ip를 한 규칙에 넣으면 둘 중 하나만 일치해도 적용되나요?
아니요. 서로 다른 조건 필드는 모두 만족해야 합니다. ‘이 도메인 또는 이 네트워크 대역을 직접 연결’하려면 규칙을 두 개로 나누고 같은 직접 연결 출구를 선택하세요. 이렇게 하면 도메인 조건과 IP 조건을 따로 확인하기도 쉽습니다.