V2Ray 라우팅 규칙 설정법: geosite·geoip로 중국 본토와 해외 트래픽 분리

실제 routing 설정으로 중국 본토 사이트는 직접 연결하고 해외 사이트는 프록시를 이용하는 방법을 설명합니다. domainStrategy 선택 기준과 규칙 적용 순서도 살펴봅니다.

이 글 미리보기

노드 연결에 성공했고 트래픽 분리 규칙을 조정하려는 사용자를 위한 안내입니다. 도메인 목록과 IP 주소 목록의 차이를 살펴본 뒤 중국 본토 사이트·로컬 네트워크는 직접 연결하고 나머지는 기본적으로 프록시를 사용하도록 설정합니다. IPIfNonMatch의 도메인 해석 조건, 첫 번째 아웃바운드의 기본 경로 역할, 클라이언트 로그로 실제 출구를 확인하는 방법을 중점적으로 설명합니다. 페이지가 열린다는 사실만으로 라우팅이 올바르다고 판단하지 마세요.

1. geosite와 geoip는 무엇을 매칭할까?

geosite는 도메인 분류 데이터이고 geoip는 IP 주소 범위 데이터입니다. 두 데이터는 사이트 운영 주체를 자동으로 판별하는 서비스가 아니며, 사이트 정보를 실시간으로 조회하지도 않습니다. 라우팅 결과는 로컬 데이터 파일, 커널에 전달된 요청의 대상 정보, 규칙 순서에 따라 달라집니다.

규칙매칭 대상적용 범위
geosite:cn데이터에 등록된 cn 분류 도메인커널이 도메인을 전달받아야 매칭됩니다. 중국어를 사용하는 모든 사이트를 뜻하지는 않습니다.
geoip:cn데이터에 등록된 중국 본토 IP 대역대상 IP를 기준으로 하며, 사이트가 어느 회사 소유인지는 알 수 없습니다.
geoip:private사설·예약 등 특수 용도 주소 모음주로 로컬 네트워크 직접 연결에 사용합니다. 구체적인 범위는 사용하는 데이터 파일에 따라 다릅니다.
domain:example.com지정 도메인과 그 하위 도메인분류 태그와 관계없이 특정 사이트를 수동으로 추가할 때 사용합니다.
full:example.com정확히 일치하는 도메인www.example.com은 함께 매칭되지 않습니다.

사이트가 여러 지역에 분산된 CDN을 사용할 수 있습니다. 같은 도메인도 네트워크에 따라 다른 주소로 해석될 수 있으므로, ‘도메인이 cn에 매칭됨’과 ‘해석된 주소가 cn에 매칭됨’은 서로 다른 판단입니다. 브라우저가 먼저 도메인을 해석해 IP만 프록시에 전달하면 도메인 규칙이 직접 매칭되지 않을 수도 있습니다. 스니핑으로 일부 프로토콜의 도메인 정보를 보완할 수 있지만 모든 요청에서 도메인을 복원할 수 있는 것은 아닙니다.

2. routing 설정 예시와 기본 출구

아래는 완전한 routing 객체 예시이며, 노드에 바로 연결할 수 있는 전체 설정이 아닙니다. 기존 V2Ray 또는 Xray 설정에 합치기 전에 아웃바운드 태그를 확인하세요. 여기서는 direct가 freedom 프로토콜을 사용하는 직접 연결 아웃바운드이고, proxy는 연결 테스트를 마친 프록시 아웃바운드라고 가정합니다. 태그는 이름일 뿐 출구를 자동으로 만들지 않습니다.

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "domain": [
          "full:localhost",
          "geosite:cn"
        ],
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": [
          "geoip:private",
          "geoip:cn"
        ],
        "outboundTag": "direct"
      }
    ]
  }
}

이 설정을 사용하려면 기존 설정의 outbounds 첫 번째 항목이 프록시 아웃바운드여야 합니다. 이처럼 일반적인 라우팅 설정에서 규칙에 매칭되지 않은 트래픽은 첫 번째 아웃바운드를 사용합니다. proxy라는 태그 이름이 기본 출구를 자동으로 정하는 것은 아닙니다. 첫 번째 항목이 실제로 직접 연결이면 매칭되지 않은 해외 사이트도 직접 연결됩니다. 순서를 맞추겠다고 서버 정보가 없는 프록시 아웃바운드를 복사해 추가하지 마세요.

