Total Pageviews

Monday 13 June 2016

BlackHole是一个用Java编写的DNS服务器

1. 简介

BlackHole是一个Java编写的DNS服务器,它可以进行DNS缓存,也支持自定义域名配置,并可以防止DNS污染。比起老牌的DNS软件pdnsd、BIND,BlackHole功能比较简单,但是更容易使用,性能也更好。
BlackHole还包含一个Web管理模块Hostd,可以让每个用户管理自己的域名配置,并且彼此之间不冲突。

2. 用途

DNS缓存

BlackHole具有DNS缓存以及持久化的功能,可以作为一个DNS缓存服务器使用,以加速DNS访问。
BlackHole缓存性能优秀,可以支持每秒50000次随机查询,平均响应时间0.3ms,高于pdnsd及BIND(测试报告)。

hosts风格自定义域名

BlackHole也支持修改域名配置,配置域名的方式非常简单,与hosts文件一致,并且支持通配符(目前仅支持A记录)。
例如:
127.0.0.1   *.codecraft.us
表示将所有以.codecraft.us形式结尾的域名全部指向127.0.0.1。

防止DNS污染

BlackHole还可以通过UDP特征判断的方式防止DNS污染攻击,对于某些无法访问的网站可以起到作用。BlackHole防止DNS的方式参见:http://code4craft.github.com/blog/2013/02/25/blackhole-anti-dns-poison/

3. 安装及配置

你使用自动脚本进行安装BlackHole:
curl http://code4craft.github.io/blackhole/install.sh | [sudo] sh

BlackHole的另一个编译后版本保存在https://github.com/code4craft/blackhole-bin,如果以上脚本对你所在环境不可用,那么可以clone这个项目到某一目录:
git clone https://github.com/code4craft/blackhole-bin /usr/local/blackhole/
cd /usr/local/blackhole/
sudo /usr/local/blackhole/blackhole.sh start可以启动BlackHole。

Windows系统可将文件保存到任意目录,并运行start.bat(Win7下无需用管理员权限启动),若弹出终端界面并且持续运行,则启动成功。
各种问题解决、具体的设置以及技术细节请看Blackhole Server Docs

4. 协议

BlackHole的连接部分参考了EagleDNS的代码,遵守LGPLv3协议。

from https://github.com/code4craft/blackhole
-------


BlackHole开发日志--防止DNS污染


DNS污染原理
 DNS污染是比DNS劫持更加难以防御的一种攻击,受攻击者访问网站时可被导向其他域名,例如某“不存在的网站”被导向了一个“不存在的IP地址”。
DNS污染的原理如下:
DNS查询也是一个经典的请求-回答模式。首先,客户端发起DNS查询,这是一个UDP包。路由器在转发IP包时,对其内容做解析,若发现其是使用53端口的UDP包,并且其内容符合某些特征(普通的DNS请求都是明文),则从旁路直接返回一个伪造的应答,将其应答指向某个特定IP。因为这个返回速度非常快,所以先于正常请求到达客户端。而客户端收到一个返回包,就认为得到了答案,不再继续接收,而正确的请求结果就被忽略了!
image
一般防止DNS污染有几种方法:
  • 修改系统hosts文件
    系统的hosts文件可以配置某个域名对于的IP地址,并且会优先于DNS服务器的响应,所以此方法稳定高效,缺点是host地址需要不断更新。
  • 改用TCP协议而不是DNS协议发送DNS请求
    DNS也支持TCP协议传输,而TCP协议没有收到污染,所以可以改用TCP作为DNS下层协议。缺点是TCP速度慢,并且DNS服务器支持度有限。代表工具:Tcp-DNS-proxy https://github.com/henices/Tcp-DNS-proxy
  • 使用IPv6地址发送DNS请求
    某些站点可以通过IPv6地址访问。代表工具:dnsproxycn http://code.google.com/p/dnsproxycn/
  • 根据污染特征过滤伪造DNS答案
    先截获DNS污染结果,然后分析其特征,然后将判断为污染的DNS包过滤掉。代表工具:AntiDnsPollution http://www.williamlong.info/archives/2184.html

BlackHole解决方案

BlackHole解决方案是第4种:向一个不存在的地址发送DNS查询,正常情况下不会有应答;若触发DNS污染,则只会有伪造包返回。记录这个伪造包的特征(一般是A记录的IP地址),加入黑名单,下次如果收到这些包,则直接过滤。
其实开发BlackHole时不知道有AntiDnsPollution这款工具,完成了才知道,采取的方法不谋而合。只不过BlackHole做的更复杂一点,增加了一些功能:
  • DNS污染黑名单持久化
    所有污染IP都会存入”安装路径/blacklist”文件,每次重启可继续读入,也支持手工修改。
  • 可用IP导出host
    BlackHole会对IP地址做可达性判断(根据ICMP协议请求),存在DNS污染的域名,若正确DNS地址中,同时有可达IP,则会产生一条”IP domain”的DNS记录到”安装路径/safebox”文件中,与hosts文件格式一致,可以粘贴进去,从而无须再启动BlackHole。
  • 支持多DNS服务器请求
    BlackHole可以同时向多个DNS服务器请求,并采用最先返回的正确结果作为答案返回;同时后台会继续接收响应,并根据最终答案中IP地址的可用性进行判断,去掉不可用的IP。你可以将BlackHole的转发DNS配置为:一个ISP提供的服务器,速度较快;另一个权威的DNS服务器,结果较可信。对于大多数请求,ISP提供的DNS可以满足需要,从而降低查找时间。同时如果在公司内网中使用,还可以将公司内部DNS服务器地址配置进去,这样可以保证内部配置的某些DNS的有效性。
  • 支持缓存
    BlackHole使用ehcache作为缓存,并且可以持久化,下次启动时可直接载入上次缓存结果。
  • 可配置
    BlackHole还是修改hosts文件的替代方案。通过修改”config/zones”可以自定义DNS拦截规则,支持通配符”*“。
BlackHole的源码地址:https://github.com/code4craft/blackhole

from http://code4craft.github.io/blog/2013/02/25/blackhole-anti-dns-poison/