· 문제 해결 · 예상 읽기 시간 12분

Clash DNS 누수 테스트 및 해결: 점검 방법과 유출 방지 설정

DNS 누수가 발생하는 원인과 확인 방법을 알아보고, TUN 모드·fake-ip·시스템 DNS 우회 방지 설정을 단계별로 점검하세요.

DNS 누수 판단 기준

DNS 누수란 도메인 조회가 예상한 DNS 경로를 벗어나는 현상입니다. 예를 들어 모든 공용 도메인을 프록시 측에서 조회하도록 설정했는데, 실제로는 로컬 라우터가 통신사 DNS로 요청을 전달할 수 있습니다. 웹 트래픽의 출구 IP가 바뀌었다고 해서 DNS 조회 경로까지 바뀐 것은 아닙니다. 앱이 먼저 시스템 리졸버에 조회를 요청한 뒤, 받은 IP 주소를 프록시에 전달할 수도 있습니다.

먼저 목표를 정한 다음 결과를 판단하세요. 이 글에서는 두 가지 목표를 구분합니다. 첫째, 시스템의 DNS 요청을 모두 Clash 코어로 보내 지정한 암호화 DNS를 사용하는 것. 둘째, 한 단계 더 나아가 상위 DNS 서버로 향하는 연결도 프록시 출구를 통과시키는 것입니다. 첫 번째 목표는 암호화 DNS에 직접 연결하는 것을 허용하지만, 두 번째 목표는 허용하지 않습니다. 두 경우를 같은 ‘테스트 통과’ 결과로 판단해서는 안 됩니다.

기준 상태 기록: 출구와 DNS 리졸버를 함께 확인

테스트 조건 고정

  1. 현재 클라이언트와 코어 버전, 운영체제, 사용 중인 네트워크 인터페이스, 다른 VPN의 동시 실행 여부를 기록하세요.
  2. 다른 프록시 앱을 종료하고 브라우저의 ‘보안 DNS’를 잠시 끄세요. 두 가지 DNS 조회 방식이 섞이지 않도록 하고, 이후 각각 다시 켜서 별도로 테스트합니다.
  3. 프록시를 끈 상태, 시스템 프록시만 켠 상태, TUN을 켠 상태에서 각각 웹 출구 IP와 DNS 테스트 결과를 기록하세요.
  4. 매 테스트 전에 시스템과 브라우저 캐시를 비우고 새 테스트를 시작하세요. 같은 도메인을 반복 조회하지 말고, 테스트 페이지에서 새로 생성한 도메인을 사용해야 합니다.

브라우저에서 https://www.dnsleaktest.com/ 또는 https://browserleaks.com/dns를 직접 열어 확인할 수 있습니다. 이 서비스는 현재 접속 IP와 테스트 조회 정보를 수집하므로 외부 테스트 서비스에 해당합니다. 일반적으로 테스트 결과는 재귀 리졸버가 권한 DNS 서버에 조회할 때의 출구를 보여줍니다. 앱과 리졸버 사이에 어떤 전송 프로토콜을 사용했는지는 이것만으로 확인할 수 없습니다.

테스트 결과가능한 원인다음 단계
웹 출구는 바뀌었지만 DNS는 현지 통신사로 표시됨시스템 DNS 요청이 가로채지지 않았거나 설정에서 로컬 리졸버를 사용 중일 수 있음TUN, DNS 가로채기, 실제 적용된 설정을 확인하세요
DNS에 표시된 공용 리졸버가 노드 국가와 다름DoH에 직접 연결했거나 DNS 서비스의 분산 출구를 사용 중일 수 있음상위 DNS 연결의 출구와 라우팅 정책을 확인하세요
브라우저 테스트는 정상이지만 명령줄은 로컬 DNS를 사용함브라우저에서 별도의 DoH를 사용할 수 있음브라우저의 보안 DNS를 끄고 시스템 DNS 조회를 다시 테스트하세요
IPv6를 켠 뒤에만 추가 DNS 리졸버가 나타남IPv6 경로나 DNS 가로채기가 제대로 설정되지 않았을 수 있음물리 인터페이스의 IPv6 DNS와 기본 경로를 확인하세요

DNS IP가 여러 개 표시된다는 사실만으로는 누수를 입증할 수 없습니다. 공용 DNS 서비스는 여러 출구를 사용할 수 있고, 설정된 상위 서버 여러 곳에서 조회가 이뤄질 수도 있습니다. 중요한 것은 표시된 리졸버가 예상한 대상인지, 그리고 조회가 계획한 프록시 경로를 우회했는지 여부입니다.

시스템 점검: 인터페이스 DNS, 캐시, 포트 53

Windows: Wi-Fi뿐 아니라 모든 인터페이스 확인

PowerShell에서 다음 명령을 실행하세요. 첫 번째 명령은 인터페이스 DNS를 확인하고, 두 번째는 캐시를 비우며, 세 번째는 DNS 조회를 실행합니다. 이더넷, Wi-Fi, 가상 네트워크 인터페이스가 있다면 현재 활성 상태인 인터페이스를 모두 확인하세요.

