阅读前注意
该文章是为旧项目编写的文档,其中的信息已经过时,仅为存档保留。

上次说了 dnscrypt-wrapper的编译过程,这次来说说使用方法。

先来看看程序自带的Usage(-h):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Usage: dnscrypt-wrapper [options]

-h, –help show this help message and exit
–gen-cert-file generate pre-signed certificate
–gen-crypt-keypair generate crypt key pair
–gen-provider-keypair generate provider key pair
–show-provider-publickey show provider public key
–show-provider-publickey-dns-records show records for DNS servers
–provider-cert-file=<str> certificate file (default: ./dnscrypt.cert)
–provider-name=<str> provider name
–provider-publickey-file=<str> provider public key file (default: ./public.key)
–provider-secretkey-file=<str> provider secret key file (default: ./secret.key)
–crypt-secretkey-file=<str> crypt secret key file (default: ./crypt_secret.key)
–cert-file-expire-days=<int> cert file expire days (default: 365)
-a, –listen-address=<str> local address to listen (default: 0.0.0.0:53)
-r, –resolver-address=<str> upstream dns resolver server (<address:port>)
-o, –outgoing-address=<str> address to use to connect to dns resolver server (<address:port>)
-U, –unauthenticated allow and forward unauthenticated queries (default: off)
-u, –user=<str> run as given user
-l, –logfile=<str> log file path (default: stdout)
-p, –pidfile=<str> pid stored file
-d, –daemonize run as daemon (default: off)
-V, –verbose show verbose logs (specify more -VVV to increase verbosity)
-v, –version show version info

翻译(chinese大神你为啥不写个中文版guide(╯‵□′)╯︵┻━┻):(红色的为运行必需项,紫色的是生产配置必须项)

用法:dnscrypt-wrapper[选项]

-h, ;help #显示此帮助信息并退出

;gen-cert-file  #生成预签名证书

;gen-crypt-keypair #生成crypt密钥对

;gen-provider-keypair  #生成provider密钥对

;show-provider-publickey #当你忘了Provider public key的时候,可以用这个命令指定 ;show-provider-publickey ;provider-publickey-file ./public.key找回Provider public key。

;show-provider-publickey-dns-records #新版本参数,结合 ;crypt-secretkey-file和 ;provider-cert-file参数使用,显示对应的证书二进制,用来添加在你的域名的TXT记录。

;provider-cert-file=XXX #指定证书文件,默认当前目录的dnscrypt.cert文件,如果2.dnscrypt-cert.yourdomain.com添加了证书二进制的TXT记录,则不必附带这个选项,程序会会通过 provider-name 从 DNS 的txt记录那里获取证书。

;provider-name=XXX #dnscrypt证书服务域名。例如2.dnscrypt-cert.yourdomain.com

;provider-publickey-file= XXX #r导入provide公钥文件,默认指定当前目录的public.key文件。

;provider-secretkey-file=XXX #导入provider私钥文件,默认指定当前目录的secret.key文件。

;crypt-secretkey-file==XXX #导入crypt私钥文件,默认指定当前目录的crypt_secret.key文件。

;cert-file-expire-days=XXX #证书文件有效天数(默认值:365)

-a, ;listen-address=XXX #本地地址监听(默认值:0.0.0.0:53),提供DNS服务的端口

-r, ;resolver-address=XXX #上游DNS解析服务器(<地址:端口>例如8.8.8.8:53)

-o, ;outgoing-address=<str#新增参数, 指定用哪个网卡ip地址去连接上游DNS

-U, ;unauthenticated #允许和转发未经身份验证的查询(默认值:关闭)

-u, ;user =XXX #用指定用户运行

-l, ;logfile = XXX #日志文件路径(默认:标准输出到屏幕)

-p, ;pidfile =XXX  #指定PID存储的文件路径

-d, ;daemonize #开启守护进程(默认关闭)

-V, ;verbose #显示详细日志(指定更多V增加详细程度,例如-VVV)

-v, ;version #显示版本信息

首先,我们要生成provider-key:

1
2
3
4
cd ~
mkdir dnskey
cd dnskey
dnscrypt-wrapper --gen-provider-keypair

然后你在当前目录下会生成public.key和 secret.key文件。provider-key这是一个长期不改变的密钥对,确保secret.key文件安全地备份存储好。

