· 네트워크 · 약 10분

V2Ray DNS 분할 설정 가이드: 중국·해외 도메인별 DNS 및 DNS 오염 방지

dns의 servers, domains, expectIPs 항목을 설명하고 중국 도메인은 로컬 DNS, 해외 도메인은 원격 DNS로 조회하는 설정 예시와 DNS 오염 방지 방법을 안내합니다.

핵심 내용

이 글은 노드 연결을 마치고 DNS 분할 설정을 조정하려는 사용자를 위한 안내입니다. 먼저 도메인을 애플리케이션, 운영체제, 코어 중 어디에서 조회하는지 확인한 다음, 중국 도메인 우선 규칙과 원격 DoH 설정으로 조회 경로를 나누고 로그에서 결과를 검증합니다. 예시는 기존 설정에 병합해야 하는 설정 조각입니다. 시스템 DNS를 자동으로 가로채지 않으며, 사용 가능한 프록시 아웃바운드를 대신할 수도 없습니다.

1. DNS 분할과 연결 분할의 차이

DNS 분할은 도메인을 어느 DNS 서버에 조회할지 정하고, 연결 분할은 웹사이트 연결에 어떤 아웃바운드를 사용할지 정합니다. 두 설정은 연관되어 있지만 같은 규칙은 아닙니다. 중국 웹사이트를 직접 연결하도록 설정해도 반드시 중국 DNS를 사용하는 것은 아닙니다. DNS 주소를 프록시로 보내도록 설정해도 웹사이트 연결까지 자동으로 프록시를 통하는 것은 아닙니다.

도메인이 코어에 전달됨 조회 규칙과 대조 DNS 서버에 조회 주소 결과 필터링 연결 아웃바운드 선택

이 흐름은 코어가 도메인을 조회하는 일반적인 과정을 설명하며, 모든 요청이 매번 모든 단계를 거친다는 뜻은 아닙니다. 브라우저가 자체 보안 DNS로 IP 주소를 먼저 조회한 뒤 해당 IP를 프록시에 전달하면, 코어는 원래 DNS 요청을 받지 못할 수 있습니다. 반대로 애플리케이션이 도메인을 SOCKS 프록시에 전달하면, 프록시 서버가 도메인을 받아 직접 조회할 수도 있습니다.

2. servers, domains, expectIPs의 역할

dns.servers는 DNS 서버 목록입니다. 목록 항목은 단순한 주소일 수도 있고 도메인 조건이 포함된 객체일 수도 있습니다. 객체의 domains는 조건에 맞는 도메인에 해당 서버를 우선 사용하도록 하고, expectIPs는 반환된 주소가 예상 범위에 속하는지 검사합니다. 후자는 연결 라우팅 규칙도 아니고 DNS 응답의 신뢰성을 보장하는 기능도 아닙니다.

항목이 글의 설정값실제 역할
servers중국 내 UDP DNS 및 원격 DoH코어에서 사용할 수 있는 DNS 서버를 지정합니다.
address223.5.5.5이 예시에서는 일반 IP 주소를 UDP DNS 조회에 사용합니다.
domainsgeosite:cn도메인 목록과 일치하면 해당 서버를 우선 사용합니다. 이에 맞는 도메인 데이터 파일이 있어야 합니다.
expectIPsgeoip:cn주소 목록을 기준으로 결과를 필터링합니다. 조건에 맞지 않으면 해당 결과가 거부되고 다음 서버를 시도할 수 있습니다.
skipFallbacktrue일반적인 대체 조회에는 사용되지 않지만, 해당 서버의 도메인 규칙이 일치하면 선택될 수 있습니다.
queryStrategyUseIPv4이 예시에서는 IPv4 주소만 조회해 IPv6 경로 변수를 먼저 배제합니다.

geosite:cn은 데이터셋에 정의된 도메인 분류이며, .cn으로 끝나는 모든 도메인을 뜻하지는 않습니다. geoip:cn의 결과도 사용하는 IP 주소 데이터베이스에 따라 달라집니다. 지역별 CDN, 기업 전용망, 주소 데이터베이스의 업데이트 시점도 판단에 영향을 줄 수 있습니다. 따라서 중국 도메인이 해외 IP를 반환했다는 이유만으로 DNS 오염이라고 단정할 수는 없습니다.

