V2Ray 라우팅 규칙 설정: geosite·geoip 분기 구성 가이드

V2Ray의 domain·IP·geosite·geoip 규칙 우선순위와 중국 본토 직결·해외 프록시 설정법, 규칙 충돌 해결 방법을 알아봅니다.

이 글 미리보기

이 글은 노드를 통해 인터넷에 접속할 수 있고 트래픽 분기를 설정하려는 사용자를 대상으로 합니다. 도메인 규칙과 IP 규칙의 차이를 살펴본 뒤, ‘명시적 예외 우선·중국 본토 직결·나머지는 프록시’ 구성을 예제로 설정합니다. 마지막으로 DNS, 클라이언트가 생성한 설정, 연결 로그를 활용해 잘못된 분기를 진단합니다. 예제는 V2Fly와 Xray에서 흔히 쓰는 JSON 라우팅 구조를 기준으로 하며, 클라이언트 설정 전체를 대체하는 파일은 아닙니다.

1. 요청이 코어에 전달되는지 확인

라우팅 규칙은 코어에 전달된 연결에만 적용됩니다. v2rayN은 데스크톱 클라이언트, v2rayNG는 Xray 코어를 사용하는 안드로이드 클라이언트, v2flyNG는 V2Fly 코어를 사용하는 클라이언트입니다. 그래픽 인터페이스에서 설정을 관리하더라도 실제 규칙 매칭은 현재 실행 중인 코어가 처리합니다. VMess와 VLESS는 프록시 프로토콜이며, 프로토콜을 바꾼다고 규칙 순서 오류가 자동으로 해결되지는 않습니다.

앱 요청 인바운드 수신 대상 식별 라우팅 규칙 매칭 아웃바운드 연결

시스템 프록시는 시스템 프록시 설정을 따르는 앱에만 적용되는 경우가 많습니다. 앱이 자체적으로 직접 연결하면 코어 로그에 해당 연결이 표시되지 않습니다. 안드로이드 VPN 모드에서는 앱별 우회가 설정되어 있을 수도 있습니다. geosite 분류를 추가하기 전에 대상 앱의 연결이 의도한 인바운드로 들어오는지 먼저 확인하세요.

10808
이 글의 테스트용 SOCKS 포트
53
기본 DNS에서 자주 사용하는 포트
443
HTTPS에서 자주 사용하는 대상 포트

10808은 이 글의 테스트를 위한 예시일 뿐, 모든 버전의 기본값은 아닙니다. 클라이언트의 현재 인바운드 설정에서 수신 주소와 포트, SOCKS 활성화 여부를 확인하세요. 포트는 로컬 진입점에 해당하며 443은 보통 원격 웹사이트의 포트이므로 혼동하지 마세요. DNS도 암호화된 전송을 사용할 수 있으므로 모든 조회 요청이 UDP 53을 사용한다고 볼 수는 없습니다.

2. domain·ip와 데이터셋의 매칭 대상

domain과 ip는 라우팅 규칙의 필드이고, geosite:와 geoip:는 해당 필드에서 데이터셋을 참조하는 표기법입니다. geosite는 도메인이 속한 국가를 실시간으로 조회하지 않으며, geoip도 웹사이트의 사업 지역을 판별하지 않습니다. 클라이언트나 코어와 함께 배포된 데이터 파일을 기준으로 매칭하므로 데이터 출처와 업데이트 시점에 따라 결과가 달라집니다.

규칙 표기매칭 대상적용 범위
full:example.com도메인 전체 일치해당 도메인만 매칭하며 하위 도메인은 포함하지 않음
domain:example.com도메인 및 하위 도메인example.com과 www.example.com 포함
geosite:cn데이터셋에 등록된 도메인 분류중국 본토의 모든 서비스 도메인이 포함되는 것은 아님
192.168.0.0/16IPv4 주소 범위매칭할 대상 IP가 있어야 함
geoip:cn데이터셋에 등록된 주소 범위접속자의 실제 위치를 확인하는 근거가 아님

