文档章节

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

黄亿华
 黄亿华
发布于 2013/02/25 22:18
字数 1028
阅读 4908
收藏 71

DNS污染原理

DNS污染是比DNS劫持更加难以防御的一种攻击,受攻击者访问网站时可被导向其他域名,例如某“不存在的网站”被导向了一个“不存在的IP地址”。

DNS污染的原理如下:

DNS查询也是一个经典的请求-回答模式。首先,客户端发起DNS查询,这是一个UDP包。路由器在转发IP包时,对其内容做解析,若发现其是使用53端口的UDP包,并且其内容符合某些特征(普通的DNS请求都是明文),则从旁路直接返回一个伪造的应答,将其应答指向某个特定IP。因为这个返回速度非常快,所以先于正常请求到达客户端。而客户端收到一个返回包,就认为得到了答案,不再继续接收,而正确的请求结果就被忽略了!

dns-cache-poison

一般防止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记录到"安装路径/safehost"文件中,与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

© 著作权归作者所有

黄亿华

黄亿华

粉丝 2449
博文 131
码字总数 116344
作品 7
程序员
私信 提问
加载中

评论(20)

黄亿华
黄亿华 博主

引用来自“lionkingc”的评论

用了WIN下的版本 ,,虽然有发现 BLACK LIST的IP,但是关闭软件后,发现并没有存入相关文件,是否是程序的问题?

程序必须在cmd下用CTRL+C中止,可以看看是不是这个问题
l
lionkingc
用了WIN下的版本 ,,虽然有发现 BLACK LIST的IP,但是关闭软件后,发现并没有存入相关文件,是否是程序的问题?
黄亿华
黄亿华 博主

引用来自“RisingV”的评论

会不会使系统整体的DNS性能降很低?

可以开启本地的DNS缓存,会比远程查询性能更高(10ms左右)
mingshun
mingshun

引用来自“黄亿华”的评论

引用来自“mingshun”的评论

引用来自“黄亿华”的评论

引用来自“mingshun”的评论

也在用nodejs实现这个,方法跟你的差不多,还加了路由切换

路由切换?是指ISP重连?

其实现在用一个不存在的IP去nslookup被污染的域名只会超时,不会得到被污染的DNS结果。
我是给定一个域名列表,遇到以列表结尾的域名时,通过google dns来解析,不过会将DNS解析数据的内容通过socket代理线路发送,而不经过正常的线路。得到的IP地址也被记录下,并添加路由规则,让数据包都走代理线路。

我刚才确认过,被污染的域名,黑洞DNS仍然会有回包。
路由切换,看意思似乎就是switch proxy这类软件做的事?

我这边已经不行了,都是超时,所以没法用那个方法来判断DNS结果是不是被污染。
路由切换,现在想想应该叫网关切换比较合适。
黄亿华
黄亿华 博主

引用来自“mingshun”的评论

引用来自“黄亿华”的评论

引用来自“mingshun”的评论

也在用nodejs实现这个,方法跟你的差不多,还加了路由切换

路由切换?是指ISP重连?

其实现在用一个不存在的IP去nslookup被污染的域名只会超时,不会得到被污染的DNS结果。
我是给定一个域名列表,遇到以列表结尾的域名时,通过google dns来解析,不过会将DNS解析数据的内容通过socket代理线路发送,而不经过正常的线路。得到的IP地址也被记录下,并添加路由规则,让数据包都走代理线路。

我刚才确认过,被污染的域名,黑洞DNS仍然会有回包。
路由切换,看意思似乎就是switch proxy这类软件做的事?
mingshun
mingshun

引用来自“黄亿华”的评论

引用来自“mingshun”的评论

也在用nodejs实现这个,方法跟你的差不多,还加了路由切换

路由切换?是指ISP重连?

其实现在用一个不存在的IP去nslookup被污染的域名只会超时,不会得到被污染的DNS结果。
我是给定一个域名列表,遇到以列表结尾的域名时,通过google dns来解析,不过会将DNS解析数据的内容通过socket代理线路发送,而不经过正常的线路。得到的IP地址也被记录下,并添加路由规则,让数据包都走代理线路。
黄亿华
黄亿华 博主

