Zavier's Blog

无污染DNS服务器搭建方法

背景


虽然有相当一部分境外网站被屏蔽,但是很大一部分并没有真正地被屏蔽,而仅仅是DNS查询结果被污染,如维基百科,一些主机服务商的官网等等。只要获得该网站的真实IP地址,并通过https即可正常访问(使用http则连接会被重置)。因此可以通过自行架设一台无污染的DNS来解决该问题。此方法不适用于访问谷歌,油管等IP被封锁的网站,但能解决谷歌RECAPTCHA人机验证框架异常,一些国外API不能正常使用的问题,以及访问被屏蔽但支持https的网站。


DNS服务器架设


使用到的软件:dnscrypt-wrapper,dnscrypt-proxy,dnsmasq

前提:需要两台vps主机,一台在境内,一台在境外,另外主机最好选择香港主机,这样方便将部分大站的域名解析到香港的CDN服务器,提升访问速率。

基本思路:利用dnscrypt-wrapper在海外服务器上建立DNS加密服务端,在国内服务器运行dnscrypt-proxy软件,与海外服务器形成加密隧道,同时将DNS查询报文通过加密隧道传输,从而避免DNS查询结果被污染,实现纯净,无污染DNS


境内服务器配置(dnscrypt-proxy)


安装libsodium,libevent

yum install -y libevent gcc make wget 
wget  https://download.libsodium.org/libsodium/releases/libsodium-1.0.13.tar.gz
tar -zxvf libsodium-1.0.13.tar.gz
cd libsodium-1.0.13
./configure
make && make install 
echo /usr/local/lib >/etc/ld.so.conf.d/usr_local_lib.conf
ldconfig

安装dnscrypt-proxy

wget https://github.com/jedisct1/dnscrypt-proxy/releases/download/1.9.5/dnscrypt-proxy-1.9.5.tar.bz2
tar -jxvf dnscrypt-proxy-1.9.5.tar.bz2
cd dnscrypt-proxy-1.9.5
./configure
make && make install


境外服务器配置(dnscrypt-wrapper)


安装libsodium,libevent

yum install -y  gcc make wget 
wget  https://download.libsodium.org/libsodium/releases/libsodium-1.0.13.tar.gz
tar -zxvf libsodium-1.0.13.tar.gz
cd libsodium-1.0.13
./configure
make && make install
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar -zxvf libevent-2.1.8-stable.tar.gz && cd libevent-2.1.8-stable
./configure --prefix=/usr
make && make install 
echo /usr/local/lib >/etc/ld.so.conf.d/usr_local_lib.conf
ldconfig

下载dnscrypt-wrapper源码和编译

wget https://github.com/cofyc/dnscrypt-wrapper/releases/download/v0.3/dnscrypt-wrapper-v0.3.tar.bz2
tar -jxvf dnscrypt-wrapper-v0.3.tar.bz2 && cd dnscrypt-wrapper-v0.3
make configure
./configure
make install

配置dnscrypt-wrapper

生成提供程序密钥对并记下公钥(provider_public_key)

mkdir -p /etc/dnscrypt-wrapper && cd /etc/dnscrypt-wrapper/
dnscrypt-wrapper --gen-provider-keypair
#忘记公钥可使用命令
dnscrypt-wrapper --show-provider-publickey --provider-publickey-file <your-publickey-file>
#生成一个时间有限的密钥并生成证书
dnscrypt-wrapper --gen-crypt-keypair --crypt-secretkey-file=1.key
dnscrypt-wrapper --gen-cert-file --crypt-secretkey-file=1.key --provider-cert-file=1.cert   --provider-publickey-file=public.key --provider-secretkey-file=secret.key

启动dnscrypt-wrapper,-d参数在后台运行,-VV参数进入Debug调试模式

dnscrypt-wrapper --resolver-address=8.8.8.8:53 --listen-address=0.0.0.0:443 --provider-name=2.dnscrypt-cert.<yourdomain>  --crypt-secretkey-file=1.key --provider-cert-file=1.cert --logfile=/var/log/dnscrypt-wrapper.log


境内dnscrypt-proxy对接服务端配置

dnscrypt-proxy --local-address=127.0.0.1:5353 --resolver-address=Your IP Address:Port --provider-name=2.dnscrypt-cert.<yourdomain> --provider-key=<provider_public_key> -d --logfile=/var/log/dnscrypt-proxy.log --ephemeral-keys
#--ephemeral-keys参数为混淆,dnscrypt-proxy启动完毕后修改dnsmasq中分流选项

至此,服务端和客户端软件均已配置完毕,最后一个步骤即完成dnsmasq的配置

yum -y install dnsmasq

#dnsmasq的配置文件默认在/etc/dnsmasq.conf

#以下是参考配置

listen-address=172.18.3.28  #填写监听DNS请求的网卡所对应的IP地址
log-facility=/var/log/dnsmasq.log  #生成日志文件
log-async=20  #异步log
cache-size=1024  #设置最大缓存条数
conf-dir=/etc/dnsmasq.d/ #指定其他配置文件的目录
resolv-file=/etc/updns.conf #设置上游DNS,可选
strict-order  #严格按照指定的上游DNS顺序查询
log-queries  #记录所有DNS请求到日志中


#要达到无污染的效果,可下载已知的被污染域名名单,并将他们加入/etc/dnsmasq.d/*.conf(任意新建一个以.conf为后缀的文件名)中

DNSMASQ分流规则(点击查看,已经过BASE64编码)

#举例:将*.google.com域名,通过加密隧道,即127.0.0.1:5353转发到海外服务器,通过海外DNS解析。

vi /etc/dnsmasq.d/dnslist.conf
server=/.google.com/127.0.0.1#5353


#dig测试dnscrypt-proxy连接状态

yum install -y bind-utils

测试命令

dig @127.0.0.1 -p 5353 OpenVPN.net

返回的正常结果

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.el6_9.4 <<>> @127.0.0.1 -p 5353 openvpn.net
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8539
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;openvpn.net.                   IN      A
;; ANSWER SECTION:
openvpn.net.            299     IN      A       104.20.194.50
openvpn.net.            299     IN      A       104.20.195.50
;; Query time: 266 msec
;; SERVER: 127.0.0.1#5353(127.0.0.1)
;; WHEN: Wed Jan  3 15:40:46 2018
;; MSG SIZE  rcvd: 72


该文章为本站原创,转载请注明来源,本文永久链接:https://zavierlab.com/post/46.html


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 2017-2019 Zavier的博客.网站地图