Total Pageviews

Sunday 1 February 2015

防止‘DNS欺骗/投毒/污染’的软件

一、前言

对我们做技术的人来说,墙的存在就像你在写字的时候旁边有一个人用棍子不断捅你。无数的时间和精力被花在对付它身上由于这个事件的缘故,我很少写博客文章了。

二、DNS欺骗原理

近些年来中国大陆出现多次因为DNS欺骗造成的大规模网络瘫痪事件。DNS欺骗,也称为域名服务器缓存污染(DNS cache pollution),或着域名服务器缓存投毒(DNS cache poisoning),是指一些刻意制造或无意中制造出来的域名服务器封包,把域名指往不正确的IP地址。DNS欺骗的危害是巨大的,常见被利用来钓鱼、挂马之类的。
  一般来说,在互联网上一般都有可信赖的域名服务器,但为减低网络上的流量压力,一般的域名都会把外部的域名服务器资料暂存起来,待下次有其他机器要求 解析域名时,可以立即提供服务。一旦有关网域的局域域名服务器的缓存受到污染,就会把网域内的电脑导引往错误的服务器或服务器的网址。域名服务器缓存污染 可能是透过域名服务器软件上的设计错误而产生,但亦可能由别有用心者透过研究开放架构的域名服务器系统来利用当中的漏洞。
  为了解决DNS欺骗,业界提出了DNSSECDNScurv 。可以看看微软在测试实验室中演示 DNSSEC。某些极权国家,如伊朗、朝鲜等,招安并豢养了官方黑客,用于对国内民众封锁网络,掩盖历史真相。由于在防火墙中加入太多IP和端口过滤规则,会使得防火墙负荷过重,于是便丧心病狂的使用DNS欺骗这种滥杀无辜的大规模杀伤性技术

三、DnsSpeeder(只有windows版)

网站 被DNS干扰后,我使用nslookup指令,查询了多个DNS服务器,中国大陆的DNS都无返回值,国外的DNS都查询正确。据此推测是GoDaddy的某些DNS服务器被IP或者端口被临时封锁了,这种国家流氓行为以前也曾有过。
  国内的所谓安全DNS,如114DNS只能防范电信联通的广告劫持,用处不大。而直接设置为OpenDNS和Google又会影响国内网站的速度,所以必须用DNS解析缓存软件(DnsSpeeder,AcrylicHosts,FastCache),其中以DnsSpeeder最强大好用,还支持正则表达式,可以设置hosts屏蔽。
  在Win7系统中,不要把DnsSpeeder放在系统盘运行,可能会因为权限不够而运行出错。DnsSpeeder需要占用53端口 如果有其他软件占用了53端口就用不了。友情提醒:DnsSpeeder需要使用53端口,要避免其他软件占用了53端口。


四、Hosts订阅

Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”, 当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则 系统再会将网址提交DNS域名解析服务器进行IP地址的解析。
  和 DNS 不同的是,计算机的用户可以直接对 Hosts 文件进行控制。Hosts 文件可以将已知的广告服务器重定向到无广告的机器(通常是本地的IP地址:127.0.0.1)上来过滤广告;减少对 DNS 服务器的访问来加快访问速度并减少带宽消耗;拦截一些恶意网站的请求,从而防止访问欺诈网站或感染一些病毒或恶意软件;屏蔽各类激活服务器;优化 IPv6 站点访问;为了避免DNS劫持,也借使用 Hosts 文件来强制将特定网站指定到正确的 IP 上。
  网络上有很多修改 Hosts 文件来访问 Google 搜索的教程。比如就有维基媒体基金会的图片服务器 IP 地址被 ISP 封锁,通过修改 Hosts 文件以正常显示图片的方法流传。
  手工修改Hosts文件,既繁琐又极易出错,有正义的IT人士共同维护着列表,如SmartHosts和ipv6-hosts等,可以通过软件自动更新。曾经的HostsX非常好用,可惜随着作者毕业而停止维护了。另一个软件HostsTool 也不错,使用huhamhire-hosts,更新比较及时。
  Hosts订阅,是手机等移动设备上规避DNS欺骗的主要方法。在PC机上可以辅助DNS解析缓存软件,双剑合璧。


五、浏览器

现在很多浏览器有远程DNS解析功能,如在firefox配合autoproxy插件,就会发现DNS欺骗现象没有了。提升上网体验选择一个合适的浏览器很重要,我偏爱Firefox,不仅因为它是开源免费的软件,而且其可高度自由定制的特性就足以打败其他浏览器,丰富的拓展让firefox无可替代。如果你不是IT高手,可能玩儿不转“高大上”的Firefox。那就推荐“白富美”的Chrome畅游版
  这些给菜鸟用的绿色版,都基于GoAgent的方式,安全性不太高,要想更安全,请跟随爱德华·斯诺登(Edward Snowden,曾是CIA美国中央情报局技术分析员)自行配制并使用Tor吧,必要的时候还需要在虚拟机中运行Tails来保证上网安全

六、后记

中国大陆集中了那么多技术力量去阻碍和减慢信息流动的速度,这方面的实力可真是全球领先
  身在中国大陆堕落的教育体制内,不能说真话的时候,只能少说话。感谢每一届爱学习的同学,能体谅我的难处,自学成才。
  如今移民海外的华人越来越多。学习不努力,一生在内地。中国脑残千千万,QQ空间占一半儿。
  希望同学们能早日自学掌握科学上网技术,走出闭关锁国、娱乐至上的局域网,携手Google,拥抱Internet上广袤无垠的知识海洋。
-------------------------

使用TCP方式的DNS查询,规避 DNS污染