도메인 매칭 범위를 명확히 지정하려면 full: 또는 domain:을 우선 사용하세요. 접두사 없는 일반 문자열은 보통 부분 문자열로 처리되어 이름이 비슷하지만 관련 없는 도메인까지 매칭할 수 있습니다. 분류 이름이 실제 설치된 데이터 파일에 있는지도 확인해야 합니다. 다른 곳에서 분류 이름을 복사했다고 해서 로컬 데이터 파일에서도 지원되는 것은 아닙니다.

판단 기준: 서비스 예외는 도메인, 주소 범위는 IP

특정 사이트의 출구를 고정하려면 명확한 도메인 규칙을 먼저 작성하세요. 로컬 네트워크에 접속해야 한다면 주소 범위 규칙을 설정하면 됩니다. CDN의 특정 IP 하나를 전체 서비스 도메인 대신 사용하지 마세요.

3. 규칙은 구체성이 아니라 순서대로 매칭

일반적인 field 규칙은 위에서 아래로 확인하며, 조건에 처음 맞는 규칙이 출구를 결정합니다. 아래쪽 규칙이 더 구체적이라는 이유로 코어가 위쪽의 포괄적인 규칙을 자동으로 덮어쓰지는 않습니다. 따라서 수동 예외를 분류 규칙보다 앞에 두고, 분류 규칙은 기본 동작보다 앞에 배치해야 합니다.

  1. 명시적 예외를 먼저 배치: 직결 분류에도 포함되지만 프록시로 보내야 하는 테스트 도메인 등이 해당합니다.
  2. 그다음 로컬 및 분류 규칙 배치: 사설 IP, 중국 본토 도메인, 중국 본토 주소 범위 등이 해당합니다.
  3. 마지막으로 기본 출구 지정: 어떤 규칙에도 매칭되지 않은 요청에 적용할 기본 경로를 설정합니다.

한 규칙의 domain 배열에 항목이 여러 개 있으면 그중 하나만 매칭되어도 조건을 충족합니다. 하지만 서로 다른 조건 필드를 한 규칙에 넣으면 일반적으로 모든 조건을 동시에 만족해야 합니다. 예를 들어 domain과 port를 함께 지정하면 도메인과 포트 조건을 모두 충족해야 하며, 도메인 또는 포트 중 하나만 맞으면 되는 것이 아닙니다. 도메인 분류와 주소 분류를 각각 독립적인 직결 조건으로 사용하려면 규칙을 두 개로 나누세요.

4. 중국 본토 직결, 나머지는 프록시로 보내는 라우팅 예제

아래 예제는 routing 객체만 보여줍니다. 기존 설정에 태그가 direct인 직결 아웃바운드와 태그가 proxy인 프록시 아웃바운드가 있고, 매칭되지 않은 요청의 기본 아웃바운드로 proxy가 outbounds 배열의 첫 번째 항목에 있다고 가정합니다. 태그는 참조에 사용되므로 인터페이스에 ‘직결’이라고 표시되어 있다는 이유만으로 내부 태그도 direct라고 단정하면 안 됩니다.

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

example.com은 예외 규칙의 우선순위를 설명하기 위한 예시 도메인이며, 실제 서비스에 권장하는 도메인은 아닙니다. 이 설정은 지정한 도메인을 프록시로 보내고, 식별 가능한 사설 IP 대상은 직결하며, 중국 본토 도메인 또는 주소 분류에 해당하는 요청도 직결합니다. 나머지 요청은 첫 번째 프록시 아웃바운드를 사용합니다. 이는 선택 가능한 정책 중 하나이며 모든 네트워크 환경에 적용되는 정답은 아닙니다.

5. domainStrategy와 DNS의 관계

AsIs는 라우팅을 위해 도메인을 추가로 조회하지 않습니다. 인바운드에서 도메인을 전달받았다면 IP 규칙만으로는 매칭되지 않는 경우가 많습니다. IPIfNonMatch는 도메인 규칙에 매칭되지 않을 때 조회를 시도한 뒤 IP 규칙을 적용합니다. IPOnDemand는 매칭 과정에서 IP가 필요한 규칙을 만나면 조회를 시작할 수 있습니다. 조회 시점이 다르면 앞쪽 IP 규칙이 판정에 참여할 기회도 달라집니다.