Get-DnsClientServerAddress
Clear-DnsClientCache
Resolve-DnsName example.com -Type A

Resolve-DnsName이 성공했다는 것은 응답을 받았다는 뜻일 뿐, 프록시를 사용했다는 증거는 아닙니다. nslookup example.com에 표시되는 기본 서버도 투명 가로채기 이후의 최종 상위 DNS 서버와 같다고 볼 수 없습니다. 코어 로그와 라우팅 정보, 물리 인터페이스의 트래픽을 함께 확인해야 합니다.

macOS 및 Linux: 로컬 DNS 스텁 확인

# macOS: 각 범위의 DNS 설정 확인
scutil --dns
# macOS: 시스템 DNS 캐시 비우기
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

# systemd-resolved를 사용하는 Linux
resolvectl status
resolvectl flush-caches
resolvectl query example.com

Linux의 /etc/resolv.conf가 127.0.0.53을 가리킨다면 대개 systemd-resolved의 로컬 스텁을 사용한다는 뜻이지, 상위 DNS 서버도 로컬에 있다는 뜻은 아닙니다. resolvectl status에서 각 링크의 DNS Servers와 DNS Domain을 추가로 확인하세요. systemd-resolved가 없는 배포판에서는 해당 네트워크 관리 도구를 사용해야 합니다.

패킷 캡처 시 물리 인터페이스 선택

Wireshark에서 표시 필터 dns || tcp.port == 853를 사용하면 일반 DNS와 흔히 쓰이는 DoT 연결을 찾을 수 있습니다. macOS와 Linux에서는 아래 명령을 사용할 수도 있습니다. en0을 실제 인터넷 연결에 사용하는 인터페이스 이름으로 바꾸세요.

sudo tcpdump -ni en0 '(udp port 53 or tcp port 53 or tcp port 853)'

물리 인터페이스에서 라우터나 통신사로 향하는 공용 도메인 평문 조회가 보이면, 어떤 프로세스에서 발생했는지 추적해야 합니다. DoH는 보통 포트 443을 사용하므로 위 필터만으로는 찾을 수 없습니다. TUN 가상 인터페이스에서 보이는 조회는 가로채기 전 트래픽일 수 있으므로, 이를 물리 네트워크로 이미 유출된 것으로 단정하지 마세요.

mihomo 설정: TUN, fake-ip, DNS 가로채기

아래는 기존 설정에 병합할 조각이며, 구독 설정 전체가 아닙니다. 기존 proxies, proxy-groups, rules는 유지하세요. 이미 tun이나 dns가 있다면 해당 섹션을 수정해 YAML 키가 중복되지 않도록 합니다. 구독 업데이트 때 수정 사항이 덮어써지지 않도록 클라이언트의 오버라이드 또는 병합 기능을 사용해 설정을 저장하세요.

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  strict-route: true
  dns-hijack:
    - any:53
    - tcp://any:53

dns:
  enable: true
  listen: 127.0.0.1:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://1.1.1.1/dns-query
  proxy-server-nameserver:
    - https://1.1.1.1/dns-query

주요 설정 항목의 역할

fake-ip에서 흔히 반환하는 주소는 198.18.0.0/16 대역에 속합니다. 이 주소가 보인다면 매핑 기능이 적용된 것이지, 원격 웹사이트의 실제 주소가 예약된 대역으로 바뀐 것은 아닙니다. 앱이 fake-ip를 받은 뒤 코어를 우회해 직접 연결하면 연결이 실패할 수 있습니다. 이때는 트래픽 가로채기를 점검해야 하며, 곧바로 fake-ip-filter를 넓히지 마세요. 도메인을 필터 목록에 추가해도 반환 주소 방식만 바뀔 뿐, 상위 DNS 서버의 출구는 자동으로 변경되지 않습니다.

상위 DNS 연결도 프록시로 보내기: 라우팅 규칙과 초기 조회

공용 도메인 조회의 상위 DNS 연결까지 노드를 통과시키려면 DNS 아웃바운드 정책을 추가로 설정해야 합니다. mihomo에서는 respect-rules: true를 사용해 DNS 상위 서버 연결이 라우팅 규칙을 따르도록 할 수 있습니다. 이 옵션을 사용할 때는 노드 도메인을 별도의 경로로 먼저 조회할 수 있도록 proxy-server-nameserver도 설정해야 합니다.

아래 예시는 기존 설정에 PROXY라는 이름의 정책 그룹이 있고, 해당 그룹에서 DIRECT가 아닌 프록시 노드를 선택한 상태를 가정합니다. 앞의 설정 조각에서 dns 섹션에 첫 항목을 추가하고, 기존 rules 목록의 앞쪽에 규칙을 넣으세요. 기존 규칙 목록을 덮어쓰지 마세요.

# 기존 dns 섹션에 병합
dns:
  respect-rules: true

# 기존 rules 목록에서 먼저 매칭될 수 있는 규칙보다 앞에 추가
rules:
  - IP-CIDR,1.1.1.1/32,PROXY,no-resolve

