OpenClash使用心得:DNS防泄漏
前言
最近已经在新家住了几天,对于新家的网络一直都是非常满意的,直到前几天发现自己无法登陆ChatGPT,总是显示地区不对,无法提供服务。
当时就比较纳闷,明明Youtube、 Netflix、Twitter这些都能正常浏览,为什么就ChatGPT不行?
开始还以为是IPv6的问题,后来想明白了,虽然网络没问题,但是通过DNS反馈,得到是国内的地理位置,也就是DNS泄漏了。
常见原因
稍微查了点资料,DNS 泄漏通常源于以下几个配置环节:
DNS 查询未完全劫持:路由器上可能存在其他 DNS 服务(如 Dnsmasq、SmartDNS 等)与 OpenClash 争夺 DNS 查询的处理权,未能将全部 DNS 查询请求正确导向 OpenClash。
OpenClash 上游 DNS 设置不当:在 OpenClash 的 DNS 设置中,如果
nameserver
使用了明文 DNS(如114.114.114.114
),并且 fallback 过滤器(fallback-filter
)设置不够严格,可能导致并发查询时,国内 DNS 服务器响应了国外域名的查询请求。根据目前主流的OpenClash配置思路和Fake-IP模式的工作原理,通常不建议完全省略fallback DNS的设置。虽然理论上在纯Fake-IP模式下,
nameserver
用于解析直连流量的域名,fallback
用于解析代理流量的域名,但正确配置fallback
对于防止DNS污染和确保网络稳定性很重要。fallback
可以设置一个境外的DNS。IPv6 DNS 泄漏:如果网络开启了 IPv6,但未正确配置 IPv6 DNS 的劫持,客户端可能会通过 IPv6 向运营商默认的 IPv6 DNS 服务器发送查询请求,造成泄漏。
基于 IP 的规则未添加
no-resolve
:Clash 在匹配基于 IP 的规则(如GEOIP
)时,会先尝试解析域名获取 IP 以进行判断。如果这些规则没有设置no-resolve
参数,Clash 就会主动向配置的 DNS 服务器发起查询。若此时域名本应通过代理由远端解析,这个本地查询行为就可能造成泄漏。
梳理问题
目前网络环境:
SmartDNS:DNS解析
AdguardHome:广告过滤
OpenClash:国内外分流代理
看完上面的原因,基本确定是DNS的问题。
首先确定 OpenClash 的
nameserver
使用TLS以及DoH协议的加密协议;其实检查DNS的解析流程是否正确
根据我自身的排查,确定是DNS的处理流程不正确。
目前我的DNS处理流程为:SmartDNS → OpenClash → SmartDNS → AdguardHome。
也就是DNS解析最终仍然是SmartDNS。
正确的处理流程应为:SmartDNS → OpenClash → AdguardHome
解决步骤
SmartDNS监听端口(一般为6553),上游服务器协议不做要求(UDP、TLS、DoH都可以);
OpenClash的
nameserver
只填SmartDNS的127.0.0.1:6553
;AdguardHome中,上游DNS服务器,只填写OpenClash的DNS监听地址,一般默认
127.0.0.1:7874
。后备服务器可以不填留空。
结尾
以上流程理清楚就没问题了,ChatGPT也能正常访问了。