노드를 가져온 뒤 도메인과 IP에 따라 트래픽을 분기하려는 사용자를 위한 안내입니다. 도메인 목록, IP 주소 목록, 기본 아웃바운드의 차이를 살펴보고 라우팅 설정 예시로 규칙 순서를 설명합니다. 마지막으로 v2rayN에 적용한 뒤 로그로 동작을 확인합니다. 예시는 Xray/V2Fly에서 흔히 쓰는 field 라우팅 형식입니다. 구독 노드 매개변수, 클라이언트 메뉴, 코어 설정을 같은 단계의 설정으로 혼동하지 않도록 주의하세요.
1. geosite와 geoip는 무엇을 기준으로 매칭할까
라우팅 분기는 노드의 프로토콜을 바꾸는 기능이 아니라 코어로 들어온 각 연결의 아웃바운드를 선택하는 기능입니다. VMess, VLESS 등은 프록시 연결을 설정하는 방식을 정하고, 라우팅 규칙은 해당 연결을 프록시, 직접 연결 또는 다른 아웃바운드 중 어디로 보낼지 결정합니다. 구독에 사용할 수 있는 노드가 있다고 해서 적절한 분기 정책까지 설정된 것은 아닙니다.
geosite:cn은 도메인 데이터 파일의 cn 분류를 참조하고, geoip:cn은 IP 데이터 파일에 있는 중국 주소 목록을 참조합니다. 전자는 도메인이 목록에 포함되는지 확인하고, 후자는 대상 IP가 주소 대역에 속하는지 확인합니다. 두 규칙 모두 웹사이트의 언어를 판별하는 기능은 아니며, 중국 본토 서비스나 여러 국가에 걸친 사이트, CDN 주소가 모두 예상대로 분류된다고 보장하지도 않습니다.
도메인 규칙
- 필드
domain- 분류 예시
geosite:cn- 전체 도메인 일치
full:example.com- 도메인 및 하위 도메인 일치
domain:example.com
코어가 도메인을 알아야 합니다. 연결 대상이 IP 주소뿐이면 도메인 목록만으로 판단할 수 없습니다.
주소 규칙
- 필드
ip- 분류 예시
geoip:cn- 사설 IP 주소
geoip:private- 네트워크 대역 예시
192.168.0.0/16
IP 주소로 직접 연결하거나 라우팅 단계에서 도메인을 해석해 주소를 판별할 때 적합합니다.
도메인을 지정할 때는 full: 또는 domain:을 명시하는 편이 좋습니다. 일반 문자열을 부분 일치로 사용하면 이름이 비슷할 뿐 관련 없는 사이트까지 매칭될 수 있습니다. domain:example.com은 해당 도메인과 하위 도메인에 매칭되며 notexample.com은 하위 도메인으로 취급하지 않습니다. 이 글의 example.com은 문법 설명을 위한 예시일 뿐, 연결 테스트용 서비스가 아닙니다.
2. 규칙 순서: 사용자 지정 예외를 목록보다 먼저 배치
일반적인 field 규칙은 배열에 적힌 순서대로 확인하며, 먼저 매칭된 규칙이 아웃바운드를 결정합니다. 자동으로 더 구체적인 규칙을 선택하지는 않습니다. 하나의 규칙에 domain과 port를 함께 지정하면 일반적으로 두 필드가 모두 일치해야 합니다. 반면 같은 domain 배열에 여러 항목을 넣으면 그중 하나만 일치해도 됩니다. 도메인이나 IP 중 하나에 매칭하려면 규칙을 두 개로 나누세요.
- 필요한 예외를 먼저 배치: 프록시로 연결해야 하는 업무용 도메인 등을 뒤의 직접 연결 목록이 먼저 처리하지 않도록 앞에 둡니다.
- 다음은 도메인 목록: 확인된 중국 본토 도메인을 직접 연결해 라우팅 과정에서 추가로 도메인을 해석할 필요를 줄입니다.
- 이어서 IP 주소 확인: 사설 IP와 중국 IP는 직접 연결로 보내 IP 주소로 접속하는 대상도 처리합니다.
- 마지막으로 미매칭 연결 처리: 이 예시에서는 별도의 무조건 규칙을 추가하지 않고 첫 번째 아웃바운드를 기본 경로로 사용합니다.
‘중국 본토는 직접 연결, 해외는 프록시’라는 설정이 각 회사의 소재지를 정확히 판별한다고 오해하기 쉽습니다. 실제로는 목록에 따른 판정과 기본 경로를 조합한 정책입니다. 중국 본토 목록에 없는 연결이 기본적으로 프록시로 간다는 뜻이지, 해당 대상이 해외에 있다고 확인된 것은 아닙니다. 여러 지역에 서버를 둔 서비스, 사내 도메인, 고정 출구가 필요한 서비스는 명시적인 예외 규칙으로 처리하세요.
3. domainStrategy 세 가지 값은 어떻게 선택할까
routing.domainStrategy는 라우팅 규칙을 적용할 때 DNS 조회 결과를 어떻게 사용할지 정합니다. 브라우저가 사용할 DNS 서비스를 직접 지정하는 설정도 아니며, direct 아웃바운드 자체의 도메인 해석 정책과도 다릅니다. 문제를 해결할 때는 어떤 설정 객체를 수정했는지 먼저 확인하세요. 필드 이름이 같다는 이유만으로 동일하게 동작한다고 판단하면 안 됩니다.
| 값 | 라우팅 단계에서의 동작 | 사용 상황 |
|---|---|---|
AsIs | 라우팅을 위해 도메인을 추가로 조회하지 않습니다. 대상이 원래 IP 주소라면 IP 규칙은 계속 적용할 수 있습니다. | 도메인 규칙을 주로 사용하며, 주소 판정을 위해 도메인을 조회할 필요가 없을 때 |
IPIfNonMatch | 첫 검사에서 매칭되는 규칙이 없을 때 도메인을 조회해 라우팅을 다시 판정합니다. | 먼저 도메인으로 분류하고, 매칭되지 않으면 중국 IP 목록으로 보완할 때 |
IPOnDemand | 대상 IP가 필요한 규칙을 확인할 때 필요에 따라 도메인 조회를 시도합니다. | IP 판정을 먼저 수행하고 DNS 조회에 따른 영향을 감수할 수 있을 때 |
이 예시에서는 IPIfNonMatch를 사용합니다. geosite:cn에 매칭된 도메인은 바로 직접 연결로 보내고, 처음에 매칭되지 않은 도메인은 조회 결과를 통해 geoip:cn에 매칭될 수 있습니다. DNS 조회에 실패하거나 반환된 주소가 목록에 없거나, 앞선 규칙이 이미 매칭된 경우에는 결과가 달라질 수 있습니다.
IPOnDemand를 사용할 때는 규칙 순서에 특히 주의하세요. 앞선 IP 규칙이 조회 결과로 매칭되면 뒤에 있는 도메인 예외는 확인하지 않습니다. 나중에 IP 대역을 계속 추가하기보다 사용자 지정 도메인 예외를 맨 앞에 두는 편이 관리하기 쉽습니다.
4. 라우팅 설정 예시: 중국 본토는 직접 연결, 나머지는 기본 프록시
아래는 최상위 routing 객체만 보여 주는 예시이며, 완전한 클라이언트 설정으로 바로 실행할 수 없습니다. 같은 전체 설정의 outbounds에 태그가 proxy인 프록시 아웃바운드와 태그가 direct인 직접 연결 아웃바운드가 정의되어 있어야 하며, 첫 번째 아웃바운드는 proxy여야 합니다. 노드 주소, 인증 정보와 인바운드 설정은 기존 클라이언트 설정에서 가져옵니다.
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": [
"full:example.com",
"domain:example.net"
],
"outboundTag": "proxy"
},
{
"type": "field",
"domain": [
"geosite:cn"
],
"outboundTag": "direct"
},
{
"type": "field",
"ip": [
"geoip:private",
"geoip:cn"
],
"outboundTag": "direct"
}
]
}
}
- 규칙 1: 정확히 지정한 도메인과 도메인 접미사 예외는 먼저 프록시로 보냅니다. 실제로 적용할 때는 필요한 업무에 맞게 예시 항목을 삭제하거나 수정하세요.
- 규칙 2: 중국 도메인 목록에 매칭되는 연결은 직접 연결합니다.
- 규칙 3: 대상이 사설 IP 또는 중국 IP 목록에 포함되면 직접 연결합니다.
- 기본 경로: 어떤 규칙에도 매칭되지 않은 연결은 첫 번째 아웃바운드로 전달됩니다. 최종 생성된 설정에서 아웃바운드 순서를 확인하세요.
이처럼 기존 데이터 형식을 사용하려면 코어가 geosite.dat와 geoip.dat를 읽을 수 있어야 합니다. 파일이 없거나 경로가 잘못되었거나 분류 이름이 존재하지 않으면 설정을 불러오는 단계에서 오류가 발생할 수 있습니다. 규칙 데이터를 업데이트한 뒤에는 코어를 다시 불러오세요. 데이터 출처를 바꾸기 전에는 사용 중인 분류가 계속 제공되는지도 확인해야 합니다.
5. v2rayN에 적용하고 동작 확인하기
일반적인 노드 모드에서 v2rayN은 코어 설정을 생성하므로 임시로 생성된 JSON을 직접 수정하면 다음에 다시 시작할 때 변경 내용이 사라질 수 있습니다. 라우팅 설정에서 규칙을 관리하는 방법을 우선 사용하고, 완전히 사용자 지정한 설정이 필요할 때는 해당 설정 메뉴를 이용하세요. 데스크톱 인터페이스에 따라 버튼 위치가 다를 수 있습니다. 아래 단계는 「설정」→「라우팅 설정」 메뉴가 있는 인터페이스를 기준으로 합니다.
-
현재 규칙 백업
「설정」→「라우팅 설정」을 열고 현재 규칙을 복사해 보관한 뒤, 선택된 라우팅 프로필을 기록해 두세요. 테스트가 실패하면 되돌릴 수 있도록 기존 프로필을 먼저 삭제하지 마세요.
-
규칙 순서 정리
라우팅 설정에서 테스트용 프로필을 편집하고 도메인 예외, 중국 도메인 규칙, IP 규칙 순으로 추가하세요. 규칙 편집기에는 각 필드에 맞는 값을 입력해야 합니다. 최상위 JSON 전체를 도메인 입력란 하나에 붙여 넣지 마세요.
-
조회 정책 확인
해당 프로필의 도메인 정책을
IPIfNonMatch로 설정하고 각 규칙의 아웃바운드 선택을 확인하세요. 인터페이스에서 관련 필드를 설정할 수 없다면 생성된 설정을 확인해야 합니다. 라우팅 프로필 이름만 보고 실제 값을 추측하지 마세요. -
프로필 선택 및 다시 불러오기
저장한 뒤 방금 수정한 라우팅 프로필을 선택하고 코어를 다시 불러오세요. 편집 창에서 저장만 눌렀다고 현재 사용 중인 프로필까지 바뀌는 것은 아닙니다. 실제로 불러온 설정과 로그를 기준으로 확인하세요.
-
대상별로 출구 확인
직접 연결되어야 하는 대상, 프록시를 거쳐야 하는 대상, 로컬 네트워크 대상을 각각 열어 로그에 기록된 대상과 아웃바운드 태그를 확인하세요. 테스트 전에 기존 연결을 끊어야 합니다. 이미 연결된 장시간 연결은 규칙이 바뀌어도 아웃바운드를 자동으로 다시 선택하지 않습니다.
검증 전에 트래픽이 실제로 코어에 들어가는지도 확인해야 합니다. 앱이 시스템 프록시를 사용하지 않는다면 라우팅 규칙을 아무리 완성해도 트래픽을 처리할 수 없습니다. 다음 수치는 테스트 설정 예시일 뿐 모든 설치 환경의 기본값은 아닙니다. 명령을 실행하기 전에 현재 클라이언트의 리스닝 포트를 확인하세요.
curl --proxy socks5h://127.0.0.1:10808 --head https://example.com/
여기서 socks5h는 대상 도메인을 프록시에서 처리하도록 전달하므로 도메인 규칙 테스트에 도움이 됩니다. 로컬에서 먼저 도메인을 조회하는 방식으로 바꾸면 코어가 IP 주소만 볼 수 있어 결과를 직접 비교하기 어렵습니다. 이 명령의 도메인은 예시의 첫 번째 규칙에 매칭되므로, 페이지가 열리는지만 보지 말고 프록시 아웃바운드 태그가 기록되는지 확인하세요.
6. 시스템 프록시와 TUN: 트래픽 처리 방식에 맞춰 확인
같은 라우팅 설정도 트래픽을 처리하는 방식에 따라 다르게 동작할 수 있습니다. 차이는 노드가 아니라 코어가 받는 대상 정보에 있습니다. 시스템 프록시에서는 앱이 도메인을 그대로 전달할 수 있습니다. TUN이 트래픽을 처리하면 연결은 보통 IP 패킷으로 들어오며, 도메인을 복원할 수 있는지는 DNS 처리와 스니핑 등의 설정에 달려 있습니다.
대상 정보에 맞는 검증 방법
시스템 프록시 환경
- 브라우저나 앱이 프록시 설정을 사용하는지 확인합니다.
- 시스템 설정의 영향을 줄이려면 SOCKS 프록시를 명시해 테스트합니다.
- 먼저 도메인 규칙을 확인한 뒤, 매칭되지 않은 연결의 IP 판정을 점검합니다.
TUN 처리 환경
- 실제로 트래픽을 처리하는 코어와 설정 형식을 확인합니다.
- 로그에 도메인이 기록되는지 IP 주소만 기록되는지 확인합니다.
- 규칙을 조정하기 전에 DNS 처리와 로컬 네트워크 접속을 점검합니다.
트래픽이 어느 코어로 들어가는지 먼저 확인한 다음 해당 코어에 맞는 규칙 형식을 선택하세요. 이 글의 JSON을 모든 TUN 설정에 그대로 적용할 수는 없습니다.
데스크톱용 v2rayN, 안드로이드용 v2rayNG, v2flyNG는 같은 분기 목표를 기준으로 설정할 수 있지만 메뉴, 태그, 가져오기 형식까지 완전히 같다고 가정해서는 안 됩니다. v2rayNG는 Xray 코어를, v2flyNG는 V2Fly 코어를 사용합니다. 설정을 옮길 때는 현재 코어에서 지원하는 필드와 데이터 형식을 확인하세요. 노드 구독에 클라이언트 라우팅 설정이 포함되어 있지 않을 수도 있습니다.
7. 자주 발생하는 설정 오류: 로그를 따라 원인 좁히기
geosite:cn을 추가했는데 중국 사이트가 계속 프록시로 연결되는 이유는?
먼저 로그의 대상이 도메인인지 확인한 다음, 해당 도메인이 현재 데이터 파일의 cn 분류에 실제로 포함되는지 살펴보세요. 로그에 IP 주소만 표시된다면 geoip:cn과 도메인 조회 정책을 확인해야 합니다. 업무용 도메인이 목록에 없다면 명시적인 domain: 직접 연결 규칙을 추가하세요. 알 수 없는 모든 대상을 직접 연결하도록 바꾸지는 마세요.
IPIfNonMatch를 설정했는데 geoip가 여전히 적용되지 않는 이유는?
port: "0-65535" 같은 와일드카드 규칙이 먼저 매칭되는지 확인하세요. 테스트 프로필에서 기본 경로 규칙을 제거하고 첫 번째 아웃바운드가 프록시인지 확인한 다음, 도메인 규칙에 매칭되지 않는 대상으로 테스트합니다. 라우팅에 사용되는 DNS가 주소를 정상적으로 반환하는지도 점검해야 합니다.
규칙을 저장한 뒤 모든 연결이 실패하면 어떻게 해야 할까?
먼저 백업한 프로필로 되돌린 뒤 코어 시작 로그를 확인하세요. 데이터 파일을 읽을 수 없다는 오류가 있으면 파일 경로를 바로잡거나 데이터를 업데이트합니다. 아웃바운드 태그 오류라면 outboundTag가 실제 태그와 정확히 일치하는지 확인하세요. 설정을 불러오지 못하는 상황에서 구독이나 노드를 먼저 바꾸지는 마세요.
같은 사이트가 직접 연결될 때도 있고 프록시를 거칠 때도 있다면 어떻게 확인할까?
기본 도메인, 정적 리소스 도메인, 대상 IP를 각각 기록하고 주소 계열이나 CDN 주소가 다른지 확인하세요. 기존 연결을 끊은 뒤 다시 테스트합니다. 도메인으로 접속할 때와 IP로 접속할 때 결과가 다르면 테스트 방법을 먼저 통일한 다음 도메인 예외를 추가할지 판단하세요.
문제를 확인할 때는 한 번에 변수 하나만 바꾸세요. 먼저 트래픽이 처리되는지 확인하고, 이어서 설정 로드 여부와 규칙 매칭, 마지막으로 DNS와 실제 연결을 점검합니다. 로그 상세 수준을 잠시 높이면 원인을 찾는 데 도움이 됩니다. 로그를 공유하기 전에는 구독 주소, 인증 정보와 기타 민감한 내용을 삭제하세요. 자세한 설정 항목은 전체 설정 가이드에서, 연결 문제는 문제 해결 안내에서 확인할 수 있습니다.