이 규칙은 1.1.1.1로 향하는 연결에 PROXY를 선택하며, 같은 IP를 대상으로 하는 다른 트래픽에도 영향을 줍니다. 예시에 나온 IPv4 상위 서버에만 적용되므로 다른 DNS 주소를 사용한다면 규칙을 다시 설계하세요. 저장한 뒤 코어의 연결 기록에서 DNS 상위 서버 연결에 예상한 정책이 적용됐는지 확인해야 합니다. 설정 파일에 respect-rules가 있다고 해서 실제 적용이 입증되는 것은 아닙니다.

노드 도메인의 초기 조회 경로도 별도로 점검해야 합니다. 업무용 도메인은 프록시를 통해 조회하더라도 시작 시 노드 도메인은 직접 연결하는 DNS로 조회될 수 있습니다. 시작 단계의 직접 조회도 막아야 한다면 서비스 제공자가 지원하는 안정적인 노드 IP나 통제된 초기 조회 방식을 사용하고, 필요한 TLS 서버 이름 설정은 유지하세요. 임시 조회로 얻은 IP를 장기간 고정하면 노드 주소가 바뀔 때 연결이 끊길 수 있습니다.

시스템 DNS 우회와 별도 조회 경로 차단

fallback을 시스템 DNS 우회 차단 옵션으로 오해하지 마세요

Clash의 fallback은 코어에서 사용하는 별도의 상위 DNS 서버 그룹이며, fallback-filter와 함께 조회 결과의 사용 방식을 결정합니다. 운영체제의 보조 DNS를 뜻하지 않습니다. 이 항목을 삭제해도 시스템이 DHCP로 받은 리졸버에 요청을 보내는 것을 막을 수는 없습니다. 반대로 fallback 주소를 무작정 추가하면 조회 정보가 전달되는 DNS 서비스의 범위가 넓어질 수 있습니다.

프록시를 사용할 수 없을 때 DNS 조회도 차단하는 엄격한 정책이 필요하다면, DNS 경로를 확인한 후 통제된 라우팅 또는 방화벽 규칙으로 직접 연결되는 출구를 제한하세요. 노드 연결과 필수 네트워크 서비스는 명시적으로 허용해야 합니다. TUN을 켜는 것만으로 네트워크 차단 보호가 설정되는 것은 아닙니다. 원격 시스템, 기업 내부망, 포털 인증이 필요한 네트워크에서는 특히 먼저 복구 방법을 준비하세요.

단계별 재검증 및 문제 해결

  1. 설정 적용 확인: 설정을 다시 적용하고 알 수 없는 항목, 중복 키, YAML 들여쓰기 오류가 없는지 확인하세요. 시작 로그에서 TUN이 정상적으로 설정됐는지도 확인합니다.
  2. 이전 응답 삭제: 시스템 캐시를 비우고 브라우저를 완전히 종료한 뒤 다시 실행하세요. 매번 새 테스트 도메인을 사용해 캐시가 실제 경로를 가리지 않도록 합니다.
  3. 시스템 DNS 조회 확인: 먼저 시스템 명령으로 조회한 다음 브라우저 DNS 누수 테스트를 실행하세요. 한 테스트 페이지에서만 정상으로 표시되는 것이 아니라 두 결과 모두 현재 설정으로 설명할 수 있어야 합니다.
  4. 상위 DNS 출구 확인: 코어 연결 정보와 로그에서 DNS 대상, 매칭된 규칙, 최종 선택된 정책 그룹을 확인하세요. 프록시를 통과해야 하는 경우 DIRECT가 선택되지 않았는지 확인합니다.
  5. 물리 네트워크 확인: TCP/UDP 포트 53과 필요한 암호화 DNS 연결을 캡처하세요. 알 수 없는 포트 443 연결은 프로세스 정보와 함께 판단해야 하며, ‘평문 패킷이 보이지 않는다’는 사실만으로 충분한 증거라고 볼 수 없습니다.
  6. 상태 변화 후에도 확인: Wi-Fi 전환, 절전 모드 해제, 노드 변경, 구독 업데이트 후에도 테스트를 반복하세요. 오버라이드가 유지되고 라우팅 경로가 다시 설정됐는지 확인합니다.
  7. 장애 시 동작 확인: 복구 가능한 로컬 환경에서 선택한 프록시를 잠시 사용할 수 없게 만든 뒤, 시스템이 예상대로 실패하는지 아니면 다른 DNS 경로로 조용히 우회하는지 확인하세요.

웹페이지가 전혀 열리지 않을 때

먼저 DNS 시간 초과인지 프록시 연결 실패인지 구분하세요. 로그에 상위 DoH 연결 실패가 표시되면 1.1.1.1:443로 향하는 아웃바운드 정책과 노드 상태를 확인합니다. 노드 도메인 자체를 조회할 수 없다면 초기 조회 경로를 점검하세요. fake-ip를 받았지만 연결 시간이 초과된다면 TUN 경로, 제외된 프로세스, 다른 VPN과의 충돌을 확인합니다. 한 번에 한 항목만 변경하고 변경 전 설정을 보관해 여러 변경 사항이 서로의 원인을 가리지 않도록 하세요.

Clash 다운로드클라이언트 및 시스템 요구 사항