전략라우팅 시 도메인 조회 시점설정 시 확인할 점
AsIs라우팅을 위한 추가 조회 없음주로 도메인 규칙이나 이미 전달된 대상 IP에 의존
IPIfNonMatch도메인 규칙에 매칭되지 않으면 조회 시도앞쪽의 포괄적인 도메인 규칙이 IP 규칙의 매칭 기회를 막을 수 있음
IPOnDemandIP가 필요한 조건을 매칭할 때앞쪽 IP 규칙과 조회 결과의 영향에 주의

위 예제에서는 도메인 규칙에 매칭되지 않은 요청만 조회 결과를 통해 geoip:cn에 매칭될 수 있습니다. rules 끝에 모든 도메인에 매칭되는 프록시 규칙을 추가하면 도메인 단계에서 이미 규칙이 적용되므로, IPIfNonMatch는 ‘아직 매칭되지 않은’ 요청에 대한 IP 대체 조회를 실행하지 않습니다. 이 대체 경로를 유지하려면 전체 매칭 규칙을 임의로 추가하는 대신 기본 아웃바운드를 사용하세요.

라우팅을 위한 조회 전략과 최종 아웃바운드에서 대상 주소를 조회하는 설정은 서로 다릅니다. 라우팅이 AsIs를 사용해도 직결 아웃바운드에서는 도메인 조회가 필요할 수 있습니다. DNS가 반환하는 CDN 주소의 지역, IPv4만 반환하는지 또는 IPv6도 함께 반환하는지에 따라 주소 분류 결과가 달라질 수 있습니다. 웹페이지가 열리는지만 확인하지 말고 도메인, 조회 결과, 아웃바운드 태그를 각각 기록하세요.

작업 순서: 도메인 규칙을 확인한 뒤 IP 대체 매칭 검증

먼저 명확한 도메인 규칙으로 출구 태그가 올바른지 확인한 다음, 임시 규칙을 제거하고 IP 대체 매칭을 테스트하세요. 한 번에 조건을 하나씩만 바꿔야 도메인 분류 누락, DNS 결과 변화, 규칙 순서 문제를 구분할 수 있습니다.

6. 일정한 테스트 절차로 규칙 충돌 진단

v2rayN에서는 먼저 ‘설정’ → ‘라우팅 설정’으로 이동해 활성화된 규칙 세트를 확인하세요. 버전에 따라 메뉴 이름이 다를 수 있으므로 실제 인터페이스를 기준으로 확인해야 합니다. v2rayNG와 v2flyNG는 각각 자체 라우팅 설정과 현재 실행 중인 설정을 확인하세요. 다른 클라이언트의 메뉴 이름을 그대로 적용해서는 안 됩니다. 코어 간에 설정을 복사할 때는 필드와 데이터 파일 형식이 호환되는지도 확인하세요.

  1. 기준 상태 기록: 현재 코어 이름, 라우팅 모드, 규칙 순서, 로컬 수신 포트를 저장하세요. 먼저 프록시 노드가 연결되는지 확인합니다.
  2. 인바운드 확인: 데스크톱에서는 아래 명령어를 사용해 로컬 SOCKS 진입점을 명시하고 도메인 처리를 프록시에 맡길 수 있습니다. 포트는 실제 설정값으로 바꾸세요.
  3. 출구 확인: 클라이언트의 연결 로그나 액세스 로그에서 테스트 도메인, 대상 IP, 아웃바운드 태그를 찾으세요. 로그 형식은 코어 버전에 따라 다릅니다.
  4. 규칙 분리 테스트: 테스트 도메인의 full 규칙을 임시로 맨 위에 두고 direct와 proxy를 각각 지정하세요. 설정에 따라 출구가 바뀐다면 라우팅 진입점과 태그는 대체로 정상입니다.
  5. 분류 규칙 복원: 임시 규칙을 삭제한 뒤 중국 본토 서비스 도메인, 다른 도메인, 로컬 주소를 각각 테스트해 분류와 기본 동작을 확인하세요.