정리: 분류 결과를 먼저 확인한 뒤 주소 필터를 조정하세요

중국 웹사이트가 expectIPs를 추가한 뒤 조회되지 않는다면, 우선 제한을 잠시 제거하고 반환 주소를 비교하세요. 정상적인 CDN 연결 분산으로 확인되면 해당 도메인만 별도 DNS 서버를 사용하도록 설정하세요. 분류 문제를 가리기 위해 노드만 계속 바꾸지 마세요.

3. 중국 도메인 우선 조회 및 원격 DoH 설정 예시

아래 예시는 중국 도메인에는 중국 DNS를 우선 사용하고, 나머지는 원격 DoH로 조회하는 기본 구성입니다. 첫 번째 항목은 공개된 중국 DNS 서버이며 가정용 라우터 주소가 아닙니다. 통신사 내부 도메인을 조회해야 한다면 실제 내부 DNS 서버를 별도로 지정하세요. 두 번째 항목은 IP 주소 형식의 DoH 주소를 사용해 DoH 서버 이름을 따로 조회하는 과정을 피합니다.

{
  "dns": {
    "queryStrategy": "UseIPv4",
    "servers": [
      {
        "address": "223.5.5.5",
        "port": 53,
        "domains": [
          "geosite:cn"
        ],
        "expectIPs": [
          "geoip:cn"
        ],
        "skipFallback": true
      },
      "https://1.1.1.1/dns-query"
    ]
  }
}

이 설정은 완전한 config.json 파일이 아닙니다. dns 객체를 기존 최상위 설정에 병합해야 하며, 하나의 JSON 객체에 같은 키를 중복으로 추가하면 안 됩니다. DNS 설정이 이미 있다면 두 설정 조각을 이어 붙이지 말고 기존 항목을 수정하세요. JSON에는 설명용 주석을 직접 넣을 수도 없습니다.

  1. 이 항목들을 지원하는 V2Fly 또는 Xray 코어가 실행 중인지 확인하고, 현재 코어의 시작 로그도 확인하세요. 클라이언트 이름과 코어 버전은 서로 다른 정보입니다.
  2. 코어가 cn 분류를 포함한 도메인 및 IP 주소 데이터베이스를 읽을 수 있는지 확인하세요. 데이터가 누락됐다면 먼저 로드 오류를 해결해야 합니다.
  3. 기존 inbounds와 outbounds는 유지하고 DNS 설정을 병합한 뒤, 설정을 다시 불러와 오류 로그를 확인하세요.
  4. 먼저 확인된 도메인 몇 개로 테스트한 뒤 일치 범위를 점차 넓히세요. 네트워크에서 IPv6가 필요한 경우 듀얼 스택 연결을 확인한 다음 조회 방식을 조정하세요.

4. DNS 조회 연결에 올바른 아웃바운드 사용하기

DoH 주소를 설정하면 조회 프로토콜만 지정됩니다. 네트워크가 어느 경로로 나가는지는 정해지지 않습니다. 일반적인 https:// 형식의 내장 DoH 조회는 코어의 라우팅 설정을 따릅니다. 기본 아웃바운드가 직접 연결이면 원격 DoH 서버에도 직접 연결될 수 있습니다. 일반 라우팅을 우회하는 로컬 DNS 형식과 혼용하지 마세요. 암호화된 연결이라고 해서 반드시 프록시를 통하는 것은 아닙니다.

53
중국 DNS 예시의 UDP 대상 포트
443
DoH 예시의 HTTPS 대상 포트
10808
아래 테스트에서 가정하는 로컬 SOCKS 포트

아래 라우팅 예시는 direct와 proxy라는 아웃바운드 태그가 이미 설정되어 있다고 가정합니다. 실제 설정에 있는 tag 값으로 바꾸거나 해당 아웃바운드를 먼저 추가해야 합니다. 예시에서는 정확한 IP와 포트를 지정해 DNS 연결만 규칙에 포함하고, 해당 주소로 가는 모든 트래픽이 함께 묶이지 않도록 합니다.

