人在中国,用起 DNS 会碰到两个问题,一个是 DNS 污染,另一个是 DNS 泄露。想要上网上得痛快,就必须要先解决 DNS 的问题。
什么是 DNS 泄露
如果你现在正在开着代理看这篇文章,可以先打开这个网站检测一下自己的 DNS 请求是否被发送到了国内的 DNS 服务器上。
简单来说,当你在使用 VPN 等代理工具时,你认为你的请求不会被除了你和 VPN 提供商以外的第三方看到,然而主机的 DNS 请求却被发送送给了运营商的 DNS 服务器或者是公共 DNS 服务器(阿里、腾讯等)进行解析,而你的真实 IP 地址和请求的域名都会被记录下来。如果 DNS 请求解析一些敏感网站的域名(比如电报、维基解密等),就会被监管者注意到,从而被警告或者请去喝茶。1
因此,正确地配置代理工具的分流策略来避免 DNS 泄露就显得尤为重要。
SmartDNS 的配置
防止 DNS 泄露
DNS 作为上网的指路人,排在第一位的要求就是必须要快,在这样的要求下本地部署 SmartDNS 充当家庭网络的 DNS 服务器真的再合适不过了。关于 SmartDNS 的作用和配置技巧,以及其如何优选 CDN 加快网络访问速度,Sukka 的「我有特别的 DNS 配置和使用技巧」已经讲的很好,推荐在继续阅读本文之前先去看看这篇文章,其中的内容我在这里便不再赘述,我的叙述重心将会放在如何在 Luci 界面上实现这些配置。
如果你和我一样使用 OpenWRT,SmartDNS 的 Luci App 会在每次启动时根据面板上保存的配置自动生成新的配置文件,所以,不要直接修改/etc/smartdns
目录下原有的配置文件,所有的更改都应该在 Luci App 里操作。
基本上,SmartDNS 上游数量越多越好,因为较多的上游并不会影响 SmartDNS 的性能2,并且多个上游可以增加冗余。为了防止 DNS 泄露,在配置上游时,应当在默认分组添加国外 DNS 上游(当然,最好是加密 DNS),并将国内的服务器归入一个单独的分组(例如domestic
),并加上-exclude-default-group
的额外参数以将它们从默认分组中排除。
加速国内域名解析
设置好国外上游,DNS 泄露的问题就解决了,但因为我们在默认分组中排除了国内上游,访问新的域名时需要等待国外上游返回结果,这显然会拖慢国内网站的访问速度,并且还会劣化 CDN。
dnsmasq-china-list 是 Felix Yan 的项目,目前支持通过 Makefile 生成 SmartDNS 格式的配置文件,目前已经有人做好了现成的 Github Action 每天自动更新,直接下载就可以了,注意这些配置文件只会在国内 DNS 上游分组名称为domestic
时生效。
|
|
随后在 SmartDNS 中引入这些配置文件,将下面的内容粘贴到「自定义设置」栏的末尾。
|
|
这样配置之后,国内域名的访问速度便不再会受到影响,访问国外域名时,也不会再有 DNS 泄露的问题了。
去广告
DNS 层面的去广告效果有限,重点应该放在防止误杀上,所以不要用那臭名昭著3的号称自己是「致力于成为中文区命中率最高的广告过滤列表」的 Anti AD,而是使用一些别的规则。个人使用的规则是 217heidai/adblockfilters,这是一个已经整理好的聚合规则,直接拉取即可。
|
|
最后引入配置文件:
|
|
自动更新规则
设置如下 Crontab 即可在每天凌晨三点自动更新所有规则。
|
|
旁路由可以用吗
除非不使用 IPv6,否则最好还是将 OpenWRT 路由器作为主路由。在作为旁路由的情况下,某些系统(说的就是你,Windows)会不遵守旁路由广播的 IPv4 DNS,而执意使用运营商光猫广播的 IPv6 DNS 进行解析,我尝试修改过一些相关的注册表键值,但毫无作用。无奈只好让运营商上门将光猫改为桥接模式,并将 OpenWRT 用作主路由。
覆写 Clash 规则
这时如果你开着 Clash 去跑 DNS 泄露测试,大概率还是会看到你的 DNS 请求被发到了中国的 DNS 服务器上——几乎所有机场的默认配置都会使用腾讯、阿里等国内大厂的加密 DNS,虽然不至于明文泄露到运营商 DNS 而导致你接到反诈中心的电话,但总让人膈应 (强迫症犯了),更有甚者甚至完全没有相关配置。
好在如果使用的是 Clash Verge Rev,那么可以很方便的覆写机场的配置,这里分享我的覆写配置,将其粘贴到全局扩展配置中即可覆写机场的配置。
|
|
配置解析
根据 Mihomo 文档4,其 DNS 请求的流程如下:
flowchart TD Start[客户端发起请求] --> rule[匹配规则] rule --> Domain[匹配到基于域名的规则] rule --> IP[匹配到基于 IP 的规则] Domain --> |域名匹配到直连规则|DNS IP --> DNS[通过 Clash DNS 解析域名] Domain --> |域名匹配到代理规则|Remote[通过代理服务器解析域名并建立连接] Cache --> |Redir-host/FakeIP-Direct 未命中|NS[匹配 nameserver-policy 并查询 ] Cache --> |Cache 命中|Get Cache --> |FakeIP 未命中,代理域名|Remote NS --> |匹配成功| Get[将查询到的 IP 用于匹配 IP 规则] NS --> |没匹配到| NF[nameserver/fallback 并发查询] NF --> Get[查询得到 IP] Get --> |缓存 DNS 结果|Cache[(Cache)] Get --> S[通过 IP 直接/通过代理建立连接] DNS --> Redir-host/FakeIP Redir-host/FakeIP --> |查询 DNS 缓存|Cache
其中nameserver-policy
的优先级高于nameserver
和fallback
,指定geosite:cn
中的网站以系统 DNS 查询,也就是使用之前配置好的 SmartDNS 查询,可以享受到局域网级别的响应速度和自带测速的 CDN 选择。而不在geosite:cn
中的网站则使用nameserver/fallback
查询,使用国外加密上游就可以确保解析结果的可信并防止 DNS 泄露。
替换 geoip 和 geosite 数据库
Mihomo 默认使用 V2Ray 官方的 geoip 和 geosite 数据库,这个数据库其实不太全,而且更新的频率也很慢,所以我还是用 Loyalsoldier/v2ray-rules-dat 这个「加强版」数据库替换了原来的数据库,只需下载geoip.dat
和geosite.dat
以后丢进内核目录即可。当然,也可以新增几行覆写配置以实现自动/一键更新:
|
|
Clash Meta For Android
对于手机上的 Clash Meta For Android(以下简称 Clash),覆写设置时需要更加考虑手机的实际情况。
首先手机上的 Clash 覆写设置选项就不如桌面端的 Clash Verge Rev 这么灵活,很多键值都不能覆写。另外,手机不像电脑,需要经常切换网络环境,这就导致系统 DNS 也会换得很频繁,经测试,在这种情况下,每次更换网络环境都需要开关一次 Clash 才能让其更新system
所代表的 DNS。于是我们只能退而求其次,固定一个国内加密 DNS 作为国内查询。
进入 Clash ->「设置」->「覆写」以下是所有覆写设置:
- 「DNS」->「策略」:强制启用
- 「DNS」->「Prefer h3」:已启用
- 「DNS」->「Name Server」:添加两个国外加密 DNS
- 「DNS」->「Name Server 策略」:在「键」一栏中填写
geosite:cn
,值一栏填写https://doh.pub/dns-query
提前从 Github 上下载geoip.dat
和geosite.dat
,最后进入 Clash ->「设置」->「Meta Features」,分别用「导入 GeoIP 数据库」和「导入 GeoSite 数据库」功能导入它们。
完成
最后再打开一个 DNS 泄露测试,看一看问题是否解决,如果不再出现国内的 DNS,说明配置正确,好好享受 SmartDNS 和 Clash 带来的网络优化和防泄漏吧~
SmartDNS 在设计时就考虑到了延迟问题,具体机制可以参考「中场休息:SmartDNS 是如何避免因测速导致 DNS 解析过慢的」。 ↩︎
有人整理了 Anti AD 的光荣事迹。 ↩︎