curl --socks5-hostname 127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

여기서 10초는 연결 단계의 시간 초과, 20초는 명령 전체의 제한 시간이며 성능 측정 결과가 아닙니다. --socks5-hostname을 사용하는 테스트는 로컬에서 먼저 조회한 뒤 IP를 전달하는 방식과 다르므로 도메인 규칙 검증에 적합합니다. HTTP 요청 테스트에 성공해도 해당 경로만 정상이라는 뜻이며, UDP나 모든 앱, TUN 모드까지 올바르게 설정되었다고 볼 수는 없습니다.

7. geosite·geoip 분기 설정 FAQ

geosite:cn을 추가했는데 중국 본토 웹사이트가 계속 프록시로 연결되는 이유는 무엇인가요?

실제 연결에 사용된 도메인을 먼저 확인하세요. 웹페이지에서 다른 리소스 도메인을 사용할 수 있습니다. 이어서 분류 데이터에 해당 도메인이 포함되어 있는지, 현재 모드에서 이 규칙 세트가 활성화되어 있는지 확인하세요. 해당 도메인을 full 규칙으로 맨 위에 추가해 테스트할 수 있습니다. 계속 직결할 필요가 확인되면 적절한 범위의 domain 규칙으로 변경하세요.

geoip:cn이 계속 매칭되지 않는 이유는 무엇인가요?

인바운드가 도메인을 전달하는지 IP를 전달하는지 확인하세요. AsIs를 사용하고 도메인만 전달되면 IP 조건을 매칭할 기준이 없습니다. IPIfNonMatch를 사용한다면 앞쪽 도메인 규칙이나 전체 매칭 규칙이 판정을 먼저 끝내는지 확인하세요. 그런 다음 실제 조회된 주소가 해당 주소 데이터셋에 포함되는지 확인합니다.

구독을 업데이트하면 사용자 지정 트래픽 분기도 바뀌나요?

구독 업데이트는 보통 노드 목록을 갱신하며, 라우팅 규칙과 지역 데이터는 별도의 메뉴에서 관리되는 경우가 많습니다. 다만 실제 동작은 클라이언트와 구독 형식에 따라 다릅니다. 업데이트 후에는 현재 노드, 활성 라우팅 세트, 생성된 설정을 확인하세요. 수동 규칙을 유지해야 한다면 구독 주소만 저장하지 말고 먼저 백업을 내보내세요.

스니핑을 활성화하면 모든 IP 연결을 도메인 기준으로 분기할 수 있나요?

그렇게 기대할 수는 없습니다. 스니핑은 지원되는 트래픽에서 식별 가능한 도메인 정보를 추출할 뿐이며, 결과는 프로토콜과 코어 설정에 따라 달라집니다. 도메인 전달을 지원하는 프록시 진입점을 통해 앱을 연결하는 것이 우선입니다. 스니핑이 꼭 필요하다면 대상 범위와 ‘라우팅에만 사용’ 등의 옵션을 현재 버전에서 지원하는지 확인하세요.

안정적인 트래픽 분기는 규칙 개수가 아니라 각 규칙의 적용 범위가 명확하고 로그를 통해 결과를 설명할 수 있는지에 달려 있습니다. 소수의 예외 규칙과 분류 규칙, 기본 출구부터 유지하고 실제로 잘못 분기되는 사례에 따라 하나씩 수정하세요. 겹치는 규칙을 한꺼번에 대량으로 가져오는 것보다 원인을 추적하기 쉽습니다. 클라이언트와 코어의 역할은 프로토콜 가이드와 용어 빠른 참조에서 더 자세히 확인할 수 있습니다.

클라이언트 다운로드 및 설치플랫폼에 맞는 v2rayN / v2rayNG 선택