NSDはデフォルトでReponse Rate Limiting (RRL) がONになっている。 RRLは、DNSコンテンツサーバがDNS amp攻撃の踏み台とならないために存在する機能である。 DNS amp攻撃は、UDPパケットの送信元IPアドレスを攻撃対象のIPアドレスにし、DNSのレスポンスを攻撃対象に向ける攻撃手法である。 RRLは、この攻撃の緩和手法である。 DNSコンテンツサーバへの問い合わせは通常は、DNSキャッシュサーバが行う、つまり、通常は問い合わせをキャッシュしているはずである。 それを利用して、同じ送信元のIPアドレスから、同じレコードに対して大量の問い合わせがあった場合に、コンテンツサーバにおいてRate Limitingを行う機能である。 NSDのRRLには以下のようなオプションがある。

rrl-size: 1000000
rrl-ratelimit: 200
rrl-ipv4-prefix-length: 24
rrl-ipv6-prefix-length: 64
rrl-slip: 2
rrl-whitelist-ratelimit: 2000

rrl-size はRRLのカウントを行うハッシュテーブルのサイズを表している。 大きいとそもぶんメモリを食う

rrl-ratelimit は最も大事な何qps(query per second)でRate Limitを発動するかの閾値を決定している。 0 を設定するとRRLが無効になる。

rrl-ipv4-prefix-lengthrrl-ipv6-prefix-length はそれぞれ、RRLのカウントをどのプレフィックスの長さでまとめるかを表している。

rrl-whitelist-ratelimitrrl-ratelimit とは異なる値を設定して、RRLの制限を一部緩くしたホワイトリストに対する最大qpsを指定する。 ホワイトリストは zone 説の中で分類タイプとともに例えば以下のように設定する。

zone:
  name: example.com
  zonefile: example.com.zone
  rrl-whitelist: nxdomain

といった形で設定する、これにより、 example.com への問い合わせの結果が NXDOMAIN だったレスポンスに対しては、 rrl-whitelist-ratelimit のqpsで制限される。 また、このタイプにはnxdomain, error, referral, any, rrsig, wildcard, nodata, dnskey, positive, allが使用出来る。

rrl-slip はSLIP応答(TCPにフォールバックしろという応答)を返すまでのパケット数である。 DNS amp攻撃は基本的にUDPで行われるので、TCPにはRRLは行われない。 rrl-slip はUDPでRate Limitに引っかかった場合にその後、nパケット目にSLIP応答を返すという設定になる。 デフォルトの 2 の場合は1回目は破棄して、2回目のパケットでSLIP応答を返す。 毎回返したい場合は 1 を設定すればいい。 返したくない場合は 0 を指定する。

まぁ、なんでこんなながながと書いたかというと、NSDのベンチマークを取ろうとして、RRLに気付かずに30分くらいはまったからですね。