使用DNSCrypt解决DNS污染问题

  1. 云栖社区>
  2. 博客>
  3. 正文

使用DNSCrypt解决DNS污染问题

技术小阿哥 2017-11-27 11:20:00 浏览1109
展开阅读全文

前言

在开始写这篇文章之前,先要普及一个知识中国长城防火墙(英文名:Great Firewall of China)好伟大的样子,是XX专门用来对网民进行网络封锁,闭关锁国的的工具。最近一批google.com, youtube.com, facebook.com, dropbox.com等一批国外知名网站,均无法正常访问,就是拜其所赐。它所实现的主要屏蔽技术有IP封锁,关键字过滤,域名劫持与污染以及HTTPS证书过滤四种。本文主要通过dnscrypt技术反其dns劫持与污染。

先了解一下什么是DNS劫持和DNS污染,其实两者并不是一个概念。大家都知道主机之间的通信通过ip来标识对方主机,但是IP不容易记忆,后来提出了域名的概念,比如www.baidu.com, 域名与IP之间就是通过DNS解析联系起来,实现了域名与IP之间的映射。这份映射关系存储在DNS服务器上。

什么是DNS劫持

DNS劫持一般发生在某些网络运营商身上,DNS劫持就是劫持了DNS服务器,获取DNS服务器的控制权。通过某些手段修改这些域名的目的解析IP地址。DNS劫持通过篡改DNS服务器上的数据,给用户返回一个错误的查询结果来实现的。

DNS劫持症状:在某些地区的用户在成功连接宽带后,首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。还有就是曾经出现过用户访问Google域名的时候出现了百度的网站。这些都属于DNS劫持

应对DNS劫持,只需要在网络配置中把DNS服务器地址配置成国外的DNS服务器地址就可以解决,比如谷歌提供的DNS服务器地址:8.8.8.8 8.8.4.4

什么是DNS污染

DNS污染是一种让一般用户由于得到虚假目标主机IP而不能与其通信的方法,是一种DNS缓存投毒攻击(DNS cache poisoning)。其工作方式是:由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,因此DNS的查询非常容易被篡改,通过对UDP端口53上的DNS查询进行入侵检测,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回虚假结果。

DNS污染症状:目前一些被禁止访问的网站很多就是通过DNS污染实现的,例如YouTube、Facebook、DropBox等网站。

对于DNS污染,普通用户是不能够通过简单地设置国外DNS服务器就能解决的。需要用到这篇所讲的重点:DnsCrypt-proxy,我通过这种方式解决了对Dropbox的访问封锁。

先看下谷歌DNS服务器(8.8.8.8)对www.dropbox.com的解析情况

wKiom1kuJWSRYDCcAAB7TjnvwKo066.png-wh_50

电信DNS服务器(114.114.114.114)对www.dropbox.com的解析情况

wKiom1kuJa6SFrDTAAB-NaYm58M556.png-wh_50

www.dropbox.com均被解析到 59.24.3.173 这个IP, 这是一个韩国IP,使用站长ping工具检测一下,全部超时,我只截取其中的一部分,如果服务器不通或禁ping,则全部超时。

wKiom1kuJiXSmk1_AAGrx3Kd0KM701.png-wh_50

无论我们是从谷歌服务器还是电信服务器拿到的数据包,在到手之前均被长城防火墙进行篡改。为了防止这份数据被篡改,我们需要借助DNSCrypt这款工具保证我们的dns查询数据包不被篡改。

DNSCrypt是OpenDNS发布的加密DNS工具,可加密DNS流量,阻止常见的DNS攻击,如重放攻击、观察攻击、时序攻击、中间人攻击和解析伪造攻击。DNSCrypt支持Mac OS和Windows 以及Linux,是防止DNS污染的绝佳工具。我在Mac OS与Centos上均做了尝试。

安装DNSCrypt-proxy

Mac OS 与 Linux 上的安装非常简单,按照项目主页的文档一步一步操作即可。

Mac Os 可使用brew工具一键安装
brew install dnscrypt-proxy 

Linux安装
#安装依赖
cd /usr/local/src/
wget "https://download.libsodium.org/libsodium/releases/libsodium-0.5.0.tar.gz"tar -xzvf libsodium-*.tar.gzcd libsodium-*
./configure
make
make install
ldconfigecho /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.confcd /usr/local/src/
wget "http://download.dnscrypt.org/dnscrypt-proxy/dnscrypt-proxy-1.4.0.tar.bz2"bunzip2 -cd dnscrypt-proxy-*.tar.bz2 | tar xvf -cd dnscrypt-proxy-*
./configure
make
make install

启动dnscrypt_proxy

dnscrypt_proxy的用法可以通过man 8 dnscrypt_proxy查询

在启动之前,需要注意一项,因为dnscrypt_proxy作为查询代理是对通信加密的,这也要求目的dns服务器也要支持,项目主页提供一份可用列表

启动脚本

wKioL1kuJvXibaf9AAB0d6vEkL8332.png-wh_50

最后我们可以看到建立了本机53端口与目的主机443端口的链接;按照官网的提示,如果我们安装成功,当我们执行dig txt debug.opendns.com,会看到debug.opendns.com. 0 IN TXT "dnscrypt enabled (......)"这样的输出。

wKiom1kuJ1KS3lYmAAC77ttgy8E164.png-wh_50

恭喜,我们成功了,下一步我们只需要把本机的dns服务器指向到这台代理即可

再来查看下www.dropbox.com的解析情况

wKioL1kuJ5izNYp-AACe1PoFdo0443.png-wh_50

访问一下 https://www.dropbox.com

wKioL1kuJ8iBMJRhAAD33e9XbtU317.png-wh_50



本文转自 2012hjtwyf 51CTO博客,原文链接:http://blog.51cto.com/hujiangtao/1931529,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注