众所周知,近几年的互联网一直在朝着安全化、隐私化发展,而传统的DNS早已是互联网隐私建设的毒瘤:存有大量隐私信息、明文、能够被轻易的拦截的篡改,对DNS的控制也成为了一种简单高效的拦截手段。而由于我朝的特殊原因和情况,几乎每一个互联网的参与者都在受到各个方面受到污染和限制,在这其中传统的DNS正是重要的帮凶。一个合适的DNS解决方案是在王土之下安全私密上网必不可缺的一环。

虽然现在DoT和DoH已经逐步得到国内外的响应,但我们上网不只是追求的安全,慢如蜗牛也是我们无法接受的。因而DNS的设置陷入了两难的境地:

  1. 只使用国外的公共DNS:查询慢,国内网站优化差,DNS成为上网速度瓶颈。而选择未加密的DNS则会污染。
  2. 使用国内公共DNS:污染,并且大部分均不支持加密后的DNS,ISP仍然可能劫持。

所以我需要一个国内外查询分流方案,并且由于DNS只是一个网上冲浪的”基建“,我还希望这个方案的实现足够安静,只作为电脑的一种选项在我需要的时候存在,前几天,在V站的讨论下我成功建设了一套类似的系统。

Telescope DNS是一个基于Go编写的小程序,可以实现对DNS请求的转发与分组,支持DoT和DoH,并且可以同时进行多个请求来获得更加权威的DNS查询结果。还有一个重要的优点是 它只是个简单的命令行程序,简单到连个自动挂后台的选项都没有,自然其成为了我的第一选择。

下载程序,默认的配置虽然可以即开即用,但其中全部的解析都是指向传统DNS服务器,这很明显无法满足本人对”隐私“的需求,因为只要还是明文传递信息,ISP都能继续劫持。而且,国内的阿里云已经开放了DoH的查询接口,为此,我修改规则如下:

listen = ":53"
gfwlist = "gfwlist.txt"
cnip = "cnip.txt"

[hosts]
# 防止doh回环解析,预置服务器ip
"cloudflare-dns.com" = "1.1.1.1"
"dns.alidns.com" = "223.5.5.5"
"dns.google" = "8.8.8.8"
"rubyfish.cn" = "118.126.68.223"
"uw-dns.rubyfish.cn" = "115.159.131.230"

[groups]
  [groups.clean]
  concurrent = true
  doh = ["https://dns.alidns.com/dns-query","https://rubyfish.cn/dns-query","https://uw-dns.rubyfish.cn/dns-query"]

  [groups.dirty]
  doh = ["https://cloudflare-dns.com/dns-query","https://dns.google/dns-query"]

你也可以自行按照官方文档定制配置。

这样所有的DNS请求都会走Https加密传输,并且根据 Telescope DNS 的规则,在遇到哥(G)佛我名单中的网站会自动改用国外组的DNS进行查询,否则取国内查询的结果。这样完美了吗?并不,难道我还要每次开机都留个cmd窗口在旁边吗,我需要一个方案来让命令行程序在后台运行。

EasyService是一个这种工具,它可以将一个命令行程序注册成系统服务,本意是为了python和node这种脚本程序后台长期运行提供的一种简单的解决方案,不过这里我们的程序也是合适的。


svc create ts-dns

##复制程序到ts-dns/worker文件夹

svc install

这样就成功在后台建立了一个可以开机自启的自动分流的DNS了。修改系统dns到127.0.0.1即可正式启用此软件,而且最让我省心的是:它很安静,默默做事情。在这个广告无下限传播的世界,这种安静才是最难得的。

最后,如果看完这个还是不会给自己搞一个DNS方案,可以直接使用本人的一键安装脚本