引用来自“mingshun”的评论

也在用nodejs实现这个,方法跟你的差不多,还加了路由切换

路由切换?是指ISP重连?
mingshun
mingshun
也在用nodejs实现这个,方法跟你的差不多,还加了路由切换
黄亿华
黄亿华 博主

引用来自“AproSanae”的评论

Unable to access jarfile /usr/local/blackhole/blackhole.jar
说明:ubuntu 10.04;java 使用openJDK(随便下的);jar包我确定在对应的路径。
那么,可能的原因会是什么呢?

应该是我打包的jar文件上传不完整,重新上传了一份,自己测试了,已经没有问题,感谢提醒:D
Aprocy
Aprocy
Unable to access jarfile /usr/local/blackhole/blackhole.jar
说明:ubuntu 10.04;java 使用openJDK(随便下的);jar包我确定在对应的路径。
那么,可能的原因会是什么呢?
黄亿华/blackholej

BlackHole ###1. 简介 BlackHole是一个Java编写的DNS服务器,它可以进行DNS缓存,也支持自定义域名配置,并可以防止DNS污染。比起老牌的DNS软件pdnsd、BIND,BlackHole功能比较简单,但是更容...

黄亿华
2013/08/21
0
0
迷你DNS服务器--BlackHoleJ

BlackHole是一个Java编写的DNS服务器,它可以进行DNS缓存,也支持自定义域名配置,并可以防止DNS污染。比起老牌的DNS软件BIND、pdnsd,BlackHole功能比较简单,但是更容易使用,性能也更好。...

黄亿华
2013/03/09
5.5K
6
BlackHoleJ 1.2.1发布,Java轻型DNS服务器

此次更新优化了DNS缓存功能,更新内容: 增加自定义缓存过期时间的功能。 优化了缓存目录地址。 修复了缓存持久化不生效的bug。 BlackHoleJ是一个Java编写的DNS服务器,它可以进行DNS缓存,也...

黄亿华
2013/06/22
457
1
如何区分国内上网环境中不同的人为网络故障

众所周知,在国内上网会遇到各种各样不同的人为网络故障,使得我们无法正常访问很多网站。但由于很多人并不熟悉网络,很多时候会无法区分不同的网络故障,导致明明是网络故障,却认为是服务器...

大数据之路
2013/01/16
962
4
BlackHole开发日记-尝试引入缓存,出现问题

今天在公司公开了这个项目,得到大家的肯定,坚定了把这个项目做下去的决心。 下午公司项目codereview,被指出很多问题。虽然自己在代码可扩展性上做了不少努力,但是大家都反应可读性不那么...

黄亿华
2012/12/19
128
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员Java教程分享Zookeeper基本原理与运用场景

好程序员Java教程分享Zookeeper基本原理与运用场景一、什么是Zookeeper? zookeeper是一个分布式的一致性协调服务。 换句话说,也可以把zookeeper看成一个小型的分布式文件系统。但是和FastD...

好程序员官网
7分钟前
2
0
mysql表情符

1 修改表字段为utf8md4 ALTER table property_info MODIFY `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL 2 MySQL数据库服务器配置文件mysqld.cn......

干死it
26分钟前
2
0
正则表达式的基本语法

本文摘自LTP.NET知识库。 正则表达式的形式一般如下: /love/ 其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。 用户只要把希望查找匹配对象的模式内容放入“/”定界符之...

木庄
28分钟前
3
0
java 框架有哪些?

十大常用框架: 一、SpringMVC 二、Spring 三、Mybatis 四、Dubbo 五、Maven 六、RabbitMQ 七、Log4j 八、Ehcache 九、Redis 十、Shiro 延展阅读: 一、SpringMVC Spring Web MVC是一种基于J...

java框架开发者
29分钟前
6
0
细谈Mysql事务

文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 上一篇着重谈到了MySQL锁的概念,里面谈到了事务的概念,其实大部分开发者对于事务肯定不陌生,...

程序猿周先森
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部