一种针对域名服务器的新型分布式拒绝服务攻击(DDoS),可称之为“胡乱域名”(Nonsense Name)攻击。它能给递归域名服务器和权威域名服务器(authoritative name servers)造成严重破坏。这种“无意义域名”DDoS攻击通常是这样进行的:
1.攻击者选定一个域作为目标,比如someone.example。
2. 在目标域内,攻击者操纵僵尸网络产生大量随机域名。这些随机域名的头部都是些诸如asdfghjk、zxcvbnm之类的无意义的字符,制造出来的域名形如:asdfghjk.someone.example和zxcvbnm.someone.example。
3.然后向递归域名服务器发起大量针对这些无意义域名的查询请求。
4.递归域名服务器转而将请求发送到someone.example的权威服务器以查询这些域名。
5. 权威域名服务器返回‘请求的域名不存在’的响应(NXDOMAIN)。
6. 递归服务器中继转发这一响应给原始请求者,并缓存下域名不存在的记录。
7. 请求,响应,缓存,再来一遍。反反复复无穷尽。
如果攻击者发起这种胡乱域名解析请求的速度足够快,聚合查询的速度将令someone.example权威域名服务器应接不暇濒临崩溃。真正的伤害就发生了:
1. 僵尸主机继续向递归域名服务器发送无意义域名的查询请求。
2. 权威域名服务器终于崩溃,不再响应请求,递归域名服务器也就需要花费长得多的时间来处理单个域名解析请求。如果采用的是BIND域名服务器,那么服务器会等待30秒,并在放弃之前发出几十个(未解决的)查询请求。
3.这将占用递归域名服务器上的递归查询时间片,最终导致资源耗尽,拒绝接受其他递归查询——尽管其中包含了合法的查询请求。
一旦发生这种状况,BIND域名服务器会向系统日志中写入一条消息,形如:Jan 21 14:44:00 ns1 named[4242]: client 192.168.0.1#1110: no more recursive clients: quota reached。至此,域名服务器拒绝任何新入递归请求,停止向客户提供服务。
攻击目标是个迷
大多数情况下,运营权威域名服务器的机构(本例中是为someone.example提供权威域名解析的)似乎是攻击者的目标。比如说,我们观察到的某些被 攻击的域名就是国内博彩网站使用的(也许是有人因为损失惨重而对庄家进行报复?)无论如何,递归服务器终归是无辜中箭,连带崩溃。他们确实是目标么?
比如之前,Infoblox的客户遭受攻击的域中有部分在攻击过后神秘消失了一天或两天,表明这些域并没有被使用(事实上很可能是被“试探性抢注”了)。攻击者可能故意将这些域注册到慢速或停止响应的域名服务器上,这样域内的域名解析就会无限漫长。当然,抛开目标问题不谈,攻击背后的机制也同样迷雾重重。
解决办法
一般而言,当递归域名服务器开始发生递归查询时间片资源不足的情况时,你就可以从早先记录下的系统日志消息中发现无意义域名攻击的踪迹。这些日志消息记录了由于时间片缺乏而被拒绝服务的查询者的IP地址。
首先,确认日志记录中的这些IP地址是否是你的域名服务器应该服务的范围。如果不是,你简单利用访问控制列表将域名服务器配置为只为已授权用户提供服务即可。如果恶意查询来自合法IP地址,很显然,你得换个手段阻止他们。
备选方案之一就是使用BIND提供的极为顺手的响应策略域(RPZ)功能,它可以暂时性阻止你的域名服务器为问题域提供查询服务。用以阻止你的域名服务器查找someone.example域名的RPZ规则可以如此简单:
*.someone.example.your.rpz.zone. IN CNAME .
当然,除此之外,你还需要将qname-wait-recurse选项设置为no。这可以使你的域名服务器不询问someone.example域名服务器就直接向所有someone.example域内的域名解析请求返回NXDOMAIN响应。
如果你的递归域名服务器还没升级到BIND9.10及其以上,或者根本就没用BIND,你也可以通过设置一个空someone.example域来避免服务器尝试在问题域查找数据。域数据文件可以极小化成这样:
@ IN SOA ns1 root 2015010700 1h 15m 30d 10m
IN NS ns1
将你的递归域名服务器配置为域内权威服务器——这个工作就留给读者去完成啦——它就可以欢快地直接向大多数someone.example域名解析请求返回NXDOMAIN响应(询问SOA或NS记录的请求显然不在此列)。只有一点需要记住:RPZ规则或者域配置都是临时的。攻击结束后,你还得取消它们以使该域的解析服务恢复正常。
互联网系统协会那些开发了BIND域名服务器的好兄弟们也在为更精妙地解决这一问题而思考新的机制。它们打算引入两个新的配置选项:fetches-per-server和fetches-per-zone。
fetches-per-server选项给递归域名服务器能向单个权威服务器发送的并发查询请求数加上一个限制。这个限制实际上是动态的,会根据查询权威服务器时的超时情况自动调整。Fetches-per-zone选项则是针对发往单个域的并发请求数加以限制。有了这两个功能,管理员们应该就能减少BIND域名服务器成为无意义域名DDoS攻击受害者的几率了——不管有意或无意。