구독을 가져와 노드 연결까지 마쳤지만 중국 본토와 해외 트래픽을 다르게 라우팅하고 싶은 사용자를 위한 안내입니다. 먼저 트래픽이 클라이언트로 들어오는지 확인하고, domain과 IP가 각각 무엇을 기준으로 일치하는지 살펴본 뒤 ‘사용자 지정 예외 → 일반 분류 → 기본 출구’ 순서로 규칙을 설정합니다. V2Ray/Xray 형식의 라우팅 예시와 v2rayN 설정 절차, 확인 방법을 제공합니다. 코드의 출구 태그는 현재 설정에 맞춰야 하며, 전체 클라이언트 설정으로 그대로 가져오면 안 됩니다.
라우팅 전제 조건: 먼저 트래픽이 코어에 들어와야 합니다
라우팅 규칙은 트래픽이 나갈 출구를 선택할 뿐, 모든 앱의 트래픽을 자동으로 프록시로 보내지는 않습니다. 시스템 프록시를 따르는 브라우저의 요청은 로컬 프록시 포트로 전달됩니다. 시스템 프록시를 무시하는 프로그램은 별도로 프록시를 설정하거나 TUN으로 트래픽을 가져와야 합니다. TUN을 켜도 모든 트래픽이 프록시를 통과하는 것은 아닙니다. 트래픽이 코어에 들어온 뒤에도 라우팅 규칙에 따라 직접 연결될 수 있습니다.
v2rayN은 데스크톱 클라이언트이며, 실제 라우팅은 현재 실행 중인 코어가 처리합니다. 이 문서의 JSON은 V2Ray/Xray 라우팅 형식으로, 해당 코어의 설정에 적용할 수 있으며 모든 코어에서 공통으로 쓰이는 문법은 아닙니다. Android의 v2rayNG는 Xray 코어를, v2flyNG는 v2fly 코어를 사용합니다. 두 앱은 화면 구성, 기본 규칙, 리소스 업데이트 방식이 서로 다를 수 있습니다.
domain과 IP: 매칭 대상과 작성법
domain은 요청의 대상 도메인과 일치하고, ip는 대상 IP 또는 정책에 따라 조회된 IP와 일치합니다. 도메인 규칙은 전체 URL을 필터링하지 않습니다. https://, 웹 경로, 쿼리 매개변수는 입력하지 마세요. 같은 도메인이라면 경로가 달라도 일반적으로 동일한 출구를 사용합니다.
| 규칙 형식 | 의미 | 사용 예 |
|---|---|---|
full:example.com | example.com 자체만 일치 | 특정 호스트 이름 하나에 예외 적용 |
domain:example.com | 루트 도메인과 하위 도메인 일치 | 같은 도메인의 서비스를 동일한 출구로 연결 |
example | 일반 문자열을 키워드로 사용해 도메인 매칭 | 범위가 넓어 의도치 않게 일치할 수 있으므로 주의해서 사용 |
geosite:cn | 도메인 리소스의 cn 분류 참조 | 관리되는 도메인 목록에 따라 트래픽 분기 |
192.168.0.0/16 | 지정한 IPv4 대역과 일치 | 로컬 네트워크 주소를 직접 연결 |
geoip:cn | IP 리소스의 cn 분류 참조 | 대상 IP가 속한 주소 목록에 따라 트래픽 분기 |
예를 들어 domain:example.com은 api.example.com과 일치하지만, notexample.com을 하위 도메인으로 취급하지는 않습니다. 정확하게 제어하려면 full: 또는 domain:을 우선 사용하고, 도메인 경계를 확인하지 않은 채 짧은 키워드로 대체하지 마세요.
도메인 예외 규칙
- 규칙 필드
- domain
- 매칭 대상
- domain:example.com
- 대상 출구
- direct
- 권장 위치
- 일반 분류 규칙보다 앞
도메인을 정확히 알고 있는 서비스에 적합합니다. 예시 도메인은 형식 설명용입니다.
로컬 네트워크 IP 규칙
- 규칙 필드
- ip
- 매칭 대상
- geoip:private
- 대상 출구
- direct
- 확인 사항
- IPv4 및 IPv6 주소 범위
리소스 파일에 해당 분류가 있는지 확인하세요. 실제 네트워크에 맞는 CIDR 대역을 직접 지정할 수도 있습니다.
규칙 순서: 처음 일치한 규칙이 출구를 결정합니다
규칙은 목록의 위에서 아래로 확인하며, 일치하면 더 정확한 후속 규칙을 찾지 않습니다. 범위가 넓은 규칙을 맨 앞에 두면 뒤에 있는 사용자 지정 예외가 적용되지 않을 수 있습니다. 동일 필드 배열의 여러 값은 대개 ‘또는’ 조건입니다. 한 규칙에 domain, ip, port 등 서로 다른 조건을 함께 입력하면 해당 조건을 모두 충족해야 합니다.
- 예외를 먼저 배치: 반드시 직접 연결하거나 프록시를 사용해야 하는 특정 도메인을 일반 국가 분류보다 앞에 두세요.
- 다음은 일반 분류: 로컬 네트워크, 중국 본토 도메인, 중국 본토 IP 등 일반적인 범위를 차례로 처리합니다.
- 마지막으로 나머지 트래픽 처리: 기본 출구를 명시해 출구 목록의 불명확한 순서에 의존하지 마세요.
- 도메인과 IP는 별도 규칙으로: ‘중국 본토 도메인 또는 중국 본토 IP는 직접 연결’하려면 두 조건을 한 규칙에 넣지 말고 규칙을 두 개 만드세요.
어떤 규칙에도 일치하지 않으면 일반적으로 outbounds 배열의 첫 번째 출구가 사용됩니다. 아래 예시는 끝에 TCP/UDP 규칙을 추가해 프록시로 명시적으로 보내므로, ‘일치하지 않음’을 반드시 직접 연결로 오해하지 않도록 합니다. 이 코드는 routing 부분만 포함합니다. direct와 proxy는 현재 전체 설정에 이미 있는 출구 태그여야 합니다.
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"domain": ["domain:example.com"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
},
{
"type": "field",
"domain": ["geosite:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"ip": ["geoip:cn"],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
geosite, geoip 및 DNS 정책
geosite는 도메인 목록이고 geoip는 IP 주소 목록입니다. 둘 다 실시간 조회 서비스가 아닙니다. 존재하지 않는 분류를 지정하거나 리소스 파일이 없거나 형식이 호환되지 않으면 코어 로드에 실패할 수 있습니다. 구독을 업데이트해도 노드만 새로 가져올 뿐, 라우팅 리소스까지 함께 업데이트된다는 보장은 없습니다.
domainStrategy는 라우팅 단계에서 도메인 조회를 처리하는 방식을 정하며, DNS 서버 설정 전체를 뜻하지는 않습니다. IPIfNonMatch로 설정하면 도메인 규칙에 일치하지 않을 때 IP를 조회해 다시 매칭할 수 있습니다. 마지막에 모든 트래픽과 일치하는 규칙이 있으면 이미 규칙이 일치했으므로 이 조건을 충족하지 않습니다.
| 정책 | 라우팅 동작 | 참고 사항 |
|---|---|---|
AsIs | 라우팅 단계에서 도메인의 IP를 별도로 조회하지 않음 | 도메인 요청은 주로 domain 규칙으로 처리하며, IP 필드는 IP에 직접 접속하는 경우에도 적용 가능 |
IPIfNonMatch | 도메인이 일치하지 않으면 IP를 조회해 다시 매칭 시도 | 마지막의 전체 일치 규칙이 먼저 적용되므로 IP 대체 매칭을 기대할 수 없음 |
IPOnDemand | IP가 필요한 규칙을 만나면 조회 시도 | 규칙 순서에 따라 조회 시점이 달라지므로 DNS 사용 가능 여부도 확인해야 함 |
앞 절의 설정에서 geoip:cn은 IP를 직접 대상으로 하는 연결을 처리할 수 있습니다. 하지만 마지막에 전체 일치 규칙이 있으면 분류되지 않은 모든 도메인이 IP 대체 매칭을 거친다고 보장할 수 없습니다. 일치하지 않은 도메인도 조회된 IP를 기준으로 분류하려면 IPOnDemand를 고려하고, 먼저 적용할 도메인 규칙을 IP 규칙보다 앞에 두세요. 또는 전체 일치 규칙을 제거하고 첫 번째 출구가 실제로 프록시인지 확인하세요.
IPOnDemand를 사용하면 DNS 조회 오류로 라우팅 판단이 느려질 수 있습니다. 노드 지연 시간만 확인해서는 안 됩니다.- 도메인은 IPv4와 IPv6 주소를 함께 반환할 수 있습니다. IPv4 결과 하나만 확인해서는 모든 연결의 라우팅 결과를 설명할 수 없습니다.
- 스니핑으로 일부 연결에서 도메인 정보를 보완할 수 있지만, 프로토콜과 암호화 방식에 따라 달라집니다. 항상 성공하는 도메인 복원 기능으로 간주하지 마세요.
세 가지 설정: 중국 본토 우회, 전체 프록시, 사용자 지정 직접 연결
‘중국 본토 우회’는 일반적으로 로컬 네트워크와 중국 본토 대상은 직접 연결하고 나머지는 프록시를 사용하는 방식입니다. ‘전체 프록시’는 코어에 들어온 트래픽을 모두 프록시 출구로 보냅니다. 어느 방식도 앱 트래픽이 반드시 코어에 들어온다고 보장하지 않습니다. 회사 내부망, 프린터, 가정용 저장 장치 등이 필요하다면 설정을 바꾼 뒤에도 접속 가능한지 따로 확인하세요.
| 방식 | 규칙 구성 | 확인할 사항 |
|---|---|---|
| 중국 본토 우회 | 사용자 지정 예외 → 로컬 네트워크 직접 연결 → 중국 본토 도메인/IP 직접 연결 → 나머지는 프록시 | 중국 본토 서비스는 direct, 그 외 테스트 대상은 proxy로 연결되는지 확인 |
| 전체 프록시 | 필요한 로컬 네트워크 예외만 남기고 나머지 TCP/UDP는 proxy로 지정 | 먼저 적용되는 직접 연결 규칙이 남아 있는지, 앱 트래픽이 코어에 들어오는지 확인 |
| 사용자 지정 직접 연결 | 지정한 full/domain 규칙을 맨 위에 두고 기존 트래픽 분기 규칙 유지 | 기본 도메인, 로그인 도메인, 리소스 도메인을 각각 처리해야 하는지 확인 |
특정 서비스 사이트를 직접 연결하려면 기본 도메인 규칙 하나만으로 부족할 수 있습니다. 로그인, API, 정적 파일이 서로 다른 도메인을 사용할 수 있습니다. 먼저 로그에서 실제 요청을 확인한 다음 필요한 도메인만 추가하세요. 편의를 위해 여러 사이트가 공유하는 CDN의 전체 주소 범위를 직접 연결로 설정하면 관계없는 사이트에도 영향을 줄 수 있습니다.
-
현재 설정 저장
현재 라우팅 설정 이름을 기록하고 규칙을 백업하세요. 노드가 작동하는지 확인하고, 문제가 생겼을 때 복구할 수 있도록 수정 전 설정을 보관합니다.
-
라우팅 설정 열기
해당 메뉴를 제공하는 v2rayN 데스크톱 화면에서 ‘설정’ → ‘라우팅 설정’으로 이동합니다. 버전에 따라 메인 화면의 ‘라우팅’ 메뉴에 있을 수 있으니 현재 설치된 버전에 표시되는 메뉴명을 확인하세요.
-
대상 규칙 편집
사용할 라우팅 설정을 선택하고 규칙 편집 창을 엽니다. 예를 들어
domain:example.com같은 domain 항목을 추가하고 출구를 직접 연결로 설정하세요. 화면에서 접두어와 내용을 별도로 입력한다면 유형을 선택한 뒤 도메인을 입력합니다. -
규칙 순서 조정
예외 규칙을 중국 본토 분류와 기본 규칙보다 앞에 배치합니다. 도메인 규칙과 IP 규칙은 따로 추가하세요. 저장한 뒤 메인 화면의 ‘라우팅’ 선택기에서 해당 설정을 활성화합니다.
-
연결을 다시 만들어 확인
설정이 다시 로드될 때까지 기다리고 필요한 경우 코어를 재시작하세요. 기존 웹 연결을 닫고 다시 접속한 다음 새 연결 로그에서 대상과 출구를 확인합니다. 이미 열린 장시간 연결로 새 규칙의 적용 여부를 판단하지 마세요.
라우팅 확인: 포트, 로그, 출구를 함께 점검
웹사이트가 열린다는 사실만으로는 예상한 출구를 사용했다고 볼 수 없습니다. 직접 연결해야 하는 대상 하나, 프록시를 사용해야 하는 대상 하나, 로컬 네트워크 주소 하나를 각각 테스트하세요. 로그에서는 대상 도메인 또는 IP, 선택된 출구 태그, 오류 메시지를 확인합니다. 로그 수준이 너무 낮다면 테스트 중에만 높이고 끝난 뒤 원래대로 되돌리세요.
아래 명령은 요청이 로컬 HTTP 프록시를 거치도록 합니다. 예시에서는 HTTP 또는 혼합형 인바운드가 127.0.0.1:10808에서 수신 대기한다고 가정합니다. 먼저 클라이언트에서 실제 프로토콜과 포트를 확인하세요. 해당 포트가 SOCKS 서비스만 제공한다면 HTTP 프록시 매개변수를 그대로 사용할 수 없습니다. 이 명령은 요청 방법을 보여주는 예시일 뿐, 대상 사이트에 특정 라우팅 정책을 적용해야 한다는 뜻은 아닙니다.
curl --proxy http://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/
- 연결 거부: 먼저 로컬 포트가 수신 대기 중인지, 코어가 실행 중인지 확인하세요. 보통 이 단계에서는 아직 라우팅 규칙을 확인하지 않습니다.
- 잘못된 출구로 연결됨: 선택된 라우팅 설정, 앞에서 먼저 일치하는 규칙, 코어에 최신 설정이 로드됐는지 확인하세요.
- 출구는 맞지만 접속 시간이 초과됨: 노드 연결 상태, 대상 서비스 상태, DNS를 확인하세요. 비슷한 라우팅 규칙을 계속 추가하지 마세요.
- 브라우저와 명령 결과가 다름: 브라우저 자체 프록시 설정, 기존 연결, DNS 캐시, TUN의 트래픽 처리 범위를 확인하세요.
라우팅 규칙 자주 묻는 질문
domain 규칙을 추가했는데 왜 여전히 프록시를 사용하나요?
먼저 프로토콜과 경로를 제외한 도메인만 입력했는지 확인하세요. 그런 다음 규칙을 일반 규칙보다 앞에 두고 현재 설정이 활성화됐는지 확인합니다. 로그에 대상 IP만 표시된다면 앱이 코어에 들어오기 전에 도메인을 조회했는지, 현재 인바운드가 대상 도메인 정보를 제공할 수 있는지 확인하세요.
geosite:cn과 geoip:cn을 모두 추가해야 하나요?
문법상 필수는 아니지만 두 분류가 적용되는 대상은 다릅니다. geosite:cn은 알려진 도메인에, geoip:cn은 대상 IP나 조회된 주소에 적합합니다. 두 범위를 모두 적용하려면 규칙을 나눠 추가하고 domainStrategy도 확인하세요. 분류 이름을 추가하는 것만으로 IP 조회까지 이루어진다고 생각하면 안 됩니다.
구독을 업데이트하면 사용자 지정 직접 연결 규칙이 사라지나요?
노드 구독과 클라이언트 라우팅 설정은 대개 별도로 관리됩니다. 다만 전체 설정 가져오기, 설정 복원, 라우팅 설정 덮어쓰기로 규칙이 바뀔 수 있습니다. 사용자 지정 설정을 먼저 백업하고 실행 중 생성되는 임시 설정 파일은 직접 수정하지 마세요.
Android에서 데스크톱 규칙을 그대로 복사해도 되나요?
도메인, CIDR, 규칙 우선순위의 구성 원칙은 재사용할 수 있지만 데스크톱 설정 파일 전체를 그대로 복사하면 안 됩니다. v2rayNG와 v2flyNG의 리소스 파일, 출구 태그, 사용자 지정 규칙 메뉴를 각각 확인하세요. 저장 후 연결을 다시 설정하고 로그에서 실제 출구를 확인합니다.