여기서 ‘해외 사이트는 프록시 이용’은 위의 직접 연결 규칙에 해당하지 않는 트래픽이 기본적으로 프록시를 사용한다는 뜻입니다. 국가 소속을 실시간으로 완벽하게 판별한다는 의미는 아닙니다. 특정 도메인의 출구를 확실히 지정해야 한다면 IP 주소의 지역 정보가 항상 요구 사항에 맞을 것이라고 기대하지 말고 명시적인 도메인 규칙을 추가하세요.

요점: 기본 출구를 먼저 확인한 뒤 분류를 조정하세요

규칙을 저장하기 전에 생성된 설정에서 outbounds[0]의 실제 프로토콜과 태그를 확인하세요. 기본 출구를 확인한 다음 도메인 예외 규칙 하나로 순서를 검증하면 됩니다. 그렇지 않으면 분류 목록을 아무리 세밀하게 조정해도 매칭되지 않은 트래픽이 잘못된 출구로 전달될 수 있습니다.

3. domainStrategy 선택과 기본 경로 설정 시 주의점

routing.domainStrategy는 라우팅 단계에서 IP 규칙을 매칭하기 위해 도메인을 해석할지 결정합니다. DNS 서버 선택이나 아웃바운드 연결 단계의 주소 선택 정책과는 다릅니다. 같은 이름의 설정이 여러 구성 계층에 등장하면 먼저 어느 객체에 속하는지 확인하세요.

IPIfNonMatch

권장

먼저 이미 제공된 대상 정보로 규칙을 매칭하고, 어떤 규칙에도 해당하지 않을 때 도메인을 해석해 다시 매칭합니다. 이 문서의 예시는 이 전략과 첫 번째 아웃바운드 기본 경로를 사용하며, 모든 트래픽을 대상으로 하는 마지막 규칙은 추가하지 않습니다.

적합한 경우: 도메인 분류를 우선하면서 중국 본토 IP를 직접 연결 대상으로 보완하려는 설정

AsIs

라우팅 단계에서 도메인의 IP를 추가로 해석하지 않습니다. 대상 IP가 이미 있으면 IP 규칙에 매칭할 수 있지만 도메인으로만 전달된 요청은 geoip 분류 정보를 얻지 못합니다. 연결 단계에서는 도메인 해석이 필요할 수 있습니다.

적합한 경우: 도메인 규칙을 주로 사용하며 라우팅 단계의 추가 DNS 조회를 줄이려는 설정

IPOnDemand

매칭 과정에서 IP 규칙을 확인해야 하면 도메인 해석이 시작될 수 있습니다. IP 규칙을 앞쪽에 둘수록 조회가 일찍 발생할 가능성이 커집니다. 모든 요청이 반드시 먼저 해석된다고 단정할 수는 없습니다.

적합한 경우: 규칙 처리 과정에서 IP 판단을 일찍 수행해야 하며 이에 따른 조회 비용을 감수할 수 있는 설정

흔한 실수는 IPIfNonMatch를 사용하면서 끝에 network: "tcp,udp" 프록시 규칙을 추가하는 것입니다. 이 규칙은 첫 번째 매칭 단계에서 요청을 바로 처리할 수 있어 ‘어떤 규칙에도 매칭되지 않음’이라는 조건을 없애버립니다. 그 결과 도메인이 geosite:cn에 없으면 geoip:cn에 매칭될 기회 없이 바로 프록시를 사용할 수 있습니다.

라우팅 단계의 주소 해석에는 개인정보 보호와 연결성 측면의 비용도 따릅니다. 어떤 도메인을 어느 DNS 서버로 보낼지는 전체 dns 설정, 조회 트래픽의 경로, 브라우저 자체의 이름 해석 방식까지 함께 살펴봐야 합니다. domainStrategy 값을 바꾸는 것만으로 DNS 조회가 프록시를 사용한다고 보장할 수 없으며, DNS 오염도 해결되지 않습니다.

4. 규칙 순서: 예외를 먼저, 분류 규칙은 그다음

규칙은 한 번의 매칭 과정에서 위에서 아래로 확인하며, 처음 매칭된 규칙이 출구를 결정합니다. 하나의 규칙 객체에 domain과 ip 등 여러 조건이 있으면 모든 조건을 충족해야 합니다. 같은 domain 배열 안의 항목은 하나만 일치해도 됩니다. 도메인 또는 IP 중 하나만 매칭되어도 직접 연결하려면 이 문서처럼 규칙을 둘로 나누세요.

