众所周知很多网络协议在设计之初是没有考虑安全问题,比如http和我们今天要说的DNS协议,http现在有了https已经能够很好地保障通信过程中传递信息安全问题,然而DNS协议依旧是裸奔状态。
打开wireshark,筛选DNS协议,我们就能清楚看到本机向DNS服务器发送了哪些域名请求

同样的, 我们的运营商通过分析这些流量也能清楚看到我们访问了哪些站点,更有甚者通过劫持或者修改域名解析的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项目地址:https://github.com/DNSCrypt/dnscrypt-proxy
下载并解压安装包其中dnscrypt-proxy为主应用文件,dnscrypt-proxy.toml为主的配置文件,我们可以将example-dnscrypt-proxy.toml文件更名为dnscrypt-proxy.toml。

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中添加映射关系项

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

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

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

query.log日志中记录该域名

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

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

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

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

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

解析结果未返回IP地址

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

添加国内加密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:
官网:https://www.dnspod.cn/products/publicdns
DoH配置:https://doh.pub/dns-query
阿里加密DNS:
DoH配置:https://dns.alidns.com/dns-query
但在dnscrypt-proxy中需要使用DoH Stamp进行编码。
可以使用官方提供的在线工具:https://dnscrypt.info/stamps/
使用如下:

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


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


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

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

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

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

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

好啦,关于dnscrypt-proxy就介绍到这里,如果觉得自己配置比较麻烦,可以回复关键字"dnscrypt-proxy"获取已配置好的应用,双击安装即可以使用。
本文链接:https://kinber.cn/post/6002.html 转载需授权!
推荐本站淘宝优惠价购买喜欢的宝贝:

支付宝微信扫一扫,打赏作者吧~
