解决 DNS 污染

一、背景知识

DNS污染 作为防火长城两种主要屏蔽方式之一(另一种是 IP封锁),其主要工作原理是:

防火长城对所有经过骨干出口路由的域名查询进行入侵检测,一经发现与黑名单关键词相匹配的域名查询请求,防火长城会马上伪装成目标域名的解析服务器给查询者返回虚假结果。由于通常的域名查询没有任何认证机制,而且域名查询通常基于的UDP协议是无连接不可靠的协议,查询者只能接受最先到达的格式正确结果,并丢弃之后的结果。

DNS Query

由此可知,防火长城进行入侵检测的基础是域名查询请求采用UDP协议,无任何认证机制。下文介绍的 dnscrypt-proxy 采用TCP协议发送域名查询请求,并对请求进行加密,避免了防火长城的入侵检测和投毒污染,从而可查询真实的IP地址。

二、解决DNS污染

1. Install libsodium from source

官网下载 libsodium 源码包,解压缩后编译安装:

./configure
make && make check
sudo make install
sudo ldconfig

2. Install dnscrypt-proxy from source

官网下载 dnscrypt-proxy 源码包,解压缩后编译安装:

./configure
make && make check
sudo make install

3. Configure dnscrypt-proxy as service

sudo touch /etc/init/dnscrypt.conf
sudo vim /etc/init/dnscrypt.conf
sudo ln -s /lib/init/upstart-job /etc/init.d/dnscrypt
sudo adduser --system --quiet --home /run/dnscrypt --shell /bin/false --group --disabled-password --disabled-login dnscrypt
sudo vim /etc/rc.local

按照以上步骤创建配置文件 /etc/init/dnscrypt.conf 并按照该 gist 内容编辑之。然后创建运行 dnscrypt-proxy 的用户,并在启动文件 /etc/rc.local 中加入以下两行,确保 dnscrypt-proxy能够开机正常启动。

mkdir /run/dnscrypt                                                             
service dnscrypt start

安装成功后重新启动 dnscrypt-proxy ,并确认其已正确安装。

sudo killall -KILL dnscrypt-proxy
sudo service dnscrypt start
dnscrypt start/running, process 1337

Network Manager Screenshot

最后,还需要配置一下网络接口,Ubuntu用户可按照如上截图配置 NetworkManager ,然后重启之。其中 DNS Servers 那一栏和 /etc/init/dnscrypt.conf 中的 local-address 参数必须保持一致。本文选择 OpenDNS 作为DNS服务器,对应 resolver-name 参数为 opendns ,你也可以从 dnscrypt-resolvers.csv 中选择其他DNS服务器。完成以上配置后可访问 这个网站 检查 dnscrypt-proxy 是否正常工作。

三、结束语

随着防火长城的不断升级,其自动化、智能化程度不断提高。作为一名有节操有追求的挨踢从业者,只有不断去理解其工作原理,对症下药,才能更加轻松的翻越长城,融入世界。