开放的DNS解析器并不过滤任何入站请求,可以接受来自任何源IP地址的查询。因此,开放的解析器可能很容易成为攻击者下手的目标。比如说,攻击者可以对开放的DNS服务器发动拒绝服务(DoS)攻击;或者更严重的是,发动分布式拒绝服务(DDoS)攻击。这些攻击还可能结合IP欺诈手法,即所有应答数据包都将被引导到受害者被欺诈的IP地址。在另一种名为DNS放大攻击的攻击场景下,开放的DNS服务器可能积极参与攻击。
据openresolverproject.org网站声称,除非确有必要,否则不建议运行开放的解析器。大多数公司只允许客户访问其DNS服务器。本教程将主要介绍如何配置一台DNS服务器,以便它不再是开放的DNS解析器,只应答有效的客户。
调整防火墙
由于DNS在UDP端口53上运行,系统管理员们可能试图允许端口53仅用于客户机IP地址访问,阻止互联网的其他机器访问该端口。虽然这一招很管用,但还是会有一些问题。由于根服务器与DNS服务器之间的通信也使用端口53,我们不得不确保:在防火墙中还允许根服务器的IP地址可以使用UDP端口53。
下面提供了一个示例性的防火墙脚本。如果是生产环境下的服务器,就要确保规则符合你的需求,而且还要遵守贵公司的安全政策。
# vim firewall-script
## 现有的规则被清除,以便由一组新的规则开始 ## iptables -F
iptables -A INPUT -s A.A.A.A/X -p udp --dport 53 -j ACCEPT
iptables -A INPUT -s B.B.B.B/Y -p udp --dport 53 -j ACCEPT
iptables -A INPUT -s C.C.C.C/Z -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j DROP
## 让规则具有持久性 ## service iptables save
让脚本成为可执行脚本,并运行它。
# chmod +x firewall-script
# ./firewall-script
阻止递归查询
DNS查询可以主要分为两类:递归查询和迭代查询。如果是递归查询,服务器使用应答或错误信息回应客户机。如果服务器缓存中没有该应答,服务器就与根服务器进行联系,以获得授权域名服务器。服务器不断查询,直到它获得应答,或者直到查询超时。另一方面,如果是迭代查询,服务器只是将客户机转到能够处理的另一台服务器,因而导致在该服务器上面的处理工作量比较少。
我们可以控制允许递归查询的IP地址。我们只要改动配置文件/etc/named.conf,并添加/修改下列参数。
# vim /etc/named.conf
## 我们定义访问控制列表(ACL),以指定一个或多个源地址##
acl customer-a{ A.A.A.A/X; };
acl customer-b { B.B.B.B/Y; C.C.C.C/Z; };
## 我们根据选项指令调用ACL ##
options {
directory "/var/named";
allow-recursion { customer-a; customer-b; };
};
针对开放的解析器调整防火墙
如果你非得运行开放的解析器,那么我们建议你合理调整防火墙,以便服务器无法被不法分子钻空子。Smurfmonitor规则库(https://github.com/smurfmonitor/dns-iptables-rules)提供了一组功能强大的iptables规则,这些规则可以用在开放的解析器中,比如阻止对参与DNS放大攻击的域提出查询请求。该规则库定期更新,我们强烈建议DNS服务器管理员们使用它。
总而言之,针对开放的DNS解析器的攻击很常见,对没有采用合理安全措施的DNS服务器而言更是如此。本教程演示了如何禁用开放的DNS服务器。我们还看到了iptables如何可以用来为开放的DNS服务器增添另一层安全机制。