注:这个 23E6:E208…:F709:9FE1就是Provider public key!dnscrypt客户端dnscrypt-proxy需要用到这个provider-key,例如dnscrypt-proxy ;provider-key= 23E6:E208…:F709:9FE1,请注意保存。如果你忘记了Provider public key,可以通过public.key来找回:

1
dnscrypt-wrapper --show-provider-publickey --provider-publickey-file ./public.key

然后生成用来加密DNS请求的crypt key和证书文件,证书是有期限的,默认是365天:

1
2
3
4
5
dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=./ssl.key


Generate crypt key pair... ok.
Secret key stored in ./ssl.key

接着用上面的ssl.key密钥对生成预签名证书:

1
dnscrypt-wrapper --gen-cert-file --crypt-secretkey-file=./ssl.key --provider-publickey-file=./public.key --provider-secretkey-file=./secret.key --cert-file-expire-days=365 --provider-cert-file=ssl.cert

然后在当前目录下就得到了ssl.cert证书文件。

简单解析下参数, ;gen-cert-file表示要生成证书文件,然后生产证书文件需要提供前面生成的crypt key,就用 ;crypt-secretkey-file=./ssl.key,还需要前面生成的public.key和 secret.key文件,所以用 ;provider-publickey-file=./public.key ;provider-secretkey-file=./secret.key指定,最后 ;cert-file-expire-days这个参数是可选的,指定证书的过期时间,默认是365天过期,然后 ;provider-cert-file=这个指定证书的保存路径。

这里值得注意的是,图中还有写record for XXX,这是给你做DNS记录的,这个可做可不做,如果你做域名的TXT记录的话,首先你要有个域名,然后增加2.dnscrypt-cert.yourdomain.com的TXT记录为图中的二进制证书内容,那么得到的效果是,启动dnscrypt-wrapper不必附带 ;provider-cert-file=XXX这个选项去指定证书文件,因为程序会会通过 provider-name 从 DNS 的TXT记录获取证书。

举个官方例子,

可以使用dig TXT 2.dnscrypt-cert.opendns.com这个命令查看opendns的TXT记录是这样的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<<>>DiG 9.10-P2 <<>> TXT 2.dnscrypt-cert.opendns.com;global options:+cmd
Got answer:
->>HEADER<<- opcode:QUERY.status: NOERROR,id:61832
;flags:qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: O, ADDITIONAL: O
;QUESTION SECTION:
2.dnscrypt-cert.opendns.com. IN TXT 
; ANSWER SECTION:
2.dnscrypt-cert.opendns.com.3600 IN TXT "DNSCN000\001\000\600^\145\9193 
89217uV229\N6\15813\131115179224wn141323255215*i\174\150133192\018169M128127161166%031a58202 2172220171233213Xbz\001236e 147\1691429\021007130001Ew=u94252184131ir220\152162\019h1700
0.v0241\023 2151800 232 205caDwdYM3wS 237002 S237002 U 2065 223

:Query time:1853 msec
SERUER:192 168 1 1#53(192 168 1.1)
WHEN: Tue Apr 28 20:44:59 ?Diú±êx?ê±?? 2015
:MSG SIZE rcud:182

如果你忘记或者错过了上面显示的TXT记录,可以使用 ;show-provider-publickey-dns-records参数来获取对应的TXT记录:

