DNS 유출이란: 프록시는 켜져 있는데 조회는 로컬로 새는 현상
도메인 해석은 인터넷 접속의 첫 단계입니다. 브라우저가 도메인을 받으면 먼저 IP 주소로 변환해야 하는데, 이 과정을 담당하는 것이 DNS입니다. DNS 유출이란 프록시가 이미 '연결됨' 상태를 표시하고 있음에도 해석 요청이 여전히 실제 네트워크를 통해 직접 발송되어 통신사나 라우터의 DNS 서버에 도달하는 현상을 말합니다. 결과는 두 가지입니다. 첫째는 프라이버시 문제로, 어떤 도메인을 언제 방문했는지 로컬 네트워크 제공자가 그대로 파악할 수 있습니다. 둘째는 사용성 문제로, 로컬 DNS가 조작된 결과를 반환하면 브라우저가 잘못된 IP를 받게 되어 'Clash는 연결됨 상태인데 웹페이지가 열리지 않거나 엉뚱한 내용이 열리는' 전형적인 증상이 나타납니다.
프록시를 켰는데도 왜 유출이 발생할까요? 흔한 원인은 다음 네 가지입니다.
- 시스템 프록시 모드는 브라우저 등 애플리케이션의 웹 요청만 처리할 뿐 시스템 DNS 설정은 변경하지 않으므로, 네트워크 어댑터에 자동으로 할당된 통신사 DNS가 그대로 작동합니다.
- Clash의 내장 DNS가 활성화되지 않았거나, 활성화되어 있어도 리스닝 주소가 시스템이 실제로 사용하는 해석 경로를 커버하지 못하는 경우입니다.
- 브라우저 자체의 '보안 DNS'(DoH) 기능이 시스템 리졸버를 건너뛰고 DoH 서버에 직접 접속하기 때문에 검사 결과도 왜곡될 수 있습니다.
- IPv6 경로가 제어되지 않아 AAAA 조회가 IPv6용 DNS 서버를 통해 그대로 빠져나가는 경우입니다. IPv4 DNS만 바꿔서는 이 경로를 막을 수 없습니다.
1단계: 먼저 검사해서 유출 여부를 확인하기
수정하기 전에 먼저 증거를 확보해야 합니다. 아래 순서대로 진행하면 유출 여부와 유출 경로를 정확히 파악할 수 있습니다.
- Clash 클라이언트를 열고 프록시가 연결되어 있는지 확인한 뒤 현재 모드(규칙, 글로벌 또는 다이렉트)를 기록해 둡니다.
- 브라우저의 보안 DNS를 일시적으로 끕니다. Chrome은 '설정 → 개인정보 보호 및 보안 → 보안 → 보안 DNS 사용'에서 끄고, Edge도 경로가 동일합니다. Firefox는 '설정 → 네트워크 설정'에서 'HTTPS 기반 DNS 사용'을 해제합니다. 끄지 않으면 검사 결과가 시스템 경로가 아닌 브라우저 DoH의 흐름을 반영하게 됩니다.
- 공개 DNS 유출 검사 페이지(dnsleaktest, ipleak, browserleaks의 DNS 검사 등)를 열어 표준 테스트를 먼저 실행한 뒤 확장 테스트도 실행합니다.
- 결과를 확인합니다. 목록에 자신이 거주하는 지역의 통신사 DNS 노드가 나타나면 유출이 있는 것이고, Cloudflare나 Google 같은 해외 공용 DNS 또는 프록시 출구 서버의 리졸버만 나타나면 유출이 없는 것입니다.
- 시스템 프록시 모드와 TUN 모드 각각 한 번씩 테스트합니다. 두 모드는 제어 범위가 다르기 때문에 결과가 다르게 나오는 경우가 많습니다.
검사 전에 시스템 DNS 캐시를 한 번 지워 이전 캐시로 인한 오차를 방지하세요. Windows는 관리자 권한으로 ipconfig /flushdns를 실행하고, macOS는 sudo dscacheutil -flushcache를 실행한 뒤 sudo killall -HUP mDNSResponder를 실행합니다.
오판하기 쉬운 부분이 있습니다. nameserver에 국내(중국 본토) 공용 DNS(예: 알리바바 223.5.5.5)를 설정했다면 검사 사이트에서 알리바바 노드가 표시될 수 있습니다. 이는 조회가 실제 네트워크를 거쳐 해당 DNS 사업자에게 직접 전달되었다는 뜻으로, 실제 IP가 해당 DNS 사업자에게 노출된 것이지만 통신사 차원의 유출은 아닙니다. 이 부분을 문제로 볼지 여부는 '일반적인 분산 처리'와 '엄격한 유출 방지' 중 어느 쪽을 원하는지에 따라 달라지며, 아래에서 두 가지 설정 방식을 모두 안내합니다.
해결 방법 1: nameserver를 제대로 설정하기
Clash의 DNS 동작은 설정 파일의 dns 항목이 결정합니다. 먼저 각 필드를 정확히 파악한 뒤 수정하세요.
enable: 내장 DNS의 메인 스위치로, 유출 방지를 위해서는 반드시true로 설정해야 합니다.listen: 리스닝 주소와 포트로,0.0.0.0:53으로 설정하면 로컬 53번 포트로 오는 조회를 모두 처리합니다.enhanced-mode:fake-ip또는redir-host입니다. fake-ip는 198.18.0.1/16 대역의 가상 주소를 반환하고 Clash가 연결을 처리할 때 내부적으로 도메인을 역조회하므로 해석 과정이 Clash를 벗어나지 않아 유출 방지에 가장 효과적입니다. redir-host는 클라이언트가 먼저 실제 IP를 해석한 뒤 연결을 시작하는 방식입니다.nameserver: 다이렉트 도메인 해석을 담당하는 기본 상위 서버입니다. IP가 명시된 DoH 주소 사용을 권장합니다. 예:https://223.5.5.5/dns-query,https://119.29.29.29/dns-query.fallback: 해외 도메인에 해당할 때 사용하는 상위 서버로, 보통https://1.1.1.1/dns-query,https://8.8.8.8/dns-query를 지정하며 조회는 프록시를 거쳐 전송됩니다.default-nameserver: 위의 DoH 서버 자체 도메인을 해석하기 위한 '부트스트랩 DNS'로, 순수 IP(예: 223.5.5.5, 119.29.29.29)를 지정해야 'DNS 서버의 도메인을 해석하려면 또 DNS가 필요한' 순환 구조를 방지합니다.proxy-server-nameserver(mihomo): 노드 서버 도메인 해석 전용으로, 신뢰할 수 있는 국내(중국 본토) DoH를 지정해 노드 도메인이 오염되어 접속이 안 되는 상황을 방지합니다.
일반적인 분산 처리를 위한 전체 예시 설정입니다.
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
default-nameserver:
- 223.5.5.5
- 119.29.29.29
nameserver:
- https://223.5.5.5/dns-query
- https://119.29.29.29/dns-query
fallback:
- https://1.1.1.1/dns-query
- https://8.8.8.8/dns-query
proxy-server-nameserver:
- https://223.5.5.5/dns-query
엄격한 유출 방지 방식은 nameserver에서 국내 상위 서버를 제거하고 모두 fallback을 통해 프록시로 해석하는 방식이며, 국내 사이트의 첫 해석이 다소 느려지는 단점이 있습니다. 절충안은 nameserver-policy로 도메인별로 분산 처리하는 것입니다.
nameserver-policy:
"geosite:cn":
- https://223.5.5.5/dns-query
"geosite:geolocation-!cn":
- https://1.1.1.1/dns-query
구독 파일에는 보통 자체 dns 항목이 포함되어 있어 구독을 직접 수정하면 다음 업데이트 시 덮어씌워집니다. 권장 방법: 먼저 원본 설정을 백업한 뒤, 클라이언트의 설정 오버라이드 기능(Clash Verge Rev의 '전역 확장 설정', Clash Nyanpasu의 Merge 등)으로 dns 항목을 주입하면 구독을 업데이트한 뒤에도 설정이 그대로 유지됩니다.
해결 방법 2: 조회가 실제로 Clash로 전달되도록 하기(하이재킹 리스닝)
설정을 아무리 정확히 해도 시스템이 조회를 Clash로 보내지 않으면 소용이 없습니다. 편의성 순으로 정리한 세 가지 방식을 소개합니다.
방식 1: TUN 모드(권장)
mihomo(Clash Meta) 커널의 TUN 모드는 가상 네트워크 어댑터를 생성해 UDP 53번 포트의 DNS 조회를 포함한 기기 전체 트래픽을 처리합니다. dns-hijack은 어떤 주소로 향하든 53번 포트로 가는 조회를 내장 DNS로 가로챕니다. Clash Verge Rev, Clash Nyanpasu, FlClash 등 클라이언트는 설정에서 한 번의 클릭으로 활성화할 수 있으며, 활성화 후에는 시스템 DNS 설정이 무엇이든 더 이상 중요하지 않습니다.
tun:
enable: true
stack: mixed
dns-hijack:
- any:53
- tcp://any:53
auto-route: true
auto-detect-interface: true
방식 2: 시스템 DNS 수동 변경
네트워크 어댑터의 IPv4 DNS를 127.0.0.1, IPv6 DNS를 ::1로 변경하거나(또는 IPv6를 아예 비활성화), dns.listen이 53번 포트를 리스닝하도록 설정합니다. Windows의 인터넷 연결 공유나 일부 가상머신 네트워크 서비스가 53번 포트를 점유해 Clash 실행 시 오류가 발생할 수 있으니 주의하세요. 이 경우 점유 중인 프로그램을 찾아 중지하거나 차라리 TUN 모드로 전환하는 것이 좋습니다. 리스닝 포트를 강제로 변경하지 마세요. Windows의 네트워크 어댑터 DNS 설정은 53번 외의 포트를 지정할 수 없습니다.
방식 3: 시스템 프록시 + redir-host만 사용
이 방식은 제어 범위가 가장 약합니다. 프록시를 거치는 애플리케이션 트래픽만 처리되고 시스템 내 다른 프로세스의 DNS 조회는 그대로 기존 경로로 진행됩니다. 당장 TUN을 켤 수 없다면 최소한 브라우저 DoH가 꺼져 있는지 확인하고 '브라우저만 관리 가능하다'는 한계를 받아들여야 합니다.
해결 방법 3: 규칙으로 마무리하고 재검사 체크리스트 확인하기
마지막 단계는 규칙입니다. DNS 설정은 '어떻게 해석할지'를 결정하고, 규칙은 '빠져나간 조회 트래픽이 어디로 갈지'를 결정합니다.
- 규칙 마지막의
MATCH가 DIRECT가 아닌 프록시 정책 그룹을 가리키는지 확인하세요. 그래야 어떤 규칙에도 걸리지 않은 트래픽(애플리케이션 자체 DoH 요청 포함)이 직접 연결로 빠져나가지 않습니다. - 53번 포트에 DIRECT 규칙을 추가하지 마세요. TUN 모드에서는 dns-hijack이 이미 처리하고 있으므로 불필요한 규칙은 오히려 혼란을 야기합니다.
- 애플리케이션 내장 DoH는 가장 흔한 누락 경로입니다.
dns.google,cloudflare-dns.com,mozilla.cloudflare-dns.com등 공용 DoH 도메인을 REJECT로 지정해 애플리케이션이 시스템 해석으로 돌아가게 함으로써 Clash가 통합 처리할 수 있도록 합니다.
모든 수정이 끝났다면 다음 체크리스트로 재검사하세요.
- 유출 검사를 다시 실행해 결과에 해외 리졸버만 남아 있는지 확인합니다.
- 네트워크 환경을 바꿔서(예: 집 인터넷에서 모바일 핫스팟으로) 한 번 더 테스트해 특정 경로의 우연한 결과가 아닌지 확인합니다.
- 구독을 한 번 수동으로 업데이트해 dns 오버라이드가 여전히 적용되는지 확인한 뒤 다시 테스트합니다.
- 이후 며칠간 웹사이트가 열리지 않는 문제가 없는지 살펴보세요. 일부 서비스는 fake-ip와 호환되지 않는데, 해당 도메인을
fake-ip-filter에 추가하면 되고 이 때문에 redir-host로 되돌릴 필요는 없습니다.
DNS 유출은 한 번 해결하고 끝나는 문제가 아닙니다. 클라이언트 변경, 네트워크 변경, 구독 업데이트 모두 설정을 원상태로 되돌릴 수 있습니다. '수정 후 테스트, 업데이트 후 재테스트'를 습관으로 만들어야 유출 방지를 제대로 완성한 것입니다.