DNS 해석은 프록시 체인에서 문제가 가장 자주 발생하는 구간입니다. 잘못된 설정은 두 가지 위험을 초래합니다: DNS 하이재킹으로 인해 해외 도메인이 잘못된 IP로 해석되어 접속 불가; DNS 누출은 실제 접속 기록을 ISP에 노출시킵니다. Clash 공식 DNS 모듈은 Fake-IP 메커니즘을 내장하여 시스템 레벨에서 이 두 가지 문제를 근본적으로 해결하며, 이는 Clash가 유사 도구들과 차별화되는 핵심 기능 중 하나입니다.
기존 프록시의 DNS 문제
전통적인 HTTP 프록시 모드에서 브라우저가 google.com에 접속할 때, 먼저 로컬에서 DNS 해석을 수행하고 IP 주소를 얻은 후 연결을 설정합니다. 여기서 모순이 발생합니다: DNS 해석이 로컬 ISP의 DNS 서버를 통하면 google.com의 해석 결과가 하이재킹으로 인해 잘못된 IP를 반환할 수 있고; DNS 해석이 프록시를 통하면 프록시 연결이 먼저 설정되어야 DNS 요청을 전달할 수 있어 닭이 먼저냐 달걀이 먼저냐의 순환 문제가 발생합니다.
초기 해결책은 프록시 서버 측에서 DNS 해석을 수행하는 것이었습니다(Remote DNS Resolution). 클라이언트가 도메인을 직접 프록시 서버에 전달하면 프록시 서버가 자신의 네트워크 환경에서 해석하여 결과를 반환합니다. 이는 하이재킹 문제를 해결하지만 지연 시간이 늘어나고, Clash의 IP 기반 규칙(예: GEOIP)과 함께 사용할 수 없는 단점이 있습니다.
Fake-IP 동작 원리
Fake-IP는 Clash가 채택한 더 우아한 해결 방법입니다. 핵심 아이디어는: 애플리케이션이 DNS 요청을 보낼 때, Clash는 실제 DNS 해석 결과를 기다리지 않고 미리 예약된 IP 대역(기본값 198.18.0.0/16)에서 "가짜" IP를 즉시 할당하여 애플리케이션에 반환합니다. 애플리케이션은 이 가짜 IP를 받은 즉시 연결 요청을 시작하고, Clash는 이 연결을 가로채 가짜 IP에 해당하는 도메인을 조회한 후 규칙에 따라 처리 방법을 결정합니다.
이 방법의 장점은 매우 명확합니다: 애플리케이션은 DNS 해석 완료를 기다리지 않고 즉시 연결을 시작할 수 있어 최초 연결 지연 시간이 크게 줄어듭니다; 실제 DNS 해석은 백그라운드에서 비동기적으로 수행되며 프록시를 통해 전송되므로 DNS 하이재킹을 완전히 방지합니다; 동시에 DNS 누출도 차단됩니다—모든 DNS 요청이 Clash에 의해 통합 관리되어 어떤 요청도 로컬 DNS 서버로 누출되지 않습니다.
DNS 전체 설정 예시
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
# Fake-IP를 사용하지 않는 도메인 (실제 IP를 직접 반환)
fake-ip-filter:
- "*.lan"
- accounts.google.com
# 로컬 DNS: 직접 연결 도메인 해석, 속도 빠름
nameserver:
- 1.1.1.1 # Cloudflare
- 8.8.8.8 # Google
# 프록시 경유 DNS: 프록시 도메인 해석, 하이재킹 방지
fallback:
- https://8.8.8.8/dns-query # Google DoH
- https://1.1.1.1/dns-query # Cloudflare DoH
- tls://8.8.4.4:853 # Google DoT
# fallback 트리거 조건
fallback-filter:
geoip: true
geoip-code: KR
ipcidr:
- 240.0.0.0/4 # 예약 주소, 일반적으로 하이재킹 결과
nameserver와 fallback의 역할 분담
nameserver는 주 DNS 서버 그룹으로 대부분의 DNS 요청을 처리하며, 보통 로컬에서 빠른 DNS(예: Cloudflare 1.1.1.1, Google 8.8.8.8)로 설정합니다. fallback은 보조 DNS 서버 그룹으로, nameserver가 반환한 결과가 fallback-filter 규칙에 의해 의심스럽다고 판단될 때(예: 해외 IP가 반환되거나 예약 주소 대역에 속할 때), Clash는 fallback DNS를 사용하여 재조회하고 fallback 결과를 사용합니다.
fallback DNS는 DoH(DNS over HTTPS)또는 DoT(DNS over TLS)프로토콜 사용을 권장합니다. 이러한 프로토콜은 DNS 요청을 암호화하여 전송하므로 네트워크 전송 과정에서 중간 노드에 의한 변조가 불가능하여 DNS 하이재킹 문제를 완전히 해결합니다.
fake-ip-filter: 어떤 도메인에 Fake-IP를 사용하지 않아야 하나
모든 도메인에 Fake-IP가 적합한 것은 아닙니다. 다음 유형의 도메인은 fake-ip-filter 제외 목록에 추가하여 Clash가 실제 IP를 직접 반환하도록 해야 합니다:
- 로컬 네트워크 도메인:
*.local,*.lan과 같이 로컬 네트워크에서 사용되는 주소로, Fake-IP가 로컬 기기 검색에 문제를 일으킬 수 있음 - 게임 플랫폼 관련 도메인: 일부 게임 클라이언트는 DNS 해석 결과를 검증하므로 Fake-IP가 치트 방지 메커니즘을 트리거할 수 있음
- NTP 시간 동기화 서비스: 시간 동기화는 IP 정확성이 필요하므로 실제 IP를 직접 반환해야 함
- 특정 앱의 인증 도메인: 예를 들어 Google 계정 로그인 도메인으로, Fake-IP 사용 시 로그인 실패가 발생할 수 있음
DNS 누출 여부 확인
설정 완료 후 dnsleaktest.com 또는 bash.ws/dnsleak에 접속하여 DNS 누출 검사를 수행할 수 있습니다. 검사 결과에 프록시 서버가 위치한 지역의 DNS 서버만 표시되면 설정이 올바른 것입니다; 로컬 ISP의 DNS 서버가 표시된다면 DNS 누출이 발생한 것이므로 DNS 설정을 확인하거나 TUN 모드의 DNS 하이재킹 기능을 함께 사용하여 해결해야 합니다.