使用dnscrypt-proxy搭建无污染的dns服务

DNS劫持与DNS污染

ISP域名劫持
中国大陆的互联网服务提供商经常劫持部分域名,转到自己指定的网站,以提供自己的广告,污染方式为劫持域名不存在时返回的NXDOMAIN记录(Non-existent domain)返回自己服务器的ip,从而跳转至自己的服务器上显示广告等内容。

由于通常的域名查询没有任何认证机制,而且域名查询通常基于无连接不可靠的UDP协议,查询者只能接受最先到达的格式正确结果,并丢弃之后的结果,所以容易伪造。

引用知户https://www.zhihu.com/question/55097471/answer/149283034

DNS劫持:DNS查询一般是建立在传输层UDP协议的基础上的,特点是速度快,但是不可靠。首先你不得不承认国内互联网存在一股黑暗势力(黑客或者不可描述)。你设置了国外递归DNS。1、你想要访问 http://baidu.com 黑暗势力看见了,http://baidu.com 跟他关系不错,他睁一只眼闭一只眼,什么都不做,任由国外DNS服务器把 http://baidu.com 的真实地址返回给你。2、如果你想要访问 http://google.com 黑暗势力就不干了,虽然国外DNS服务器把 http://google.com 的真实IP地址返回给你了,但是黑暗势力立马把这条消息拦截了下来,并且伪造了一个假的IP地址给你。因为UDP不可靠,先到先得,你收到了黑暗势力给你的假IP。电脑前的你依然大呼烫烫烫。

如何解决

使用DNSCrypt协议,它是加密了的DNS协议,协议格式见https://github.com/jedisct1/dnscrypt-proxy/blob/master/DNSCRYPT-V2-PROTOCOL.txt

有很多的DNS服务器都支持这种协议,列表

实践安装配置dnscrypt-proxy

以在windows的环境下为例

下载

https://download.dnscrypt.org/dnscrypt-proxy/
当然这个地址好像被屏蔽了

测试当前配置

进入文件目录,运行

1
.\dnscrypt-proxy.exe dnscrypt-proxy.conf

没有出现53端口被点用的情况就正常

把 DNSCrypt proxy 做为一个持久服务

运行这个的时候,是要有管理员权限运行的。
否则会出现下面的错误:

[ERROR] Unable to set up registry keys for the config file
[ERROR] Unable to install the service
[ERROR] Make sure that you are using an elevated command prompt and that the service hasn’t been already installed

我的做法是把运行命令保存为bat文件
再点右键,选以管理员身份运行

1
2
3
cd C:\dnscrypt-proxy-win64
.\dnscrypt-proxy.exe --install-with-config-file=dnscrypt-proxy.conf
pause

卸载服务

也是需要管理员权限

1
.\dnscrypt-proxy.exe --uninstall

共享本地的DNS代理

修改配置文件dnscrypt-proxy.conf
把里面# LocalAddress 127.0.0.1:53的这段,修改为LocalAddress 0.0.0.0:53

在别的设备上设置dns的地址为共享机器的ip即可。

验证

修改本地的dns服务器地址为自己部署的地址。
使用nslooup 去查,会到得到是从哪个服务器返回的数据
比如使用默认的dns服务器

1
2
3
4
5
6
7
8
C:\Users\ff>nslookup www.google.com
服务器: UnKnown
Address: 192.168.2.158

非权威应答:
名称: www.google.com
Addresses: 2a00:1450:4009:80d::2004
216.58.204.36

参考