예를 들어 사이트가 cn 분류에 포함되어 있지만 테스트 결과 프록시를 고정 출구로 사용해야 한다면 아래 객체를 rules 배열의 맨 앞에 넣으세요. example.com은 문법 설명용 예약 도메인입니다. 실제로는 테스트할 도메인으로 바꾸세요.

{
  "type": "field",
  "domain": [
    "domain:example.com"
  ],
  "outboundTag": "proxy"
}

‘사설 IP 규칙은 항상 맨 처음에 둬야 한다’는 원칙이 모든 상황에 적용되는 것은 아닙니다. 도메인 예외를 해석된 주소보다 우선 적용하려면 그에 맞는 순서를 유지해야 합니다. 모든 사설 주소를 직접 연결하려는 경우에는 도메인 예외와 DNS 응답, 해석 전략의 관계도 고려해야 합니다. 기업 내부망에서는 기존 주소 할당 계획을 먼저 확인하세요. 공용 네트워크용 예시를 기존 정책에 그대로 적용하면 안 됩니다.

5. 클라이언트에 적용하고 실제 설정 확인하기

v2rayN은 데스크톱 클라이언트이며, v2rayNG는 Xray 커널을, v2flyNG는 v2fly 커널을 사용합니다. 클라이언트 인터페이스는 설정을 생성하거나 불러오는 역할을 하고, 규칙은 선택한 커널이 실제로 실행합니다. 사용자 지정 전체 설정과 일반 노드 모드의 설정 위치 및 적용 범위는 다릅니다. 두 설정을 동시에 수정하고 어느 쪽이 적용됐는지 추측하지 마세요.

  1. 현재 설정 백업

    현재 활성화된 노드, 라우팅 프로필, 로컬 수신 포트를 기록하고 기존 사용자 지정 설정도 저장하세요. 라우팅을 바꾸기 전 노드 연결이 되는지 확인한 뒤 트래픽 분리 설정을 조정합니다.

  2. 라우팅 설정 열기

    v2rayN에서는 보통 ‘설정’ → ‘라우팅 설정’으로 이동합니다. v2rayNG에서는 사이드 메뉴 → ‘라우팅 설정’을 선택합니다. 버전에 따라 메뉴 이름이 다를 수 있으므로 현재 화면을 기준으로 확인하세요. 기존 규칙을 먼저 살펴보고 전체 프로필을 바로 삭제하지 마세요.

  3. 설정 방식 선택

    인터페이스의 규칙 편집기를 사용한다면 도메인, IP, 대상 출구를 각각 입력하고 순서를 확인하세요. 전체 사용자 지정 설정을 사용할 때만 이 문서의 routing 객체를 합치면 됩니다. JSON 객체 전체를 도메인 목록 전용 입력란에 붙여 넣지 마세요.

  4. 실제 태그 확인

    생성하거나 불러온 설정에 direct와 proxy가 모두 있는지, 첫 번째 아웃바운드는 무엇인지 확인하세요. 인터페이스의 ‘직접 연결’이나 ‘프록시’ 옵션은 다른 태그에 연결될 수 있으므로 실제 설정에 적힌 이름을 확인해야 합니다.

  5. 다시 시작하고 로그 확인

    라우팅 프로필을 저장하고 활성화한 뒤 연결을 중지했다가 다시 시작하세요. 실행 로그에서 규칙 파싱, 리소스 파일, 아웃바운드 태그 오류가 있는지 확인합니다. 편집 창에서 저장만 해서는 실행 중인 커널에 설정이 다시 로드되지 않을 수 있습니다.

커널 동작을 비교하려면 클라이언트 버전만 기록하지 말고 사용한 커널과 버전도 각각 기록하세요. v2rayNG와 v2flyNG는 같은 커널을 사용하는 서로 다른 인터페이스가 아닙니다. 사용자 지정 설정의 확장 필드와 리소스 로드 방식도 각각 확인해야 합니다. 기본 필드에 대한 자세한 내용은 사이트의 JSON 설명서를 참고하세요.

6. 요청과 로그로 라우팅 결과 확인하기

