前言

最近已经在新家住了几天,对于新家的网络一直都是非常满意的,直到前几天发现自己无法登陆ChatGPT,总是显示地区不对,无法提供服务。

当时就比较纳闷,明明Youtube、 Netflix、Twitter这些都能正常浏览,为什么就ChatGPT不行?

开始还以为是IPv6的问题,后来想明白了,虽然网络没问题,但是通过DNS反馈,得到是国内的地理位置,也就是DNS泄漏了。

常见原因

稍微查了点资料,DNS 泄漏通常源于以下几个配置环节:

  1. DNS 查询未完全劫持:路由器上可能存在其他 DNS 服务(如 Dnsmasq、SmartDNS 等)与 OpenClash 争夺 DNS 查询的处理权,未能将全部 DNS 查询请求正确导向 OpenClash

  2. 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。

  3. IPv6 DNS 泄漏:如果网络开启了 IPv6,但未正确配置 IPv6 DNS 的劫持,客户端可能会通过 IPv6 向运营商默认的 IPv6 DNS 服务器发送查询请求,造成泄漏

  4. 基于 IP 的规则未添加 no-resolve:Clash 在匹配基于 IP 的规则(如 GEOIP)时,会先尝试解析域名获取 IP 以进行判断。如果这些规则没有设置 no-resolve 参数,Clash 就会主动向配置的 DNS 服务器发起查询。若此时域名本应通过代理由远端解析,这个本地查询行为就可能造成泄漏

梳理问题

目前网络环境:

  • SmartDNS:DNS解析

  • AdguardHome:广告过滤

  • OpenClash:国内外分流代理

看完上面的原因,基本确定是DNS的问题。

  1. 首先确定 OpenClash 的 nameserver 使用TLS以及DoH协议的加密协议;

  2. 其实检查DNS的解析流程是否正确

根据我自身的排查,确定是DNS的处理流程不正确

目前我的DNS处理流程为:SmartDNS → OpenClash → SmartDNS → AdguardHome。

也就是DNS解析最终仍然是SmartDNS。

正确的处理流程应为:SmartDNS → OpenClash → AdguardHome

解决步骤

  1. SmartDNS监听端口(一般为6553),上游服务器协议不做要求(UDP、TLS、DoH都可以);

  2. OpenClash的 nameserver 只填SmartDNS的 127.0.0.1:6553

  3. AdguardHome中,上游DNS服务器,只填写OpenClash的DNS监听地址,一般默认127.0.0.1:7874

    后备服务器可以不填留空。

结尾

以上流程理清楚就没问题了,ChatGPT也能正常访问了。