BIND 9.9.2-P2にRRLパッチを当ててみた


BIND 9.9.4ではISCからのリリースにRRLが取り込まれたので、パッチを当てる必要はなくなり、このページもほぼ用済みとなりましたが、唯一、有用かもしれない情報として、BIND 9.9.4では、以下で説明しているパッチを適用したときとは違ってconfigureに
--enable-rrl
オプションを与える必要があることをお伝えしておきます。
BIND 9.10.0では、9.9.3以前のバージョンに以下のパッチを適用したときと同様、RRLが必ず組み込まれるように変更されています。
以下、用済みの情報。
「おーい、エディーだろぉ?」ということで、BIND 9.9.2-P2にRRLパッチを当ててみました。
RRL(Response Rate Limiting)というのは、authoritativeサーバがDNSリフレクタ攻撃の踏み台にされてしまったときに、効果を低減させるための技術です。詳しくはJPRSの■技術解説:「DNS Reflector Attacks(DNSリフレクター攻撃)」についてなどをご覧になって下さい。

ソースを準備する

パッチはBIND9 RRL and RPZ Patchesで配布されています。
このページでは、RPZの速度改善とRRLの複合パッチと、それぞれの単独パッチが配布されていますが、RPZを使う予定はないので、Separate Response Rate Limiting (RRL) Patchesというセクションにあるrl-9.9.2-P2.patchを使いました。また、オリジナルのBIND 9.9.2-P2のソースへのリンクもあります。
オリジナルのBIND 9.9.2-P2のソースツリーのトップディレクトリでパッチを当てます。パッチはどこに置いてもいいんですが、今は/var/tmpに置いたので
$ patch -s -p0 -i /var/tmp/rl-9.9.2-P2.patch 
のように実行しました。

インストールする

パッチの中にはconfigureへの適用箇所はないので、configureにはRRLを有効にするためのオプションは特になく、普通にconfigureしてmakeすればRRLが有効になった物が生成されます。

設定する

試した環境ではdoc/armがうまくmakeできなかったんですが、Bv9ARM-book.xmlを開き、Rate Limitingという文字列を検索するとRRLについての説明箇所が見つかります。
named.confのoptions{}あるいはview{}の中にrate-limit{}という設定を追加すると、RRLが有効になります。rate-limit{}の中で設定できるパラメータには があります。
ここではresponses-per-secondだけを設定して
options {
        directory "/proj/bind-9.9.2-rl.094.21-P2/etc";
        rate-limit {
                responses-per-second 1;
        };
};
logging {
        channel mydefault {
                file "/proj/bind-9.9.2-rl.094.21-P2/var/named.log";
                print-category yes;
                print-severity yes;
        };
        category default {
                mydefault;
        };
};
zone "example.jp" {
        type master;
        file "example.jp";
};
と設定してみました。
named-checkconfでも特にエラーが出なかったのでnamedを起動してみました。ログにも特にエラーは出ませんでした。

queryしてみる

queryしてみました。10.2.255.241がクライアント、10.2.255.245がサーバです。
$ i=0
$ while [ $i -lt 4 ]; do
> dig @10.2.255.245 www.example.jp
> i=`expr $i + 1`
> done

1発目

