神刀安全网

使用 fail2ban 防止 Bind9 被用于 DNS 放大攻击

前言

我在阿里云搭建的自用 dnsmasq 服务器,用来做免污染的 DNS,最近由于公开了IP,果然就遭到了攻击——其实是被用于DNS 放大攻击。

由于 dnsmasq 本身就没有设计为对外提供 DNS 服务,所以它对于安全方面的配置文件不是很多(根本没有!),但它的解析策略又很方便配置(比如中国DNS解析白名单等),所以我在原本的基础上,再加了一个Bind9 作为前端来做安全。

那么,今天我们就一起来看看到底如何给Bind9 做安全配置。

Bind9 自身安全配置

Bind9 本身支持很多安全策略,我们把它做好,就已经能够让 DNS 十分健壮:

编辑 / etc / bind / named .conf .options ,我们添加自定义策略:

options {  directory "/var/cache/bind";  version        "None of your business";  // If there is a firewall between you and nameservers you want  // to talk to, you may need to fix the firewall to allow multiple  // ports to talk.  See http://www.kb.cert.org/vuls/id/800113    // If your ISP provided one or more IP addresses for stable  // nameservers, you probably want to use them as forwarders.  // Uncomment the following block, and insert the addresses replacing  // the all-0's placeholder.    forwarders {  127.0.0.1 port 5352;  };    //========================================================================  // If BIND logs error messages about the root key being expired,  // you will need to update your keys.  See https://www.isc.org/bind-keys  //======================================================================== // dnssec-validation auto; // recursion no;  auth-nxdomainno;    # conform to RFC1035  //listen-on-v6 { any; };  forwardonly;  allow-query {any;};  allow-query-cache {any;};  dnssec-enableno;  dnssec-validationno;  rate-limit {             ipv4-prefix-length 32;             window 10;             responses-per-second 25;             errors-per-second 5;             nxdomains-per-second 5;             slip 2;               }; }; 

详细解释:

version        "None of your business"; 

隐藏掉 Bind9 的版本信息,避免黑客针对你的 Bind9 版本漏洞进行攻击。

forwarders {  127.0.0.1 port 5352;  }; 

这句是开启 Bind9 解析转发,就像 dnsmasq 一样,让 Bind9 能够向上获取解析而不是自身去从根解析,就可以避免污染了(我这里解析到了本地的 dnsmasq 上)

 forwardonly;  allow-query {any;};  allow-query-cache {any;}; 

只允许转发,禁用根解析,同时开启外部解析和缓存。

 dnssec-enableno;  dnssec-validationno; 

关闭安全配置,因为我要向上转发到dnsmasq,而前者的应答是非权威应答,所以要让 Bind9 接受非权威应答,就要关闭它。你不这样用的话就不必关。

在查询一个域名时,可能会看到有“非权威应答”的提示,该提示表示你所查询的域名不使用你当前所用的DNS查询服务器上。

 rate-limit {             ipv4-prefix-length 32;             window 10;             responses-per-second 25;             errors-per-second 5;             nxdomains-per-second 5;             slip 2;               }; 

为每个 IP 进行限速,如果请求超过每秒 25 个,就不再响应直接丢包。

效果

这样一来,你应该就能在 / var / log / syslog 里看到大量的超限 drop 记录了,不过,即使如此,vps的流量依旧如流水一般远去,所以,我们还需要使用第三方的工具来处理这些 IP。

记得重启服务 service bind9 restart

使用 Fail2ban 自动屏蔽黑客 IP

没错, 如果你读过我的 购买了VPS之后你应该做足的安全措施 这篇文章,那你的 vps 上应该已经安装了这个工具,它默认就已经能够很好的运行了,但要给 Bind9 使用,我们还要继续定制一番。

定制 Bind9 以兼容 Fail2ban

Bind9 默认并不会单独生成日志的,我们需要把出错的日志输出以便 Fail2ban 能够记录,所以编辑 / etc / bind / named . conf ,在文件末尾另起一行插入如下语句:

logging {     channel query_log {         file "security.log" versions 3 size 30m;         severityinfo;         print-timeyes;     };     category default {         query_log;     };  }; 

这是重定向 Bind9 的默认日志到 / var / cache / bind / security .log 大小保持30M

这时候如果你用 tail f / var / cache / bind / security .log 来查看,就会看到一大堆类似这样的记录了:

23-Apr-2016 18:44:08.560 client 94.254.209.48#80 (nhl.msk.su): rate limit drop response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.589 client 94.254.209.48#80 (nhl.msk.su): rate limit slip response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.607 client 94.254.209.48#80 (nhl.msk.su): rate limit drop response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.695 client 94.254.209.48#80 (nhl.msk.su): rate limit slip response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.696 client 94.254.209.48#80 (nhl.msk.su): rate limit drop response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.752 client 94.254.209.48#80 (nhl.msk.su): rate limit slip response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.844 client 94.254.209.48#80 (nhl.msk.su): rate limit drop response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:08.950 client 94.254.209.48#80 (nhl.msk.su): rate limit slip response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:09.009 client 94.254.209.48#80 (nhl.msk.su): rate limit drop response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:09.015 client 94.254.209.48#80 (nhl.msk.su): rate limit slip response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:09.112 client 94.254.209.48#80 (nhl.msk.su): rate limit drop response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 23-Apr-2016 18:44:09.117 client 94.254.209.48#80 (nhl.msk.su): rate limit slip response to 94.254.209.48/32 for nhl.msk.su IN ANY  (0000640d) 

显然,现在有人在利用我的 DNS 进行反射攻击,接下来我们配置 Fail2ban 来干掉这些 IP。

让 Fail2ban 对 Bind9 生效

其实 Fail2ban 原生支持 Bind9 的,甚至其列表里就已经内置——不过那个策略与我们的期望不甚相符,还得自己改改。

编辑过滤配置

编辑 / etc / fail2ban / jail .conf 文件,在里边找到关于 Bind9 的配置部分,默认如下:

# Thesejailsblockattacksagainstnamed (bind9). Bydefault, loggingis off # withbind9installation. Youwillneedsomethinglikethis: # # logging { #    channel security_file { #        file "/var/log/named/security.log" versions 3 size 30m; #        severitydynamic; #        print-timeyes; #    }; #    category security { #        security_file; #    }; # }; # # in yournamed.conf to provideproperlogging   # !!! WARNING !!! #  SinceUDPis connection-lessprotocol, spoofingofIPand imitation #  ofillegalactionsis waytoosimple.  Thusenablingofthisfilter #  mightprovideaneasywayfor implementing a DoSagainst a chosen #  victim. See #    http://nion.modprobe.de/blog/archives/690-fail2ban-+-dns-fail.html #  PleaseDO NOT USE thisjailunlessyouknowwhatyouaredoing. #[named-refused-udp]   ……   [named-refused-tcp]   …… 

我们给它改改,udp 和 tcp 都启用:

[named-refused-udp]   enabled  = true port    = domain,953 protocol = udp filter  = named-refused logpath  = /var/cache/bind/security.log findtime = 1 maxretry = 5 action  = iptables-multiport[name=Named, port=53, protocol=udp]   [named-refused-tcp]   enabled  = true port    = domain,953 protocol = tcp filter  = named-refused logpath  = /var/cache/bind/security.log findtime = 1 maxretry = 5 action  = iptables-multiport[name=Named, port=53, protocol=udp] 

这里的意思是一旦在1秒内发现5次记录,就会把对应的 IP 给加入黑名单,时间则是默认的3600秒。不过不要担心, 这个记录是 drop 记录,不是正常的 query 记录

修改过滤规则

接下来我们改一下默认规则,默认的规则是探测被攻击——而我们是要探测被用于攻击……编辑 / etc / fail2ban / filter .d / named refused .conf 文件,找到如下几行:

failregex = ^%(__line_prefix)s(/./d+)?( error:)?/s*client <HOST>#/S+( /([/S.]+/))?: (view (internal|external): )?query(?: /(cache/))? '.*' denied/s*$             ^%(__line_prefix)s(/./d+)?( error:)?/s*client <HOST>#/S+( /([/S.]+/))?: zone transfer '/S+/AXFR//w+' denied/s*$             ^%(__line_prefix)s(/./d+)?( error:)?/s*client <HOST>#/S+( /([/S.]+/))?: bad zone transfer request: '/S+/IN': non-authoritative zone /(NOTAUTH/)/s*$ 

改为:

failregex = <HOST>#/S+( /([/S.]+/))?/: rate limit drop 

重启服务

使用命令 service fail2ban restart 来重启服务,这时候使用命令可查看其状态:

:~# fail2ban-clientstatusnamed-refused-udp Statusfor thejail: named-refused-udp |- filter |  |- Filelist: /var/cache/bind/security.log |  |- Currentlyfailed: 0 |  `- Totalfailed: 9 `- action   |- Currentlybanned: 1   |  `- IPlist: 94.254.209.48   `- Totalbanned: 1 

你看,已经抓到一个了。

总结

总之,一番折腾下来,我们得到了如下收获:Bind9 能够对单个 IP 的每秒请求进行限制(随后你可以根据需求进行修改),一旦某IP再一秒内对服务器请求次数超过限制,则会被记录并丢弃请求,如果超过的次数超过五次,那么就会被拉入黑名单被防火墙拒绝(对方显示目标地址不可达)。

关于UDP的一点讨论

如你所见,在 Fail2ban 配置文件当中也写明了对 UDP 的策略很有危险,因为黑客可以很容易伪造不同的地址,这样可能会被用来利用你的规则恶意屏蔽某些 IP ,如果你的服务器出现这个情况,你就需要关掉针对 UDP 的策略了。

扩展阅读

Iptables-Fail2ban处理bind 非法攻击

十分钟架设DNS转发缓存服务器

Blocking a DNS DDOS using the fail2ban package

最后一次更新:23rd 四月, 2016

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 使用 fail2ban 防止 Bind9 被用于 DNS 放大攻击

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址