bind做递归DNS的一些防攻击手段

权威DNS的防攻击相对容易一些,对于一般的小公司的话可以使用rrl模块做简单的限速就能取得不错的效果。测试过开启限速后使用queryperf去打,bind的负载基本不会上升的。
递归DNS的防攻击会负责很多。如果单纯使用开源的解决方案就只有rrl和rpz这2个东东可以考虑了。值得一提的是在bind9.9.4里把这2个patch合并进去了。现在最新版的bind都是可以使用rpz设置对每个不同的域名做返回策略,rrl也可以限制好单个IP或IP段的频率。
编译参数:


#/opt/bind/sbin/named -V
BIND 9.9.4-P2 (Extended Support Version) <id:3f00a920> built with '--prefix=/opt/bind/' '--enable-rrl' '--enable-epoll' '--enable-threads'
using OpenSSL version: OpenSSL 1.0.1 14 Mar 2012

rrl的配置可以参考:


    rate-limit {
        responses-per-second 20;
        nodata-per-second 10;
        nxdomains-per-second  10;
        errors-per-second 10;
        //all-per-second 60;
        ipv4-prefix-length 32;
        max-table-size 10000;
        slip 2;
        //log-only yes ;
        qps-scale 50000;
        window 5;
    };

其中ipv4-prefix-length设置掩码为32位,就是对每个IP都独立限速, responses-per-second是对每个客户端响应速度上限。qps-scale是一个系数,比如设置qps-scale 250; responses-per-second 20,当访问的qps是1000的时候,对单个ip的限速就变成了250/1000*20=5。详细的配置可以参考
http://ftp.isc.org/isc/bind9/cur/9.9/doc/arm/Bv9ARM.ch06.html#options


  [ rate-limit {
        [ responses-per-second number ; ]
        [ referrals-per-second number ; ]
        [ nodata-per-second number ; ]
        [ nxdomains-per-second number ; ]
        [ errors-per-second number ; ]
        [ all-per-second number ; ]
        [ window number ; ]
        [ log-only yes_or_no ; ]
        [ qps-scale number ; ]
        [ ipv4-prefix-length number ; ]
        [ ipv6-prefix-length number ; ]
        [ slip number ; ]
        [ exempt-clients  { address_match_list } ; ]
        [ max-table-size number ; ]
        [ min-table-size number ; ]
      } ; ]
    [ response-policy { zone_name
        [ policy given | disabled | passthru | nxdomain | nodata | cname domain ]
        [ recursive-only yes_or_no ] [ max-policy-ttl number ] ;

rpz的配置如下options字段新增


response-policy {
   zone "rpz.zone" policy given;
};

然后在每个view里新增


zone "rpz.zone" {
   type master;
   file "master/rpz.zone";
   allow-update {none;};
};

rpz.zone范例如下:


$TTL 30
@ SOA nsa.vix.com. hostmaster.vix.com. 29 3600 1800 604800 30
NS localhost.

google.com IN CNAME google.com.
www.abc.com IN CNAME www.abc.com.
a.gnuers.org CNAME blogd.gnuers.org.
no.gnuers.org CNAME .
no1.gnuers.org CNAME *.
host.gnuers.org CNAME .
www.test.fr IN A 193.252.1.2
*.lala.com IN A 200.237.2.1

这样*.lala.com都会被解析为200.237.2.1,而对于no.gnuers.org会直接返回nxdomain, AUTHORITY SECTION会有rpz.zone的信息。


# dig @127.0.0.1 no.gnuers.org

; <<>> DiG 9.8.1-P1 <<>> @127.0.0.1 no.gnuers.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 7410
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;no.gnuers.org.         IN  A

;; AUTHORITY SECTION:
rpz.zone.       30  IN  SOA nsa.vix.com. hostmaster.vix.com. 29 3600 1800 604800 30

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Feb 12 12:48:05 2014
;; MSG SIZE  rcvd: 97

日志的话可以单独设置一下


channel rpz_log { file "/opt/bind/var/log/named.rpz" versions 3 size 100m; severity dynamic; print-time yes;};
channel rrt_log { file "/opt/bind/var/log/named.rrt" versions 3 size 100m; severity dynamic; print-time yes;};
category rate-limit {rrt_log;};
category rpz {rpz_log;};

rpz的主要用途主要有几方面:
1. 把部分做反射攻击的域名封掉。
2. 把内部域名屏蔽掉,直接返回NXDOMAIN。
3. 屏蔽部分暴力,黄色,诈骗网站。

此条目发表在dns分类目录。将固定链接加入收藏夹。