20:19:59.118274 IP (tos 0x0, ttl 64, id 31158, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.241.43277 > 10.2.255.245.53: 4995+ A? www.example.jp. (32)
20:19:59.119126 IP (tos 0x0, ttl 64, id 259, offset 0, flags [none], proto UDP (17), length 109)
    10.2.255.245.53 > 10.2.255.241.43277: 4995* 1/1/1 www.example.jp. A 192.0.2.80 (81)
; <<>> DiG 9.6.-ESV-R5-P1 <<>> @10.2.255.245 www.example.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4995
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.example.jp.                        IN      A

;; ANSWER SECTION:
www.example.jp.         86400   IN      A       192.0.2.80

;; AUTHORITY SECTION:
example.jp.             86400   IN      NS      ns.example.jp.

;; ADDITIONAL SECTION:
ns.example.jp.          86400   IN      A       10.2.255.245

;; Query time: 1 msec
;; SERVER: 10.2.255.245#53(10.2.255.245)
;; WHEN: Thu Apr 18 20:19:59 2013
;; MSG SIZE  rcvd: 81
普通にUDPでレスポンスが返っています。

2発目

20:19:59.123334 IP (tos 0x0, ttl 64, id 31164, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.241.51482 > 10.2.255.245.53: 7642+ A? www.example.jp. (32)
20:19:59.123793 IP (tos 0x0, ttl 64, id 260, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.245.53 > 10.2.255.241.51482: 7642*| 0/0/0 (32)
これだけではよくわかりませんが、1発目と違ってanswer sectionが表示されていません。また、すぐ続けてTCPでのqueryが始まっていますので、TC bitが立ったresponseが返されたんだと推測されます。
;; Truncated, retrying in TCP mode.
20:19:59.124068 IP (tos 0x0, ttl 64, id 31166, offset 0, flags [DF], proto TCP (6), length 60)
    10.2.255.241.51343 > 10.2.255.245.53: Flags [S], cksum 0x895e (correct), seq 3382627719, win 65535, options [mss 1460,nop,wscale 3,sackOK,TS val 3968360006 ecr 0], length 0
20:19:59.124096 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    10.2.255.245.53 > 10.2.255.241.51343: Flags [S.], cksum 0x141a (incorrect -> 0x86d2), seq 43972361, ack 3382627720, win 14480, options [mss 1460,sackOK,TS val 1167408 ecr 3968360006,nop,wscale 4], length 0
20:19:59.124217 IP (tos 0x0, ttl 64, id 31167, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.241.51343 > 10.2.255.245.53: Flags [.], cksum 0xcda5 (correct), ack 1, win 8326, options [nop,nop,TS val 3968360006 ecr 1167408], length 0
20:19:59.124280 IP (tos 0x0, ttl 64, id 31168, offset 0, flags [DF], proto TCP (6), length 86)
ハンドシェークが済んで…
    10.2.255.241.51343 > 10.2.255.245.53: Flags [P.], cksum 0x8d42 (correct), seq 1:35, ack 1, win 8326, options [nop,nop,TS val 3968360006 ecr 1167408], length 3463520+ A? www.example.jp. (32)
20:19:59.124303 IP (tos 0x0, ttl 64, id 10042, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.245.53 > 10.2.255.241.51343: Flags [.], cksum 0x1412 (incorrect -> 0xea80), ack 35, win 905, options [nop,nop,TS val 1167408 ecr 3968360006], length 0
20:19:59.125552 IP (tos 0x0, ttl 64, id 10043, offset 0, flags [DF], proto TCP (6), length 135)
    10.2.255.245.53 > 10.2.255.241.51343: Flags [P.], cksum 0xfd6d (correct), seq 1:84, ack 35, win 905, options [nop,nop,TS val 1167409 ecr 3968360006], length 8363520* 1/1/1 www.example.jp. A 192.0.2.80 (81)
queryとresponseがやりとりされ…
20:19:59.125957 IP (tos 0x0, ttl 64, id 31176, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.241.51343 > 10.2.255.245.53: Flags [F.], cksum 0xcd2c (correct), seq 35, ack 84, win 8326, options [nop,nop,TS val 3968360008 ecr 1167409], length 0
20:19:59.126544 IP (tos 0x0, ttl 64, id 10044, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.245.53 > 10.2.255.241.51343: Flags [F.], cksum 0x1412 (incorrect -> 0xea28), seq 84, ack 36, win 905, options [nop,nop,TS val 1167409 ecr 3968360008], length 0
20:19:59.126643 IP (tos 0x0, ttl 64, id 31177, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.241.51343 > 10.2.255.245.53: Flags [.], cksum 0xcd2c (correct), ack 85, win 8325, options [nop,nop,TS val 3968360008 ecr 1167409], length 0
TCPコネクションが切断されました。
; <<>> DiG 9.6.-ESV-R5-P1 <<>> @10.2.255.245 www.example.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63520
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.example.jp.                        IN      A

;; ANSWER SECTION:
www.example.jp.         86400   IN      A       192.0.2.80

;; AUTHORITY SECTION:
example.jp.             86400   IN      NS      ns.example.jp.

;; ADDITIONAL SECTION:
ns.example.jp.          86400   IN      A       10.2.255.245

;; Query time: 1 msec
;; SERVER: 10.2.255.245#53(10.2.255.245)
;; WHEN: Thu Apr 18 20:19:59 2013
;; MSG SIZE  rcvd: 81

3発目

20:19:59.129670 IP (tos 0x0, ttl 64, id 31178, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.241.11664 > 10.2.255.245.53: 14044+ A? www.example.jp. (32)
3発目のqueryに対するresponseは返っていません。ちなみに明示的に設定していませんが、slipのデフォルト値は2です。

4発目

20:20:04.129989 IP (tos 0x0, ttl 64, id 31191, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.241.11664 > 10.2.255.245.53: 14044+ A? www.example.jp. (32)
20:20:04.130368 IP (tos 0x0, ttl 64, id 261, offset 0, flags [none], proto UDP (17), length 109)
    10.2.255.245.53 > 10.2.255.241.11664: 14044* 1/1/1 www.example.jp. A 192.0.2.80 (81)
3発目のqueryから5秒後に、digの再送により4発目のqueryが送られ、今度は1発目と同じようにUDPで普通にresponseが返っています。
; <<>> DiG 9.6.-ESV-R5-P1 <<>> @10.2.255.245 www.example.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14044
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.example.jp.                        IN      A

;; ANSWER SECTION:
www.example.jp.         86400   IN      A       192.0.2.80

;; AUTHORITY SECTION:
example.jp.             86400   IN      NS      ns.example.jp.

;; ADDITIONAL SECTION:
ns.example.jp.          86400   IN      A       10.2.255.245

;; Query time: 0 msec
;; SERVER: 10.2.255.245#53(10.2.255.245)
;; WHEN: Thu Apr 18 20:20:04 2013
;; MSG SIZE  rcvd: 81

5発目

20:20:04.134922 IP (tos 0x0, ttl 64, id 31198, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.241.60492 > 10.2.255.245.53: 31432+ A? www.example.jp. (32)
20:20:04.135165 IP (tos 0x0, ttl 64, id 262, offset 0, flags [none], proto UDP (17), length 60)
    10.2.255.245.53 > 10.2.255.241.60492: 31432*| 0/0/0 (32)
2発目と同様にTC bitが立ったresponseが返ったと推測されます。
;; Truncated, retrying in TCP mode.
20:20:04.135474 IP (tos 0x0, ttl 64, id 31200, offset 0, flags [DF], proto TCP (6), length 60)
    10.2.255.241.14617 > 10.2.255.245.53: Flags [S], cksum 0xbc40 (correct), seq 3674932508, win 65535, options [mss 1460,nop,wscale 3,sackOK,TS val 3968365017 ecr 0], length 0
20:20:04.135502 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    10.2.255.245.53 > 10.2.255.241.14617: Flags [S.], cksum 0x141a (incorrect -> 0x131c), seq 202936131, ack 3674932509, win 14480, options [mss 1460,sackOK,TS val 1168661 ecr 3968365017,nop,wscale 4], length 0
20:20:04.135620 IP (tos 0x0, ttl 64, id 31201, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.241.14617 > 10.2.255.245.53: Flags [.], cksum 0x59ef (correct), ack 1, win 8326, options [nop,nop,TS val 3968365017 ecr 1168661], length 0
20:20:04.135679 IP (tos 0x0, ttl 64, id 31202, offset 0, flags [DF], proto TCP (6), length 86)
    10.2.255.241.14617 > 10.2.255.245.53: Flags [P.], cksum 0xbd67 (correct), seq 1:35, ack 1, win 8326, options [nop,nop,TS val 3968365017 ecr 1168661], length 3421573+ A? www.example.jp. (32)
20:20:04.135702 IP (tos 0x0, ttl 64, id 23121, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.245.53 > 10.2.255.241.14617: Flags [.], cksum 0x1412 (incorrect -> 0x76ca), ack 35, win 905, options [nop,nop,TS val 1168661 ecr 3968365017], length 0
20:20:04.136562 IP (tos 0x0, ttl 64, id 23122, offset 0, flags [DF], proto TCP (6), length 135)
    10.2.255.245.53 > 10.2.255.241.14617: Flags [P.], cksum 0x2d94 (correct), seq 1:84, ack 35, win 905, options [nop,nop,TS val 1168661 ecr 3968365017], length 8321573* 1/1/1 www.example.jp. A 192.0.2.80 (81)
20:20:04.136993 IP (tos 0x0, ttl 64, id 31212, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.241.14617 > 10.2.255.245.53: Flags [F.], cksum 0x5977 (correct), seq 35, ack 84, win 8326, options [nop,nop,TS val 3968365019 ecr 1168661], length 0
20:20:04.137378 IP (tos 0x0, ttl 64, id 23123, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.245.53 > 10.2.255.241.14617: Flags [F.], cksum 0x1412 (incorrect -> 0x7672), seq 84, ack 36, win 905, options [nop,nop,TS val 1168662 ecr 3968365019], length 0
20:20:04.137469 IP (tos 0x0, ttl 64, id 31213, offset 0, flags [DF], proto TCP (6), length 52)
    10.2.255.241.14617 > 10.2.255.245.53: Flags [.], cksum 0x5976 (correct), ack 85, win 8325, options [nop,nop,TS val 3968365019 ecr 1168662], length 0
; <<>> DiG 9.6.-ESV-R5-P1 <<>> @10.2.255.245 www.example.jp
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21573
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;www.example.jp.                        IN      A

;; ANSWER SECTION:
www.example.jp.         86400   IN      A       192.0.2.80

;; AUTHORITY SECTION:
example.jp.             86400   IN      NS      ns.example.jp.

;; ADDITIONAL SECTION:
ns.example.jp.          86400   IN      A       10.2.255.245

;; Query time: 1 msec
;; SERVER: 10.2.255.245#53(10.2.255.245)
;; WHEN: Thu Apr 18 20:20:04 2013
;; MSG SIZE  rcvd: 81

ログ

クライアントからqueryすると、ログに
rate-limit: info: limit responses to 10.2.255.0/24 for www.example.jp IN A  (05a95147)
というメッセージが記録されました。windowのデフォルト値は15(秒)ですが、rate limitが動作してから15秒経っても、解除されたというメッセージは出ませんでした。
Copyright(c) 2013 Koh-ichi Ito, All rights reserved
ページ先頭のアイコン: Copyright(c) 2017 いらすとや, All rights reserved.
Last update: $Date: 2019-08-16 11:45:02 +0900 (Fri, 16 Aug 2019) $
[DNS関連情報へ]