如何避免 Brook 的 虚拟 DNS 不生效

Updated at: 2024-02-24

x

虚拟 DNS 的目的是什么

Brook 通过虚拟 DNS 来拿到域名,进而去做一些基于域名的任务,比如用 hosts 指定 IP 等。

虚拟 DNS 的 TTL 是 60 秒,Brook 断开再重新连接会重置虚拟 DNS 数据,但是一些不遵守标准的 App 可能自己缓存超过 60 秒很久才重新查询 DNS,这样 Brook 重新连接重置虚拟 DNS 后 App 仍然尝试连接之前的虚拟 IP 就会失败,点名批评 Instagram,可以用脚本让指定域名不走虚拟 DNS。

虚拟 DNS 是如何工作的

  1. Brook 客户端首先会配置系统 DNS
  2. 当其他应用进行域名查询时,会向系统 DNS 的 53 端口通过 UDP 协议进行查询
  3. Brook 会拦截 UDP 53 端口的数据,并向查询者返回一个虚拟 IP
  4. 查询者拿到虚拟 IP 后,会继续连接此 IP
  5. Brook 此时拿到要连接的 IP 后,如果发现是虚拟 IP,则会将 IP 转换为域名。因为 Brook 在内存里保存了一个虚拟 IP 和域名映射的字典
  6. 然后 Brook 将域名地址传递到服务端,让服务端来进行解析和连接

可以看得出来,本地全程都不知道真正要连接的 IP 地址。

以上只是用最简单的流程来方便理解虚拟 DNS 是如何工作的,实际流程还有规则脚本等很多其他环节。

如何避免虚拟 DNS 不生效

上面我们知道了虚拟 DNS 是通过拦截系统 UDP 53 端口来工作的,所以我们要避免应用或系统走其他方式查询域名。

Block google secure DNS

Brook 图形客户端默认会配置系统 DNS 为 google DNS。同时内置了一个 Block google secure DNS 模块,开启可以防止系统或应用升级为 google secure DNS。

关闭系统或应用的安全 DNS

Android

Settings -> Network & internet -> Private DNS -> Off

Windows

Settings -> Network & Internet -> Your Network -> DNS settings -> Edit -> Preferred DNS -> Unencrypted only -> 8.8.8.8

Chrome 手机版

Settings -> Privacy and security -> Use secure DNS -> Off

Chrome 电脑版

Settings -> Privacy and security -> Security -> Use secure DNS -> Off

更多知识

明明你的系统 DNS 配置的普通 DNS,但是最后查询却走的是安全 DNS。 这是因为,系统或浏览器会向系统 DNS 发起一个查询,来询问是否支持 DOH,如果支持后续就会升级使用 DOH 来查询。比如 8.8.8.8

brook dnsclient --dns 8.8.8.8:53 -d _dns.resolver.arpa -t SVCB
;; opcode: QUERY, status: NOERROR, id: 52504
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 4

;; QUESTION SECTION:
;_dns.resolver.arpa.    IN       SVCB

;; ANSWER SECTION:
_dns.resolver.arpa.     86400   IN      SVCB    1 dns.google. alpn="dot"
_dns.resolver.arpa.     86400   IN      SVCB    2 dns.google. alpn="h2,h3" dohpath="/dns-query{?dns}"

;; ADDITIONAL SECTION:
dns.google.     86400   IN      A       8.8.8.8
dns.google.     86400   IN      A       8.8.4.4
dns.google.     86400   IN      AAAA    2001:4860:4860::8888
dns.google.     86400   IN      AAAA    2001:4860:4860::8844

可以看见,8.8.8.8 支持 DOT 和 DOH。 不过放心,如果开启了虚拟 DNS, Brook 客户端会帮你阻止了这个 SVCB 查询

明明你的系统 DNS 配置的普通 DNS,即使没有升级查询,但是最后查询却走的是安全 DNS。 这里因为系统和浏览器内置了一些主流安全 DNS 的信息,比如如果发现 DNS 是 8.8.8.8,知道这个 DNS 也支持 DOH,就不会再问,而是直接使用 DOH。这时我们可以用脚本阻断这些连接,比如 Block google secure DNS


评论