{
  "routing": {
    "domainStrategy": "IPIfNonMatch",
    "rules": [
      {
        "type": "field",
        "ip": ["223.5.5.5"],
        "port": "53",
        "network": "udp",
        "outboundTag": "direct"
      },
      {
        "type": "field",
        "ip": ["1.1.1.1"],
        "port": "443",
        "network": "tcp",
        "outboundTag": "proxy"
      }
    ]
  }
}

두 규칙을 기존 routing.rules에 병합하고, 먼저 일치할 수 있는 포괄적인 규칙보다 앞에 배치하세요. 라우팅 규칙은 순서대로 확인하므로 앞선 규칙이 일치하면 뒤에 있는 DNS 전용 규칙은 적용되지 않습니다. 이 설정 조각은 DNS 서버 연결 경로만 지정하며 웹사이트 전체의 분할 라우팅을 설정하지는 않습니다.

5. v2rayN 및 Android 클라이언트에서 확인하기

v2rayN은 일반적인 노드 설정을 클라이언트에서 생성하는 경우가 많습니다. 실행 디렉터리에 있는 임시 설정을 직접 수정하면 노드를 바꾸거나 프로그램을 다시 시작할 때 변경 내용이 덮어써질 수 있습니다. 현재 버전에서 제공하는 DNS 설정 또는 사용자 지정 설정 메뉴를 이용해 저장한 뒤, 실제로 생성된 설정을 확인하세요. v2rayNG는 Xray 코어를, v2flyNG는 V2Fly 코어를 사용합니다. 클라이언트 자체의 원격 DNS, VPN, 라우팅 옵션을 기본 JSON 설정 항목과 동일하게 볼 수는 없습니다.

  1. 기준 상태 기록: 기존 설정을 저장하고 현재 노드, 로컬 수신 포트, 시스템 DNS, 브라우저 보안 DNS 상태를 기록하세요. DNS 설정은 한 번에 하나씩 변경합니다.
  2. 접속 경로 확인: 아래 명령은 로컬에 127.0.0.1:10808 SOCKS 인바운드가 있다고 가정합니다. 클라이언트에 다른 포트가 표시된다면 먼저 명령을 수정하세요. 이 포트가 모든 버전의 기본값이라고 가정하지 마세요.
  3. 조회 경로 비교: 애플리케이션이 로컬에서 도메인을 조회하는 요청과 도메인을 프록시에 전달하는 요청을 각각 테스트하세요. 두 결과가 다르면 DNS 조회가 어디서 이뤄지는지 더 확인해야 합니다.
  4. 로그 확인: log.loglevel을 잠시 info로 설정하고 요청 시간에 맞춰 DNS 및 아웃바운드 로그를 확인하세요. 코어마다 출력 세부 정보가 다릅니다. 필요한 경우 잠시 debug를 사용하고, 확인이 끝나면 원래 로그 수준으로 되돌리세요.
curl --socks5 127.0.0.1:10808 -I https://www.qq.com
curl --socks5-hostname 127.0.0.1:10808 -I https://www.qq.com
nslookup www.qq.com 223.5.5.5

첫 번째 명령은 보통 curl이 로컬에서 웹사이트 도메인을 조회합니다. 두 번째 명령은 도메인을 SOCKS 프록시에 전달하며 이후의 조회 위치는 코어 라우팅과 아웃바운드 설정에 따라 달라집니다. 따라서 두 번째 명령이 성공해도 로컬 내장 DNS를 사용했다고 단정할 수 없습니다. 세 번째 명령은 지정한 공개 DNS 서버에 직접 조회해 연결 상태를 비교할 뿐, dns.servers 설정이 적용됐다는 증거는 아닙니다. Windows PowerShell에서 명령 별칭이 다르게 동작한다면 curl.exe를 사용하세요.

정리: 웹사이트가 열리는지만 보지 말고 DNS 조회 경로를 확인하세요

