2016年4月10日星期日

centos部署DNSCrypt服务器及客户端配置

DNSCrypt是一款对DNS协议加密的应用,需要服务器和客户端配合使用,先看下维基百科上的介绍(https://en.wikipedia.org/wiki/DNSCrypt):

DNSCrypt is a network protocol designed by Frank Denis and Yecheng Fu, which authenticates Domain Name System (DNS) traffic between the user's computer and recursive name servers.

Although multiple client and server implementations exist, the protocol was never proposed to the Internet Engineering Task Force (IETF) by the way of a Request for Comments (RfC).

DNSCrypt wraps unmodified DNS queries and responses in a cryptographic construction in order to detect forgery. It also mitigates UDP-based amplification attacks by requiring a question to be at least as large as the corresponding response. DNSCrypt can also be used for access control.

DNSCrypt的官网是:https://dnscrypt.org/

以前大陆GFW防火墙还不完善的时候,它主要使用DNS污染来屏蔽一些网站,很多网友会使用配置本地host文件的方法来直接访问谷歌和facebook、twitter等网站,也有网友使用DNSCrypt等软件来规避污染。但随着封锁的加大,谷歌的ip基本被封完了,而DNSCrypt公开的服务器也连接不上了,所以很多网友都转用vpn或者shadowsocks。之前我一直使用Cisco的加密DNS,但现在所有DNSCrypt公布的服务器已经被墙,所以只能自己去搭建一个。

先说下为什么要使用DNSCrypt,既然现在很多人都使用vpn或者shadowsocks那么为什么还要用DNSCrypt呢?我主要的用途,是偶尔会下载P2P有一些开源代码等学习资源,很多都是在国外的一些学术机构,比如台湾国立大学、日本筑波大学或者美国的一些大学的服务器上,而这些服务器,有些是被封锁的(不知道为什么要封锁学术服务器),如果你把P2P下载软件上挂vpn或者shadowsocks,那么会很慢,不挂又没有连接速度。另外如果有的网友玩一些美服等外服的游戏,他们的客户端下载服务器被DNS污染,而且国内又没有下载,只能去国外下,如果客户端很大,挂vpn下载会非常慢。这时候需要一个干净的DNS,例如谷歌的8.8.8.8或者OpenDNS,但是这两者现在封的都很严重,谷歌大陆不能直接访问,OpenDNS很多访问也不稳定。使用DNSCrypt可以避免DNS污染。

DNSCrypt的官方服务器源码没有公开,你在官网上找到的“服务器源码”其实是国人Cofyc (github主页:https://github.com/Cofyc)根据客户端写的一个服务器。

首先,我们需要搭建自己的服务器,
1.安装依赖库

yum install autoconf gettext libltdl* libevent git libevent*

写这篇文章的时候,yum提供的lib event,版本已经是2.0.21,满足DNSCrypt服务器代码编译要求,所以我就直接yum下安装了,没有去编译libevent源码

2.下载libsodium源码编译(libsodium在yum下的版本倒是满足DNSCrypt编译要求,但我折腾了半天并没有什么卵用,所以还是用源码来编译)
先到http://download.libsodium.org/libsodium/releases/看一下官网最新的代码,我这里是1.0.10,

cd ~

wget http://download.libsodium.org/libsodium/releases/libsodium-1.0.10.tar.gz

tar xf libsodium-1.0.10.tar.gz

cd libsodium-1.0.10

./configure --libdir=/usr/lib

make

make install

ldconfig

这里我曾经按照http://03k.org/centos-make-dnscrypt-wrapper.html来操作,但是在编译DNSCrypt时,仍然提示找不到库,这个人遇到的问题和我一样:https://github.com/jedisct1/dnscrypt-proxy/issues/8,但我用了ldconfig命令,仍然不行,/usr/local/lib下也有库,仍然不能编译,所以在配置的时候直接把路径写成/usr/lib

3.下载DNSCrypt服务器代码编译:

cd ~

git clone --recursive git://github.com/Cofyc/dnscrypt-wrapper.git

cd dnscrypt-wrapper

make configure

./configure

make install

install -d -m 755 '/usr/local/bin'

install -p dnscrypt-wrapper '/usr/local/bin'



4.生成provider-key(这里我偷懒直接把key扔sbin目录,你可以自定义位置,注意文件夹访问权限即可):

cd /usr/local/sbin/

mkdir dnscryptcert

chmod 755 dnscryptcert

cd dnscryptcert

dnscrypt-wrapper --gen-provider-keypair

会生成public.key和secret.key,为了后面操作方便,不要修改这两个文件的名字,因为后面有些命令有默认参数,用默认的名字可以少打点字。。。这步会显示一段类似于

这样的key,这个key记下来后面配置客户端有用。

5.生成crypt key和签名证书

dnscrypt-wrapper --gen-crypt-keypair
dnscrypt-wrapper --gen-cert-file

注意,最新版的DNSCrypt服务器代码,只会生成crypt_secret.key一个文件,老版本的还会生成crypt_public.key

6.将启动DNSCrypt和防火墙端口开放写入开机自启动

vi /etc/rc.d/rc.local

增加:

dnscrypt-wrapper —resolver-address=8.8.8.8:53 —listen-address=0.0.0.0:5353 —provider-name=2.dnscrypt-cert.TheSeventhHeaven.com —crypt-secretkey-file=/usr/local/sbin/dnscryptcert/crypt_secret.key —provider-cert-file=/usr/local/sbin/dnscryptcert/dnscrypt.cert -d

firewall-cmd —permanent —zone=public —add-port=5353/tcp

firewall-cmd —permanent —zone=public —add-port=5353/udp


解释一下,8.8.8.8是谷歌的DNS服务器,53是它的端口,当然我的需求已经足够,因为我的服务器在国外,如果你想要折腾,自己搭建DNS的话,那这里的ip:端口可以换成你自己服务器的配置。
0.0.0.0:5353代表监听本地服务的5353端口,而5353端口就是对外服务的端口,就是你的DNSCrypt客户端连接你服务器的哪个端口,这个端口可以自定义,只要不和系统已用端口冲突就行。
这里有一个坑,就是name必须是这个格式:2.dnscrypt-cert.自定义英文.com,否则会出错,开始没注意,后来阅读了README文件,发现作者写了这个:

我防火墙用的是firewall-d,如果你用的是iptable,就把上面firewall那两句换乘iptable的命令

现在服务器已经配置好了,重启下服务器,然后用

ps -A | grep dns

看下DNSCrypt服务有没有起来,起来的话就成功了。


现在服务器有了,但是我们需要客户端,我是在mac下用的客户端(windows的同理,客户端下载在上面提到的官网有),客户端的配置文件路径是/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv,(注意:1.0.10及之前版本的mac客户端是这个路径,1.0.11版本的路径已经改为/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/share/dnscrypt-proxy/)直接在桌面shift+command+G复制粘贴路径即可,这个csv文件,我们要编辑它,mac自带的numbers可以打开可以编辑,但是无法保存成csv格式,所以你可以在microsoft office里编辑或者用其他的csv编辑软件,这个文件打开里面主要编辑这些列就行了,其他的可以不管:

Name、Resolver address、Provider name、Provider public key

Name是用来在客户端里显示用的
Resolver address填你刚才配置的服务器的IP和端口,例如123.123.123.123:5353。注意这里我被输入法坑了,mac自带输入法默认打开中文,我输入冒号的时候,输入的全角符号,后来在windows下才看到这个冒号是个方块。。。
Provider name填第6步里name的值,例如我的是:2.dnscrypt-cert.TheSeventhHeaven.com
Provider public key填第4步里生成的key,即刚才第4步记下的那个类似于红框里的key,如果忘记了,可以用这个命令找回:

dnscrypt-wrapper —show-provider-publickey-fingerprint —provider-publickey-file=/usr/local/sbin/dnscryptcert/public.key


配置好后保存,然后打开系统偏好设置里的DNSCrypt选择你的服务器连接即可,如果没有出现,关闭系统偏好设置重新开一次。

至此DNSCrypt已经配置好了

没有评论:

发表评论