1
2
3
4
5
6
7
root@wwwl-75026:~/dnskey#dnscrypt-wrapper-r--crypt-secretkey-file=ssl.key--provider-cert-file=./ssl.cert--show-providen -publickey-dns-records
[20107] 08Jun20:12:50.399[notice][main.c:425] TXT record for signed-certificate:*Record for nsd:
2.dnscrypt-cert 8640日 IN TXT "DNSC\000\001\000\日003\024\140/q\146\024\169F\002\026\150\194xWiB\154\128\201\127\2] 
9\019\131\234.0Y\1991\142s\245\213\154\248ME\021a\127>;0\148\176\011\151&\189\142(\1274\1800W\008\178\214M\200\169\000\018\146w3\189\168>\208\135c\1280;\238\234\238\129\142T\198\180;S+}\211\209\237\140\169\1359\018\146W3\189\168>\208Y9 \001Y9 \001\026S\129"
* Record for tinvdns:
2.dnscrypt-cert:DNSC\000\001\000\0003\030\214/q\222\030\251F\002\032\226\302xWiB\232\200\311\177\333\023\203\352.0Y\3071\216s\365\325\232\370ME\025a\177\076\0720\224\260\013\227\046\275\216(\1774\2640W\010\262\326M\310\251\000\022\222w3\275\250\06\320\207c\200o;\356\352\356\201\216T\306\264;S+}\323\321\355\214\251\2079\022\222w3\275\250\076\320Y9 \001Y9 \001[\032S\20I
:86400 root@wwwl-75026:~/dnskey# 

不过,一般情况下这个证书字符串太长了,很多dns解析商一般不允许设置这么长的字符串……当然你也可以搭建本地dns服务器来储存这玩意……但是因为dnscrypt-wrapper有 ;provider-cert-file=XXX的命令手动指定证书文件,所以这步不是必须的。当然如果可以通过域名来读取证书,那么在部署这个服务的时候会方便很多,以及证书的更新也方便很多。

经过上面的步骤应该生成了以下的文件:

root@:~/dnskey# ls
public.key secret.key ssl.cert ssl.key 然后用生成的证书启动程序:

1
2
cd ~/dnskey
dnscrypt-wrapper -r 8.8.8.8:53 -a 0.0.0.0:5353 --crypt-secretkey-file=ssl.key --provider-cert-file=./ssl.cert --provider-name=2.dnscrypt-cert.03k.org -VVV

解释下命令参数:-r 8.8.8.8:53是使用8.8.8.8:53作为dns的上游服务器,-a 0.0.0.0:5353是指定对外服务的端口,你可以随便定义只要不跟其他端口冲突例如1253;-VVV是显示调试信息,其他的都是导入key和证书,指定服务名,服务名provider-name这个参数是必须的,即使你没有域名,你也要随便指定一个2.dnscrypt-cert.xxxx.com。

注意:2.dnscrypt-cert.xxx.com前面的**2.dnscrypt-cert.是固定的,不能改成3.dnscrypt-cert**.什么的。

好了现在我们要来测试下是否搭建成功了正常运行了,原作者的readme是这样测试的:

1
2
3
# --provider-key 在上一步骤已经生成
$ ./dnscrypt-proxy -a 127.0.0.1:55 --provider-name=2.dnscrypt-cert.yechengfu.com -r 127.0.0.1:54 --provider-key=4298:5F65:C295:DFAE:2BFB:20AD:5C47:F565:78EB:2404:EF83:198C:85DB:68F1:3E33:E952
$ dig -p 55 google.com @127.0.0.1

简单解释下,就是在服务器本地运行dnscrypt客户端dnscrypt-proxy,指定127.0.0.1端口55,然后用dig命令(一个查询dns的命令,centos没有),指定本地的127.0.0.1服务器55端口去解析google.com的域名,解析成功就工作正常了。

但是这个对我来说麻烦死了……因为我得又来编译一次dnscrypt-proxy的客户端(本来打算编译的,下了代码然后说明不怎么详细,然后……然后折腾了半天懒得弄了),centos又没有dig命令,我还得编译一个dig……OMG……烦(懒)死了,而且测试完本地我还得测试远程实际好不好使,我们直接一步到位吧,用本地的windows客户端去测试远程的服务器,能用就是绝对好使的了!

首先我们要配置下防火墙,对外开放你定义的端口(例如上面我定义的是5353):

1
iptables -A INPUT -p tcp -m tcp --dport 5353 -j ACCEPT

然后我们就可以下载windows客户端去测试了,由于dnscrypt的官网被墙,我这里直接提供现成的客户端给大家测试用吧,省得找了,想要自己找的话可以去dnscrypt.org上翻去。

打开客户端目录下的dnscrypt-resolvers.csv文件,仿照上面的数据格式添加一行:

NameFull nameDescriptionLocationCoordinatesURL
lingsanDNSlingsanDNSlingsanDNS不填不填不填
VersionDNSSEC validationNo logsNamecoinResolver address
1nonono你的ip:端口
Provider nameProvider public keyProvider public key TXT record
2.dnscrypt-cert.yourdomain.com上面生成的照填,我字标红的那个不填

其实参照其他的随便填就是,关键参数是Provider public key和Resolver address。

然后你打开客户端就会看到新的dns选项了,点击启用,把网卡dns改成本地127.0.0.1就可以测试了。
这还不够,我们还要测试dns是否是从远程送过来的,这样才能达到代理加速的效果!怎么测试呢?告诉你,万能的淘宝在国外是有服务器的(剁手无国界),我们看看淘宝的解析结果如果是在国外就是达到理想效果了! nslookup www.taobao.com

-d开启守护进程啊添加开机启动啊计划任务啊那些我就不罗嗦了,自己用心去体会吧~