什么是 DNS 污染

广义上的 DNS(Domain Name System)污染是一种让一般用户由于得到虚假目标主机 IP 而不能与其通信的方法,是 GFW 的主要手段之一。其手段又可以分为 DNS 劫持与狭义 DNS 污染两种:
  1. DNS 劫持指的是通过行政手段控制墙内的 DNS 服务器,使其对敏感查询直接返回伪造的错误结果。
  2. 狭义 DNS 污染则是指监控经过 GFW 的 DNS 查询请求,发现敏感查询时抢先向查询客户端返回伪造的错误结果。
体现在最终用户上,出现的现象就是:使用墙内 DNS 服务器必然会遭遇 DNS 劫持,而使用墙外 DNS 服务器又会遭遇 DNS 污染。前者是以行政手段实现的,无法以技术手段规避;而后者则是可以通过技术手段予以规避的。

DNS 污染的原理及应对

原理

注意到如下事实:现行标准中 DNS 查询通常使用 UDP 协议并且没有任何验证机制,并且根据惯例查询者会接受第一个返回的结果而抛弃之后的。
因此 GFW 只需监控 53 端口(DNS 标准端口)的 UDP 查询数据报并分析,一旦发现敏感查询,则抢先向查询者返回一个伪造的错误结果,从而实现 DNS 污染。

应对

针对上述原理,可以提出很多针对的应对方法:
  1. 给 DNS 查询协议增加验证机制:DNSSEC。这是最根本的解决方法,但是目前支持 DNSSEC 的服务器及客户端都还没有普及,希望在不久的将来能够用上。
  2. 尝试在返回的查询结果辨认出伪造结果并予以抛弃:最简单的方法是抛弃第一个接收到返回结果而使用第二个,稍复杂一点的方法可以接收多个返回结果然后观察统计结果,等等。
  3. 根据 RFC 1035,DNS 查询除了 UDP 协议之外,也可能通过 TCP 方式进行,而 TCP 协议是无法被伪造返回结果的,因此可以通过 TCP 方式的 DNS 查询来规避 DNS 污染。
其中,2 3 两种方法都较易实现,而后者更为可靠,因此接下来介绍方法 3 的实现。

使用 TCP 方式 DNS 查询规避 DNS 污染的具体实现

准备

RFC 1035 4. Messages 一节记载了 DNS 查询请求的数据格式,及 UDP 与 TCP 两种协议的发送格式。

设计

总的来说,需要设计的是一个 DNS 转发器,其工作流程如下:
  1. 接收客户端的 UDP 协议 DNS 查询请求
  2. 将 UDP 查询转换成 TCP 查询并转发给墙外的某支持 TCP 协议的服务器,如 Google Public DNS ( 8.8.8.8 , 8.8.4.4 ), Ordns.he.net ( 2001:470:20::2 )
  3. 接收服务器通过 TCP 协议返回的查询结果
  4. 将查询结果换成 UDP 协议格式并返回给客户端
理论上,有了这样一个转发器之后,将其部署在一个墙内的机器上(方便起见通常可以部署在客户端本机),并将客户端的 DNS 服务器设为该机器就可以绕开 GFW 的 DNS 污染了。

实现

大概半年前用 Java 写过一个简单实现,虽然代码简陋,但使用至今也没有发现大的问题,现共享出来,权作抛砖引玉,欢迎完善或者提出更好的想法。
注:可执行文件在 64 位 Win7 下生成,不保证其他系统可用。
2011/11/08 更新:可执行文件加入说明文档。

参考资料

  1. 深入理解GFW:DNS污染
  2. RFC 1035
安装Java后,运行dnsserver.jar(后台运行),设置本机DNS服务器为127.0.0.1即可。

项目地址:
https://github.com/SunnyBingoMe/dnsUdp2Tcp_java
https://github.com/ydprtm/DnsTransponder
https://github.com/sunrong/DnsTransponder
https://github.com/ekenchan/DnsTransponder (This is another DNS Transponder rewritten in Node.js)
-------------

linux、mac、openwrt下可以用pdnsd结合tcp查询方式查询google、opendns服务器,或者pdnsd结合opendns的dnscrypt实现局域网内dns的无污染解析。


OSX 上安装 pdnsd 加速 https://leiqing.net/?p=2744
“mac系统,dnscrypt+unbound,挺好用的。” https://code.google.com/p/goagent/issues/detail?id=15397

dns-tcp-query(只有windows版)
Forwarding UDP DNS requests to TCP
https://code.google.com/p/dns-tcp-query/
下载地址:https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/dns-tcp-query/dns-tcp-query-1.0.zip

DNSbenchmark(推荐)https://www.grc.com/dns/benchmark.htm参见Issue 17531
DNS Jumper(推荐)没找到主页http://dns-jumper.softonic.cn/
-------------------------


相关帖子:
http://briteming.blogspot.com/2012/03/dnsudp-to-tcpdns.html
http://briteming.blogspot.com/2013/02/dns.html
http://briteming.blogspot.com/2015/11/shadowdns.html
http://briteming.blogspot.com/2017/07/overture-dns-serverforwarder.html

http://briteming.blogspot.com/2012/04/pdnsd-google-dns-dns.html (用PDNSD + Google PUBLIC DNS SERVER获得高速正确的dns解析结果)
http://briteming.blogspot.com/2012/10/dnsdns.html (用pdnsd缓存DNS查询,解决DNS查询慢的问题)
http://briteming.blogspot.com/2016/03/macpdnsd-dnsmasq-dns-dns.html (在 Mac上安装pdnsd 和 dnsmasq,避免dns污染)