哪里有压迫哪里就有反抗啊
上篇讲到用dnscrypt-proxy加密转发dns请求,看上去很美好的样子..可是问题来了dnscrypt-proxy默认提供的dns地址列表中的大部分地址都已经被和谐了,没有服务端再怎么加密都没有用
于是乎我们只有自己搭建一套dnscrypt服务器,虽然dnscrypt-proxy是官方开源的,但是server端并没有开源出来,好在有大神Cofyc参照client写了一个开源的版的server,dnscrypt-wrapper
下载源码进行编译,注意需要 libsodium和libevent 2库.Linode的CentOS源有两个库,直接yum安装就可以,编译是还需要安装autoconf
编译过程看看README就好了,比较简单
根据README中安装成功后,新建一个目录,在目录生成两个provider key文件 public.key secret.key
注意把公钥的串先记下来,之后会用到
再生成一个有时限的安全key和它对应的证书,我里命名为20151212(今天双12,哈哈)
dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=20151212.key
dnscrypt-wrapper --gen-cert-file --crypt-secretkey-file=20151212.key --provider-cert-file=20151212.cert
完成后,就可以写一个脚本启动dnscrypt-wrapper了
#!/bin/bash
dnscrypt-wrapper –resolver-address=8.8.8.8:53 –listen-address=0.0.0.0:port \
–provider-name=2.dnscrypt-cert.xxxxx.com (这个地方可以随便写,但是必须以2.dnscrypt-cert.开头) \
–crypt-secretkey-file=20151212.key –provider-cert-file=20151212.cert \
-d
OK,ps看看进程在不在,没有问题之后,我们来配置一下openwrt端的client的配置文件
参照dnscrypt-proxy给出的默认dns地址列表,在/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv
新在/usr/share/dnscrypt-proxy/下新建一个文件dnscrypt-resolv-private.csv
写入以下信息
Name,Full name,Description,Location,Coordinates,URL,Version,DNSSEC validation,No logs,Namecoin,Resolver address,Provider name,Provider public key,Provider public key TXT record
herowong,herowong,herowong,,,,1,no,no,no,yourhost:port,2.dnscrypt-cert.xxxx.com,publickey,
注意,第一行的表头是必须的,要不然会无法启动,错误信息可以用logread -f查看,第二行就是刚才在服务端生成各种key用到的信息,这里用逗号分隔每个参数,不需要填的可以空着,具体可以看
前三个参数Name,Full name,Description好像是必须的吧?随便填..
Description,Location,Coordinates,URL 不必须
Version 1
DNSSEC validation,No logs,Namecoin 都是no
Resolver address 填写server的IP和端口
Provider name 填写2.dnscrypt-cert.开头的一个名字,与服务端启动时–provider-name给出的一致
Provider public key 填写之前生成的公钥
Provider public key TXT 不是必须的
保存后,再修改dnscrypt-proxy配置 /etc/config/dnscrypt-proxy
完成后重启dnscrypt-proxy
这里还需要注意一点的是,默认情况下dnscrypt-proxy是通过UDP请求远端服务器的,运营商可能会对加密的UDP请求进行干扰,时不时对指定端口给你请断个网什么的,别问我怎么知道的,操蛋的电信就是这样干的!!!所以最好的办法是让dnscrypt-proxy转发的DNS请求由UDP转成TCP,dnscrypt-wrapper在服务端是同时监听TCP和UDP端口的,只需要在dnscrypt-proxy的启动脚本/etc/init.d/dnscrypt-proxy 中加上-T或者–tcp-only的参数,记得要重启服务,当然用TCP来请求DNS的速度会比原来的慢,如果你用的运营商没有这么恶心,用UDP就足够了
tcpdump抓包看下果真全是tcp请求了
如果成功的话,用dig命令查看dns是否解析正确^_^
参考: