BIND 9 Rate Limiting - Dos 공격 방어

BIND 9 Response-Rate-Limiting (RRL)


rate-limit은 BIND의 응답 최대 한도를 걸어,
한도 이상의 요청이 오면 그 요청을 제한(일반적으로 DROP)하게 하는 조치이다.
DoS 공격 방어용으로 사용한다.

BIND 9.10 이상에서 사용할 수 있다.
(BIND 9.9.4 이상에서도 사용이 가능하나, 매뉴얼에 따라 옵션을 풀어줘야 한다)


[설정법]

/etc/named.conf을 열어서, options {} 안에다가 이 항목을 추가한다.

options{
.....
rate-limit {
        옵션들.......
        responses-per-second 5; // (예시 1)
        window 5; // (예시 2)
};

};


로그은 rate limit 채널을 추가하면 된다. 일반적인 BIND9 로깅 옵션과 옵션이 같다.
logging{
.....
     channel rate_limiting_log {
          file "파일위치" versions 3 size 5m;
          print-time yes;
          print-category yes;
          print-severity yes;
          severity info;
     };
};



[옵션]

옵션은 rate-limit{} 안에다가 다음 형태로 기재하면 된다.
Name Value;

(예시)
windows 5;


1. ipv4-prefix-length

Default : 24
Value : 1 ~ 32
단위 : CIDR

(BIDN9의 rate-limiting은 IP range를 기반)
request에 대한 source 판정 범위를 정한다.
CIDR을 생각하면 된다.

ex) ipv4-prefix-length : 24 인 경우
-> 10.10.10.10이 요청을 하면, 10.10.10.1 ~ 10.10.10.255 (10.10.10.0/24)을
rate-limiting에 대한 기준으로 잡는다.
=> QPS제한이 10인데, 10.10.10.1이 1초에 6번, 10.10.10.2가 1초에 6번 요청을 하면
10.10.10.0/24의 총 QPS는 10을 넘게되므로(12)
Rule 위반, rate-limting 조치를 취하게 된다.


2. ipv6-prefix-length

Default : 56
Value : 1~128 (#Comment 일부 BIND에서는 16~64)
단위 : CIDR

ipv4-prefix-length 와 역할이 똑같다. 단지 ipv4냐 ipv6이냐의 차이이다.


3-1. responses-per-second

Default : 0 (무제한 허용)
Value : 0 ~ 1000
단위 : 개

source를 기준으로, 유효한 질의를 1초에 최대 몇 개의 요청을 받아내냐에 대한 설정
(여기서 유효한 질의 : 올바른 qname과 올바른 qtype)

(예시)
ipv4-prefix-length : 32
responses-per-second : 10
-> 1.2.3.4에서 1초당 10번을 초과하는 요청을 하면 rate-limiting 조치를 취함


3-2. all-per-second

Default : 0 (적용하지 않음)
단위 : 개

정상 / 에러 질의 상관 없이 모든 질의에 대한 제한
보통 responses-per-second의 N배로 설정한다. (권고는 N=4 이상)


N=4 이상을 권고하는 이유 : DNS 요청은 가끔 burst 요청이 들어온다.

예를 들어 메일을 보내려는 경우 SMTP의 mail from 커맨드에 의해
NS, A, AAAA, MX, TXT, PTR이 한번에 조회되는데(bursts of legitimate requests)

이때 모든 질의에 대한 응답이 있는 경우가 아닌 이상 정상/에러 등으로 구분될 수 있다.
허나 all-per-second 값이 responses-per-second 값과 같거나 비슷하다면,
responses-per-second에선 정상인데 all-per-second에서 limiting이 될 수 있다.

즉 정상 질의를 오인할 가능성이 생기기에 N=4 이상으로 권고한다
(BIND 최신버전 문서 참조)


4-1. referrals-per-second

Default : responses-per-second 항목값 (alias)
단위 : 개

- 참조 응답(Referral Response) 에 대한 제한 (Root DNS에 대한 참조)
- 위임(Delegation)에 대한 제한


4-2. nodata-per-second

Default : responses-per-second 항목값 (alias)
단위 : 개

Reply가 NODATA인 경우에 대한 제한
값이 0인 경우 측정하지 않는다.


4-3. nxdomains-per-second

Default : responses-per-second 항목값 (alias)
단위 : 개

Reply가 NXDOMAIN인 경우에 대한 제한
값이 0인 경우 측정하지 않는다.


4-4. errors-per-second

Default : responses-per-second 항목값 (alias)
단위 : 개

Reply가 에러인 경우 (REFUSED, SERVFAIL, FORMERR 등) 에 대한 제한
값이 0인 경우 측정하지 않는다.


5. window

Default : 15
Value : 0 ~ 3600
단위 : 초(second)

Rolling Window Size.

만약 responses-per-second가 5이고, window가 5이면,
5초에 최대 25개의 질의(5x5) 이상을 할 수 없다.


6. slip

Default : 0 (DROP)
Value : 1 ~ 10

0 : DROP 조치 (기본 값)
1 이상 : n번째 Packet의 TC(Truncate) bit를 킨다.

TC bit를 킴으로써 DNS 질의는 UDP에서 TCP로 변경된다.
단, TCP로 질의가 이루어짐으로 3-way handshake 만큼의 부하가 서버에 추가된다.

서버의 부하를 먼저 생각해 Rule을 위반하면 전부 DROP 시키냐,
Rule을 위반하는 정상 클라이언트를 위해 TCP 질의로 전환시키냐의 선택이다.


7. qps-scale

Default : 없음
Value : 1 ~ INT_MAX (32bit unsigned int)

정의를 하는 경우에만 적용된다.
(qps-scale / query-rate * responses-per-second) 값을 초과하면
Rule 위반, rate-limiting 조치를 취한다.


8. log-only

Default : no
Value : {yes | no}

로깅만 할지 실제로 요청을 DROP할지 결정한다.


9. exempt-clients

Default : 없음
Value : CIDR 리스트

rate-limiting 적용 예외 리스트를 설정한다.
Trust 하다고 생각하는 곳에 적용하며 된다.

(예시)
exempt-clients { 1.2.3.4; 192.168.0.0/24; };



[샘플]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
rate-limit {
  ipv4-prefix-length 24;
  ipv6-prefix-length 56;
  responses-per-second 5;
  referrals-per-second 5;
  nodata-per-second 5;
  nxdomains-per-second 5;
  errors-per-second 5;
  all-per-second 20;
  window 15;
  slip 2;
  qps-scale 250;
  log-only no;
  exempt-clients { 127.0.0.1; 192.168.0.0/16; };
}
cs



[실제 차단 예시]

F.ROOT-SERVERS.NET. 의 사례


실제 필자가 운영하는 네임서버 로그.
심심치않게 rate-limiting 로그가 쌓이는 것을 볼 수 있다.



[참고 레퍼런스]

https://www.zytrax.com/books/dns/ch7/hkpng.html#rate-limit
rate-limiting 항목

https://conference.apnic.net/data/37/apricot-2014-rrl_1393309768.pdf

https://downloads.isc.org/isc/bind9/cur/9.14/doc/arm/Bv9ARM.pdf
(BIND9 최신문서)

댓글