dnscrypt-proxy:让本地DNS解析更安全、更快速

众所周知很多网络协议在设计之初是没有考虑安全问题,比如http和我们今天要说的DNS协议,http现在有了https已经能够很好地保障通信过程中传递信息安全问题,然而DNS协议依旧是裸奔状态。

打开wireshark,筛选DNS协议,我们就能清楚看到本机向DNS服务器发送了哪些域名请求

v2-18b5ac44969db0ac1ddb8a276e403f67_1440w

同样的, 我们的运营商通过分析这些流量也能清楚看到我们访问了哪些站点,更有甚者通过劫持或者修改域名解析的IP地址,将我们请求的域名解析到其指定的站点,这在专业术语上叫DNS劫持或者DNS污染。

那有没有办法能让我们的DNS解析更加安全呢,其实是有的,如同https一样,现在主流的加密DNS有两种协议,一种叫DoH(DNS over HTTPS)另外一种叫DoT(DNS over TLS),前者是将域名解析过程使用https协议进行通信,后者是在DNS协议基础上使用TLS对通信包进行加密,类似https是在http基础上进行加密。笔者更加推荐使用DoH协议,因为其使用https通信兼容性更广,因为使用https其目标通信端口为443在一些限制访问端口的网站环境中能正常使用。DoT默认使用853端口,兼容性会差一些。

现在的Win11已经原生支持DoH配置,但笔者体验下来效果并不好,一些配置也不够灵活,这里推荐在本地安装支持DoH、DoT协议的DNS代理服务并将本机的DNS配置修改为127.0.0.1,这样域名解析会先通过明文的DNS协议请求本机的DNS服务,然后通过加密的https协议请求远端服务器获取解析结果。虽然中间多了一层DNS转换,但实际测试下来对访问速度影响并不大。

DNS代理服务应用有很多,比如今天要介绍的dnscrypt-proxy,还有AdguardTeam的dnsproxy和AdGuardHome。都可以实现加密DNS代理的需求,它们之间也各有区别,笔者以后有时间展开和大家聊聊,今天重点介绍dnscrypt-proxy。

dnscrypt-proxy项目地址:github.com/DNSCrypt/dns

下载并解压安装包其中dnscrypt-proxy为主应用文件,dnscrypt-proxy.toml为主的配置文件,我们可以将example-dnscrypt-proxy.toml文件更名为dnscrypt-proxy.toml。

v2-b1ee4c4c56d5e3a4ef5dd3c160eb3957_1440w

dnscrypt-proxy.toml中配置功能很多,这里介绍一些主要的功能配置。

全局配置:
#监听端口,默认为回环地址的53端口,保持默认即可,注意端口不要冲突
listen_addresses = [‘127.0.0.1:53’]

负载均衡模式配置:
#因为一般都会配置多个加密的DNS服务器,这些服务器的访问速度有快有慢,应该选择哪种负载均衡策略需要我们来进行配置。
#支持的模式有下面几种:

  • ‘wp2’ (默认模式): 从两个随机选择的候选服务器中,根据实时往返时间(RTT)和成功率,筛选出性能更优的服务器。
  • ‘p2’: 从两台速度最快的服务器中随机选择一台。
  • ‘ph’: 从速度最快的一半服务器中随机选择。
  • ‘p<n>’: 从速度最快的N台服务器中随机选择一台,n由我们配置。
  • ‘first’: 总是选择最快的服务器
  • ‘random’: 从所有的服务器中随机选择一台。

#推荐使用p2模式,从最快的两台服务器中随机选择一台。
lb_strategy = ‘p2’

功能项配置:
#启用热重载,后续修改cloaking-rules.txt、blocked-names.txt、blocked-ips.txt配置文件后,不需要重新启动服务
enable_hot_reload = true

日志项配置:
#设置日志等级
log_level = 2

#设置日志文件
log_file = ‘dnscrypt-proxy.log’

启动和网络项配置
#使用默认DNS服务器,用于解析加密DNS域名
bootstrap_resolvers = [‘8.8.8.8:53’, ‘114.114.114.114:53’]

#用于判断网络是否通畅
netprobe_address = ‘8.8.8.8:53’

转发规则配置:
#可以设置转发规则,可以指定特定域名由特定DNS解析,如:*.xiaobaogua.com 开头域名由 10.0.0.1 DNS处理
forwarding_rules = ‘forwarding-rules.txt’

DNS重写配置:
#类似本机hosts文件,可以自定义域名和IP的映射关系
cloaking_rules = ‘cloaking-rules.txt’
#在cloaking-rules.txt中添加映射关系项

v2-1d3a874f39107c103efc2bf9aa714376_1440w

域名解析为关系项设置的IP地址

v2-bda94a1e82268978807e609cd8099d50_1440w

查询日志配置:
#DNS查询日志保存到文件
file = ‘query.log’
#日志结果如下:

v2-b6657e36c542515c1ae5bfc94be3acbf_1440w