테스트에서는 먼저 요청이 커널에 전달됐는지 확인하고, 그다음 예상한 출구를 사용했는지 확인해야 합니다. 브라우저 확장 프로그램, 시스템 프록시 우회 목록, 터미널 환경 변수에 따라 진입 경로가 달라질 수 있습니다. 아래 예시는 로컬에서 127.0.0.1:10808 SOCKS 수신이 활성화되어 있다고 가정합니다. 10808은 테스트용 포트일 뿐 모든 설치의 기본값은 아니므로 실행 전에 현재 수신 포트로 바꾸세요.

curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://www.baidu.com/
curl --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

socks5h를 사용하면 curl이 도메인을 프록시 쪽으로 전달하므로 도메인 규칙을 관찰하는 데 적합합니다. 그렇다고 DNS 조회가 반드시 원격 프록시를 통과한다는 뜻은 아닙니다. 첫 번째 요청은 cn 도메인 분류를, 두 번째 요청은 직접 연결 분류에 해당하지 않는 트래픽의 기본 경로를 확인합니다. HTTP 응답이 성공했다는 사실은 연결이 완료됐다는 뜻일 뿐입니다. 실제 출구는 접속 로그의 대상 주소와 아웃바운드 태그로 확인하세요.

테스트 항목예상 결과이상이 있을 때 먼저 확인할 항목
데이터에서 cn으로 분류된 도메인로그에서 직접 연결 출구 선택 확인geosite 데이터, 도메인 전달 여부, 앞선 규칙
실제로 사용 중인 로컬 네트워크 주소로그에서 직접 연결 출구 선택 확인private 데이터, IP 규칙, 내부망 연결 상태
직접 연결 범위에 속하지 않는 도메인로그에서 프록시 출구 선택 확인첫 번째 아웃바운드, 추가 규칙, 해석된 주소
수동으로 프록시를 지정한 예외 도메인예외 규칙이 먼저 매칭되는지 확인예외 규칙 위치, domain과 full의 차이

로컬 네트워크 주소를 테스트할 때는 관리 주소가 192.168.1.1인 라우터처럼 실제 네트워크에 연결된 장비를 사용하세요. 이 주소는 예시일 뿐입니다. 장비에서 웹 서비스를 제공하지 않는다면 연결 실패만으로 라우팅 규칙에 문제가 있다고 볼 수 없습니다. 로그로 선택된 아웃바운드를 확인한 다음, 대상 서비스가 응답하는지는 별도로 점검하세요.

geoip:cn을 추가했는데 일부 중국 본토 사이트가 계속 프록시를 사용하는 이유는 무엇인가요?

요청의 대상이 도메인인지 IP인지 확인한 뒤 domainStrategy를 살펴보세요. AsIs를 사용하면 IP 규칙을 위해 도메인을 추가로 해석하지 않습니다. IPIfNonMatch를 사용한다면 끝에 모든 요청을 매칭하는 규칙이 있어 요청을 먼저 처리하지 않는지 확인하세요. 마지막으로 실제 해석된 주소가 사용하는 cn 데이터에 포함되어 있는지 확인합니다.

중국 본토 도메인이 해외 주소로 연결되는 이유는 무엇인가요?

도메인 분류는 서버 주소가 위치한 지역을 보장하지 않습니다. geosite:cn에 매칭되어 직접 연결되면 뒤에 있는 geoip 규칙은 출구를 바꾸지 않습니다. IP 기준으로 결정해야 한다면 전략과 규칙 순서를 명확히 조정하고 CDN의 해석 결과를 다시 테스트하세요.

규칙을 저장했는데 로그에는 이전 출구가 표시되는 이유는 무엇인가요?

방금 수정한 라우팅 프로필이 활성화되어 있는지 확인한 뒤 커널을 중지하고 다시 시작하세요. 사용자 지정 전체 설정에서는 일반 노드 모드의 라우팅 편집 결과를 사용하지 않을 수 있습니다. 편집 창만 보지 말고 이번 실행에서 실제로 불러온 설정을 확인하세요.

모든 요청이 직접 연결된다면 무엇부터 바꿔야 하나요?

먼저 outbounds의 첫 번째 항목이 직접 연결인지, 앞쪽에 모든 요청을 매칭하는 규칙이 있는지 확인하세요. 그런 다음 앞서 안내한 SOCKS 포트 지정 curl 명령으로 트래픽이 커널에 전달되는지 확인합니다. 관련 접속 로그가 없다면 규칙 목록을 늘리기 전에 요청 진입 경로부터 점검하세요.

v2rayN / v2rayNG 다운로드