首先我先贴俩图,看看现象

我解析下敏感域名

bind +  DNSCrypt 实现安全加密转发,避免DNS污染_ opendns

bind +  DNSCrypt 实现安全加密转发,避免DNS污染_ opendns_02

巧了,我瞎蒙的随便一个国外地址都特么是DNS ?  

当然不是,因为祖国的出口伫立着一套高端设备,,,,   不说了,敏感了!



    此法的基本思路是避免DNS污染和DNS劫持。(不关心原理的同学请跳过此段)众所周知,GFW的一大凶器是在DNS上做文章。关于DNS污染和DNS劫持的区别,请参考这篇文章。概括地说,DNS劫持是通过DNS服务器返回虚假的IP地址实现的,我们只需将本机使用的DNS服务器改成8.8.8.8等国外服务器即可。但这种方法无法避免DNS污染,因为DNS查询默认使用UDP协议,而墙可以干扰我们与DNS服务器的通信。今天介绍的dnscrypt-proxy,则开设本地的DNS服务器,对DNS请求进行加密(墙无法干扰加密后的请求),从国外的DNS服务器获取正确的IP地址后反馈回来,是为DNS代理的基本原理。

但这也就决定了,此法不可能成为通用的×××方法,因为GFW对于有些网站是直接通过IP地址屏蔽的。


平台:RHEL 6.6 x64 (CentOS)

dns服务器:Bind Server


yum源并没有dnscrypt-proxy,所以只能编译安装了

首先下载 dnscrypt-proxy

下载地址http://download.dnscrypt.org/dnscrypt-proxy/  (巧,这也被qiang了)


另外需要安装 libsodium依赖库 (我这里选择的是libsodium-0.5.0-mingw.tar.gz)

下载地址http://download.libsodium.org/libsodium/releases/ 

wget http://download.libsodium.org/libsodium/releases/libsodium-0.5.0-mingw.tar.gz 
tar xf libsodium-0.5.0-mingw.tar.gz
cd cd libsodium-0.5.0
CFLAGS="-O3 -fPIC" ./configure
make  &&  make install
ldconfig

依赖库装好了,下面来安装 dnscrypt

上传dnscrypt-proxy-1.4.0.tar.gz至服务器

tar xf dnscrypt-proxy-1.4.0.tar.gz
cd dnscrypt-proxy-1.4.0
cd src/libevent-modified/
CFLAGS="-O3 -fPIC" ./configure
make && make install
cd ..
cd ..
./configure 
make -j 2 && make install

安装好了

 dnscrypt-proxy -h   //显示帮助信息可用选项
 -a	--local-address=...   //监听的本地地址[端口] (不指定端口默认监听在53端口)
 -d	--daemonize        //后台运行(不提示错误信息)
 -R	--resolver-name=...  //选定的国外加密解析服务器
 -T	--tcp-only         //仅以TCP协议运行(默认监听在udp tcp上)
 -k                        //手动指定密钥串
 -V	--version          //版本信息

常用就这几个选项   更多详细帮助 man  dnscrypt-proxy


bind +  DNSCrypt 实现安全加密转发,避免DNS污染_ opendns_03

运行 dnscrypt-proxy 提示有错误,但是请注意这一条

这个文件中有默认的已经支持dnscrypt查询的公共dns  opendns也在其中。

我们来查看下这个文件  dnscrypt-resolvers.csv

bind +  DNSCrypt 实现安全加密转发,避免DNS污染_dns加密_04

第一行定义的是列标题,每个字段用逗号隔开,每一行开头就是 resolver_name  


用法如下

dnscrypt-proxy --resolver-name=resolver_name --local-address=127.0.0.1:40 --daemonize
dnscrypt-proxy -R resolver_name -a 127.0.0.1:40 -d   //简写,监听在本地udp tcp40端口,远端加密dns选用resolver_name


bind +  DNSCrypt 实现安全加密转发,避免DNS污染_ opendns_05

不加-d参数 默认是前台运行


然后如果需要局域网开启加密访问,记得在iptables开启相应端口

最后在其他电脑上查询一下看是否生效,

dig www.youtube.com @*.*.*.* -p 3535
; <<>> DiG 9.10-P2 <<>> www.youtube.com @*.*.*.* -p 3535
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32356
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.youtube.com.               IN      A
;; ANSWER SECTION:
www.youtube.com.        86400   IN      CNAME   youtube-ui.l.google.com.
youtube-ui.l.google.com. 900    IN      CNAME   youtube-ui-china.l.google.com.
youtube-ui-china.l.google.com. 180 IN   A       173.194.72.138
youtube-ui-china.l.google.com. 180 IN   A       173.194.72.102
youtube-ui-china.l.google.com. 180 IN   A       173.194.72.100
youtube-ui-china.l.google.com. 180 IN   A       173.194.72.113
youtube-ui-china.l.google.com. 180 IN   A       173.194.72.101
youtube-ui-china.l.google.com. 180 IN   A       173.194.72.139
;; Query time: 872 msec
;; SERVER: *.*.*.*#3535(*.*.*.*)
;; WHEN: Sun Jan 11 99:29:00 ?D1ú±ê×?ê±?? 2015
;; MSG SIZE  rcvd: 205

解析是对了,但是并不代表 FQ  所以,这主要是搭配其他工具来实现FQ 。