DNS劫持指的是“一些设备”会拦截DNS解析请求,并将错误的DNS信息返回给主机;DNS污染指的是“一些设备”会将错误的域名信息下发至公共的DNS服务器中(比如114),这样用户在进行DNS查询的时候将会得到错误的IP信息。针对这两个问题,可通过搭建基于TCP且加密的DNS代理服务器来解决。
1、安装依赖包libsodium
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.10.tar.gz tar -xvzf libsodium-1.0.10.tar.gz cd libsodium-1.0.10/ CFLAGS="-O3 -fPIC" ./configure make && make install echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf sudo ldconfig
2、安装dnscrypt-proxy
wget https://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.7.0.tar.gz tar -xvzf dnscrypt-proxy-1.7.0.tar.gz cd dnscrypt-proxy-1.7.0/src/libevent-modified/ CFLAGS="-O3 -fPIC" ./configure make && make install cd ../.. echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf sudo ldconfig ./configure make -j 2 && make install
3、运行并加入开机自启动
[root@localhost ~]# /usr/local/sbin/dnscrypt-proxy -R yandex -E --local-address=0.0.0.0 -d [root@localhost ~]# vi /etc/rc.d/rc.local #添加如下一行 /usr/local/sbin/dnscrypt-proxy -R yandex -E --local-address=0.0.0.0 -d [root@localhost ~]# chmod +x /etc/rc.d/rc.local
/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv中存放了已经支持dnscrypt查询的公共dns,上边表达式中的“-R yandex”代表的是这个文档中第一列的name。
4、验证
由以下运行结果可以看到,在解析facebook.com这个网址时,本机上的dnscrypt-proxy能够解析正确,而114和8.8解析出来的都是被墙篡改过的IP。
[root@localhost ~]# dig facebook.com +short @114.114.114.114 93.46.8.89 [root@localhost ~]# dig facebook.com +short @8.8.8.8 93.46.8.89 [root@localhost ~]# dig facebook.com +short @8.8.8.8 78.16.49.15 [root@localhost ~]# dig facebook.com +short @127.0.0.1 157.240.3.35 [root@localhost ~]# dig facebook.com +short @127.0.0.1 157.240.3.35
如果想用这个DNS代理的话,只需要将系统的DNS服务器配置为该服务器即可(该服务器上需要开放 UDP:53端口)。当然,以上只解决了DNS解析的问题,“一些设备”还有IP封锁等等机制来过滤相应网站。