설정을 변경한 뒤 관련 애플리케이션을 다시 시작하고, 해당 캐시가 갱신되거나 비워질 때까지 기다린 다음 테스트를 반복하세요. 로그에 예상한 DNS 기록이 없다면 먼저 요청이 코어에 전달됐는지 확인하세요. 웹사이트가 열리거나 지연 시간이 한 번 달라졌다는 이유만으로 DNS 분할이 완료됐다고 판단하지 마세요.

6. DNS 오염 방지 및 자주 발생하는 문제

DNS 오염을 방지하려면 조회 전송 방식, DNS 서버의 신뢰도, 조회 결과가 사용되는 위치, 대체 조회 정책을 확인해야 합니다. DoH는 클라이언트와 DoH 서버 사이의 전송을 보호할 수 있지만, 잘못된 도메인 분류나 프록시 연결 실패, 애플리케이션 자체 DNS까지 자동으로 해결하지는 않습니다. expectIPs는 반환 주소 범위를 제한할 뿐이며, 암호화된 전송을 대신하거나 모든 잘못된 응답을 판별할 수 없습니다.

expectIPs를 설정한 뒤 중국 웹사이트가 열리지 않으면 어떻게 하나요?

먼저 해당 DNS 서버의 expectIPs를 잠시 제거하고 설정을 다시 불러온 뒤 같은 도메인을 조회하세요. 정상적인 해외 CDN 주소가 반환된다면 해당 도메인의 DNS 정책을 조정하거나 주소 데이터베이스를 확인하세요. 모든 결과를 중국 내 주소로 강제 제한하지 마세요.

원격 DoH를 설정했는데도 로컬 DNS 요청이 보이는 이유는 무엇인가요?

먼저 요청을 보낸 프로세스를 확인하세요. 브라우저, 시스템 서비스, 프록시를 사용하지 않는 애플리케이션은 각각 별도로 DNS를 조회할 수 있습니다. 프록시 노드 도메인도 연결 전에 조회가 필요할 수 있습니다. 시스템 DNS, 브라우저 보안 DNS, 클라이언트의 DNS 가로채기 설정을 확인하세요. dns 항목만 수정해서는 해결되지 않을 수 있습니다.

웹페이지 로딩이 느린데 DNS 서버를 더 추가해야 하나요?

먼저 DNS 조회 대기 시간, TCP 연결 시간, TLS 핸드셰이크 시간을 구분하세요. 기준 설정으로 중국 DNS 서버 하나와 연결 가능한 원격 DoH 서버 하나를 사용하고, 시간 초과 및 대체 조회 로그를 확인하세요. 응답하지 않는 DNS 서버를 여러 개 추가하면 대기 시간이 늘거나 더 많은 서버로 조회가 분산될 수 있습니다.

JSON을 수정했는데 노드를 바꾸면 왜 원래대로 돌아오나요?

대개 클라이언트가 실행 설정을 다시 생성하기 때문입니다. 클라이언트에서 지원하는 DNS 설정 또는 사용자 지정 설정 메뉴로 돌아가 변경 사항을 저장하고, 노드를 바꾼 뒤 생성된 설정을 확인하세요. 구독은 노드 정보를 갱신하는 기능이며, 임시 설정에서 직접 수정한 내용을 자동으로 저장하지는 않습니다.

IPv4만 사용해도 계속 괜찮을까요?

UseIPv4는 우선 듀얼 스택 환경의 변수를 배제하는 데 유용하지만 IPv6 주소 조회는 사용하지 않습니다. 네트워크와 프록시 아웃바운드에서 IPv6 연결이 안정적으로 지원된다면 UseIP를 테스트하고 IPv4·IPv6 라우팅과 애플리케이션 동작을 각각 확인하세요.

마지막으로 세 가지를 확인할 수 있어야 합니다. 도메인이 어느 단계에서 조회되는지, DNS 연결이 어떤 아웃바운드를 이용하는지, 조회 실패 시 어느 서버로 대체되는지입니다. 최상위 설정의 구조를 비교하려면 설정 항목 설명을 확인하세요. 프록시, 코어, 라우팅 개념이 궁금하다면 용어 설명부터 읽어 보세요.

클라이언트 다운로드