rrl

ソースコード ホーム

CoreDNS によってメンテナンスされています

有効化方法
rrl:github.com/coredns/rrl

rrl - レスポンスレート制限による増幅攻撃の緩和

説明

rrl プラグインは、レスポンスのカテゴリごとにレスポンスレートを追跡します。特定のレスポンスのカテゴリは、以下で構成されます。

  • クライアントIPのプレフィックス(ipv4/6-prefix-lengthによる)
  • レスポンスタイプまたはエラーを除いた、要求された名前(qname)(以下のレスポンスタイプを参照)
  • レスポンスタイプまたはエラーを除いた、要求されたタイプ(qtype)(以下のレスポンスタイプを参照)
  • レスポンスタイプ(それぞれ設定可能な1秒あたりの許容数に対応)
    • response - 回答を含む肯定的なレスポンスの場合
    • nodata - NODATA レスポンスの場合
    • nxdomain - NXDOMAIN レスポンスの場合
    • referrals - リファラルまたはデリゲーションの場合
    • error - すべての DNS エラー(NXDOMAINを除く)の場合

無効なリクエストを使用した攻撃からより適切に保護するために、エラタイプの要求に対しては、要求された名前とタイプは個別に分類されません。つまり、すべてのエラーレスポンスは、qnameまたはqtypeに関係なく、クライアントごとにまとめて制限されます。

各カテゴリにはアカウント残高があり、そのレスポンスタイプに設定された1秒あたりの許容レートでクレジットされ、そのカテゴリのレスポンスがクライアントに送信されるたびにデビットされます。アカウント残高が負になると、残高が非負になるまで、そのカテゴリのレスポンスは破棄されます。アカウント残高は、1秒あたりの許容値よりも大きく正になることはできず、ウィンドウ * 1秒あたりの許容値よりも大きく負になることはできません。

レスポンスレート制限の実装は、BIND 9 のレスポンスレート制限機能の動作を再現することを目的としています。

リクエストを制限する場合、各リクエストのカテゴリは、クライアントIPのプレフィックス(ipv4/6-prefix-lengthによる)によって決定されます。

構文

rrl [ZONES...] {
    window SECONDS
    ipv4-prefix-length LENGTH
    ipv6-prefix-length LENGTH
    responses-per-second ALLOWANCE
    nodata-per-second ALLOWANCE
    nxdomains-per-second ALLOWANCE
    referrals-per-second ALLOWANCE
    errors-per-second ALLOWANCE
    requests-per-second ALLOWANCE
    max-table-size SIZE
    report-only
}
  • window 秒 - レスポンスレートが追跡されるローリングウィンドウ(**秒**単位)。デフォルトは15です。

  • ipv4-prefix-length 長さ - ipv4クライアントを識別するために使用するプレフィックスの**長さ**(ビット単位)。デフォルトは24です。

  • ipv6-prefix-length 長さ - ipv6クライアントを識別するために使用するプレフィックスの**長さ**(ビット単位)。デフォルトは56です。

  • responses-per-second 許容数 - 1秒間に許可される肯定的なレスポンスの数。**許容数**が0の場合、肯定的なレスポンスのレート制限は無効になります。デフォルトは0です。

  • nodata-per-second 許容数 - 1秒間に許可される `NODATA` レスポンスの数。**許容数**が0の場合、NODATAレスポンスのレート制限は無効になります。デフォルトは responses-per-second です。

  • nxdomains-per-second 許容数 - 1秒間に許可される `NXDOMAIN` レスポンスの数。**許容数**が0の場合、NXDOMAINレスポンスのレート制限は無効になります。デフォルトは responses-per-second です。

  • referrals-per-second 許容数 - 1秒間に許可されるリファラルレスポンスの数。**許容数**が0の場合、リファラルレスポンスのレート制限は無効になります。デフォルトは responses-per-second です。

  • errors-per-second 許容数 - 1秒間に許可されるエラーレスポンスの数(NXDOMAINを除く)。**許容数**が0の場合、エラーレスポンスのレート制限は無効になります。デフォルトは responses-per-second です。

  • requests-per-second 許容数 - 1秒間に許可されるリクエストの数。**許容数**が0の場合、リクエストのレート制限は無効になります。デフォルトは0です。

  • max-table-size サイズ - 一度に追跡されるレスポンスの最大数。これを超えると、rrlは新しいレスポンスのレート制限を停止します。デフォルトは100000です。

  • report-only - レートを超えた場合にリクエスト/レスポンスを破棄せず、メトリクスのみをログに記録します。デフォルトはfalseです。

メトリクス

モニタリングが有効になっている場合(_prometheus_ プラグイン経由)、以下のメトリクスがエクスポートされます。

  • coredns_rrl_responses_exceeded_total{client_ip} - QPS制限を超えたレスポンスのカウンター。
  • coredns_rrl_requests_exceeded_total{client_ip} - QPS制限を超えたリクエストのカウンター。

例 1


. {
  rrl . {
    responses-per-second 10
  }
}

バグ/既知の問題/制限事項

BIND9のレスポンスレート制限の実装では、ワイルドカードのベースドメインごとに1つのアカウントですべてのワイルドカード生成レコードがレート制限されます。たとえば、`a.dom.com.` と `b.dom.com.` はどちらも、ワイルドカードレコード `*.dom.com.` から生成された場合、`dom.com.` としてカウントされます。

BIND 9.11 ARMによると…

ローカルワイルドカードから生成されたレスポンスは、親ドメイン名に対するものとしてカウントおよび制限されます。これは、random.wild.example.com を使用したフラッディングを制御します。

CoreDNS _rrl_ では、ワイルドカードレスポンスは個別にカウントされます。

関連項目

レスポンスレート制限の概要