[原创] 解决 AdGuard Home作为Surge上游DNS时, 走代理的域名无法正常过滤问题
可能很多小伙伴都和我一样, 为了隐私以及一点微乎其微的广告过滤功能而跑了 AdGuard Home 抑或是其它的本地DNS服务, 或者是类似于 NextDNS, AdGuard DNS 这类现成的支援过滤功能的DNS提供商.
如果是普通上网那么没什么问题, DNS拦截方面非常顺利, 指哪打哪.
但是!(◎_◎;) 如果使用了突破次元壁垒的软件来搭配DNS过滤服务时, 你就会发现仅仅只有一部分拦截是有效的, 很多拦截了的网站访问很是顺利, 很是奇怪啊🤔
问题原因
以下内容均为个人理解, 可能不具备严谨及专业性
当使用Surge的增强模式时, 所有请求都会返回一个 Fake-IP来立即响应DNS请求以缩短DNS开销 (本地和远端代理服务器各一次).
当设备开始访问一个网页时会先进行 TLS握手, 发起一个 Client Hello 报文 (其中的IP地址为Surge返回的Fake-IP), 此时请求到了Surge后会检查 SNI字段 来获取去往的虚拟主机名, 然后根据获取到的域名来分流.
当匹配到一个需要走代理的域名后, Surge会通过隧道直接传递请求到远端代理服务器, 由远端服务器来解析域名的真实IP地址, 从而获得近服务器的解析以达到最快的访问速度 (这种情况下, 默认情况下DNS请求是不会走设置的上游DNS服务器的).
而如果规则没有匹配上或者是匹配上了国内规则, 最终走Direct, 那么此时Surge会在本地通过上游DNS解析, DNS过滤正常生效.
解决方案
在Surge上, 当你的DNS解析结果为 0.0.0.0, 那么处理行为就为 Reject, 所以我们得确保你的DNS拦截后的行为是否为返回 A记录: 0.0.0.0
AdGuard Home 上保持默认拦截方式即可 (设置 - DNS设置 - 拦截模式[默认] )
打开 Surge for Mac 客户端, 进入规则, 在最前面添加一条
IP-CIDR: 0.0.0.0/32, REJECT-TINYGIF的规则
在进行规则判定时,Surge 自上往下依次尝试匹配每条规则,如果遇到了一条 IP 类型的规则(包含 IP-CIDR, IP-CIDR6, GEOIP, ASN 等规则),且该规则没有 no-resolve 参数修饰,那么 Surge 将进行 DNS 解析后再进行匹配。
所以当在最前面添加一条 IP-CIDR 匹配规则时会把所有域名解析成IP进行匹配, 当匹配到 0.0.0.0 时则REJECT, 以达到过滤效果
PS: 本地的查询只影响分流, 走代理时对端服务器还会查询一次, 所以只增加了DNS的开销

如果还使用了 NextDNS 作为 AdGuard Home 的上游服务器, 那么还要设置一条规则来确保过滤生效, 因为当 NextDNS 拦截后返回的记录不是 0.0.0.0, 而是特定的 BlockPage 的IP地址.
如果这些地址走了代理, 那么就会导致 BlockPage 无法显示, 所以要把这些地址都添加到第二条规则中走 DIRECT.
## 地址来源
## https://www.netify.ai/resources/applications/nextdns
84.17.62.242
45.136.155.42
84.17.45.154
68.183.91.243
34.101.84.129
142.250.180.179
135.181.102.167
116.203.147.209
5.161.43.197
23.81.246.121
76.76.21.123
67.219.103.157
207.148.84.39
216.238.105.217
155.138.130.135
199.247.16.158
139.84.131.131
139.84.167.156
65.20.73.163
167.179.109.118
95.179.134.211
149.28.148.222
141.164.63.208
209.250.226.191
45.32.219.28
144.202.60.17
137.220.51.178
208.72.155.33
45.32.79.76
45.77.162.235
207.246.91.188
104.238.181.28
149.248.36.234

以上就是教程全部内容了, 如有帮助请留言点赞~🥳

评论区