可疑的查询日志配置:
#可疑的查询日志保存文件名,主要是那些不存在解析记录的域名会被单独保存
file = ‘nx.log’
#测试一个不存在的域名

v2-7af3a99449b06927fc5684120ba5a805_1440w

#query.log日志中记录该域名

v2-c0f6daf6c6f001121e756117ef041ea2_1440w

#nx.log中会单独记录该域名

v2-51a10208c0a0fbd096755190cfc05c71_1440w

阻止域名解析项配置:
#阻止解析的域名清单,可以使用通配符
blocked_names_file = ‘blocked-names.txt’

v2-65fe11c4995823f0234ccad94826a62e_1440w

#配置域名后,当请求该域名时,会返回0.0.0.0的解析IP地址

v2-e39cf2613231f3a787e857a9cd10c679_1440w

#可以配置将阻止解析域名记录到日志文件
log_file = ‘blocked-names.log’
阻止IP解析项配置:
#与上面类似,这里配置阻止解析的IP,如果解析域名的IP命中该清单,就会被阻止
blocked_ips_file = ‘blocked-ips.txt’

v2-07eec4535d3f4c8418b53d8bbc177c61_1440w

#在清单中添加要阻止的IP地址

v2-bc659980722914684f86005e6df2c496_1440w

#解析结果未返回IP地址

v2-c9bc7ea20acfb09f4c5c07622f8ad070_1440w

加密服务器配置:
dnscrypt-proxy默认引用一些加密DNS服务器清单,实际测试发现这些服务器因为是在国外,解析速度很慢,特别影响速度。这里推荐添加国内的加密DNS服务器。

我们先将加密DNS源给注释掉

v2-6273da6ed918709dbf8e622b2d505030_1440w

添加国内加密DNS服务器地址配置:

[static.alidns-doh1]
stamp = "sdns://AgAAAAAAAAAACTIyMy41LjUuNQAJMjIzLjUuNS41Ci9kbnMtcXVlcnk"

[static.alidns-doh2]
stamp = "sdns://AgAAAAAAAAAACTIyMy42LjYuNgAJMjIzLjYuNi42Ci9kbnMtcXVlcnk"

[static.dnspod-doh1]
stamp = "sdns://AgAAAAAAAAAADDEyMC41My41My41MwAMMTIwLjUzLjUzLjUzCi9kbnMtcXVlcnk"

[static.dnspod-doh2]
stamp = "sdns://AgAAAAAAAAAACjEuMTIuMTIuMTIACjEuMTIuMTIuMTIKL2Rucy1xdWVyeQ"

这里需要说明一下,常见的DoH配置格式如下:

腾讯加密DNS:
官网:dnspod.cn/products/publ
DoH配置:doh.pub/dns-query
阿里加密DNS:
DoH配置:dns.alidns.com/dns-quer
但在dnscrypt-proxy中需要使用DoH Stamp进行编码。
可以使用官方提供的在线工具:dnscrypt.info/stamps/
使用如下:

v2-dbe0ad6ce69ecf7d29f9843a3edf715d_1440w

也可以在该网站下查询公开的加密DNS服务器:dnscrypt.info/public-se

v2-7f98942f1c6f6c531398580bc5f98836_1440w
v2-3472d61b210b2dbcd2183d46ef23fca1_1440w

完成上面配置后,我们只需要双击 service-install.bat 就可以将其安装为服务。

v2-86640cf2f380495d4e8f349ccc3cb64e_1440w
v2-bf3f018a069e74994b6c9e3b4f90f9fa_1440w

随后在网络配置中将DNS服务器配置修改为127.0.0.1。

v2-5a01d3767d86582382cee1c3b1526a44_1440w

再次抓包看看:
在以太网卡上已经抓取不到任何的DNS流量了

v2-65f5901ea8858baac8766841cd2f1b6c_1440w

修改为回环网卡可以看到本机的DNS请求通信

v2-2ffeaca0e990a014ef15d0f900fc8095_1440w

筛选阿里DNS的IP地址,可以看到网络通信已使用加密https包,无法看到明文信息

v2-e2d87c1a0068b0f62b1b1978bc5eaee4_1440w

至此,我们通过在本地搭建加密DNS代理服务,将本地DNS请求转换为https加密协议方式进行通信,有效地降低了DNS请求被劫持和污染的风险。
但是!这并不意味着我们上网访问的域名就不会被知晓了。在https请求中,有一个SNI机制,全称叫Server Name Indication,就是在TLS握手时会以明文的形式确认请求的域名证书信息,这个通信过程中域名信息是明文展示的,通过流量可以抓取到请求域名信息。

v2-ffb4e8089cea048067ba049ec0b86877_1440w

好啦,关于dnscrypt-proxy就介绍到这里,如果觉得自己配置比较麻烦,可以回复关键字”dnscrypt-proxy”获取已配置好的应用,双击安装即可以使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注