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