Total Pageviews

Wednesday, 6 July 2016

编译dnscrypt-wrapper,搭建防污染的DNS服务器

众所周知,在我朝局域网当中想要获取国外 DNS 信息,必定会遭到关键字污染。为此,有人想到了使用异常端口,比如5353而不使用 DNS 专用端口53——因为目前 Girl Friend Wall 只污染53;也有人想到了使用 TCP 连接请求,因为 DNS 的应答机制决定了它会接受第一个返回的响应,后边的会被丢弃,而使用 TCP 则强制接受选定的数据包;甚至有人想到了把那些发污染包的 IP 地址收集起来,然后在客户端处过滤——加入黑名单,这样最终就会收到正确的响应包。
总之,这些都不是什么长久之计,使用 OpenDNS 出品的 dnscrypt 是一个不错的选择,它在 DNS 的基础之上增加了加密的选项,让你的 DNS 请求能够像使用 ssl 一样加密地请求服务器,这样便从根本上杜绝了 DNS 污染问题。

那么问题来了,就算你是用了 dnscrypt,可是服务器 IP 被认证了呢?答案是——这就是最近 dnscrypt 越来越不给力的原因。另外,OpenDNS 虽然捣鼓出了这么个给力的玩意儿,但是他们却没有公开服务端——也就是说你必须使用那有限的几个国外的服务器,速度绝对快不到哪里去。

所以,我朝有大神根据 dnscrypt 的客户端写出了牛逼闪闪的服务端:dnscrypt-wrapper,
https://github.com/Cofyc/dnscrypt-wrapper

我们现在可以自己在境外服务器搭建一个 dnscrypt 服务器,本地来连接就好了——你可以选择一个速度比较快的 vps。

教程开始

作为演示,我这里的服务器是 ubuntu 14.04.

编译安装库文件

dnscrypt-wrapper 依赖 libsodium 和 libevent2;前者一般源里没有,后者一般默认版本不是2而是比较旧的1,我们得先来手动编译这两个库。

我们从这里http://download.libsodium.org/libsodium/releases/下载 libsodium 的最新版本 ,截止到本文完成时,最新版本为1.0.10:

然后我们从这里下载 libevent2 ,这里我们选择 2.0.22 稳定版:

编译 dnscrypt-wrapper

搞定两个依赖库之后,就可以开始编译 dnscrypt-wrapper 啦:
如果你在 make configure 这一步出错,你可能需要先安装 autoconfig:
如果没什么问题,那么就可以开始编译安装了:

至此编译完成。

dnscrypt-wrapper 的配置和使用

这里系统会反馈一个指纹信息,这个信息就是客户端配置时候需要的“provider_public_key”!所以一定要保存好。
类似这个样子:
然后,我们使用命令生成有时限的加密密钥对以及生成预签名证书:
这样,dnscrypt-wrapper 就已经准备好了。
使用命令来运行 dnscrypt-wrapper,用“-VV”来显示比较详细的 debug 信息:
其中的 --provider-name= 并不必要,可以随便填写,但注意必须是以 2.dnscrypt-cert. 开头:)
然后去国内 vps 安装客户端:
安装好后配置一下:
保存后使用如下命令重启客户端服务,如果你的端口没有被防火墙撸掉,那服务器那边就应该能够看到 debug 信息,表示已经有客户端接入。
使用命令来测试一下:
多次重复命令,发现获取到的 IP 均相同且为真正的正确 IP 地址,服务生效。

创建脚本

每次直接运行命令多少有些不方便,即使使用“-d”来后台执行,一样让人感到不适,我们使用 shell 来创建一个启动 dnscrypt-wrapper 的脚本。
以后则只需要使用 sh start-dnscrypt-wrapper.sh 就可以启动了。
——至于关闭嘛,使用命令“killall dnscrypt-wrapper”。

相关帖子:http://briteming.blogspot.com/2016/04/macdnscrypt-proxy.html