再帰クエリとは、問い合わせを受けたネームサーバーがクライアントに代わって完全な名前解決を行い、リファラルではなく、最終的な回答またはエラーを返すDNSリクエストのことです。 クライアントは、DNSメッセージヘッダーに再帰希望(RD)フラグを設定することでこの意図を通知し、リゾルバーは必要に応じて他の権威サーバーに問い合わせ、結果をキャッシュして最終的な結果のみを返します。 再帰的リゾルバは、アプリケーションのパフォーマンスと可用性にとって極めて重要ですが、サービス拒否攻撃におけるオープンリゾルバとしての悪用を防止し、キャッシュポイズニングから保護するために、アクセス制御リスト(ACL)による慎重なセキュリティ強化が必要です。
再帰クエリの仕組み
再帰クエリでは、クライアントはDNSメッセージヘッダーに再帰希望(RD)フラグを設定します。受信サーバーは、再帰機能を提供している場合、名前の解決作業を引き受け、最終結果のみを返します。
- クライアントがクエリを送信:クライアント上のスタブリゾルバは、RDフラグが設定されたクエリを、設定された再帰リゾルバに送信します。
- リゾルバはキャッシュを確認します:再帰型リゾルバは、有効なキャッシュされた応答を探します。それが見つかった場合は、直ちにそれを返します。
- リゾルバによる他のサーバーへのクエリ:キャッシュミスが発生すると、リゾルバは通常、ルートサーバーから開始して反復的なクエリを送信します。その後、トップレベルドメインサーバーへのリファラルに従い、最終的にそのゾーンの権威サーバーへとたどっていきます。
- リゾルバーは結果をキャッシュします:リゾルバーは、レコードの有効期間(TTL)で指定された時間、その回答を保存します。
- リゾルバはクライアントに応答します。リゾルバは、再帰利用可能(RA)フラグをセットした状態で、最終的な回答、またはNXDOMAINや SERVFAIL などのエラーを返します。
リゾルバーがいくつのサーバーに問い合わせを行っても、クライアントには1つのリクエストと1つのレスポンスしか表示されません。サーバーは再帰を拒否する場合があり、その場合は自身のデータからのみ応答するか、リファラルまたは拒否を返します。権威サーバーのみは、通常、再帰を提供しません。
再帰クエリに関する一般的な問題
任意の送信元アドレスからの再帰クエリに応答するリゾルバーは、リフレクション攻撃や増幅攻撃に悪用される可能性があります。アクセス制御リスト(ACL)を使用して再帰を内部クライアントの範囲に制限し、インターネットからアクセスできないことを確認してください。
クライアントのサブネットがリゾルバーの許可リストに含まれていない場合、クライアントは「REFUSED」応答を受け取ります。これは、新しいサブネットが展開された後、アクセスリストが更新されていない場合に頻繁に発生します。
再起動やキャッシュのフラッシュ後、すべてのクエリはキャッシュミスとなり、ルートからの完全な探索がトリガーされます。キャッシュが再び温まるまで、ユーザーはページの読み込みが遅くなるのを経験することになります。
ゾーンの権威サーバーに到達できない場合や、不十分な委任情報が返された場合、リゾルバーは解決を完了できず、SERVFAILを返します。クライアント側では単に失敗として認識されるため、リゾルバーでの反復クエリを追跡することで、この不具合を特定することができます。
リゾルバーはTTLが切れるまで応答を保持するため、レコードが変更されても一部のクライアントにはその変更が反映されない場合があります。エンジニアは、変更後、キャッシュの有効期限が切れるか、キャッシュがクリアされるまで、リゾルバー間で結果に不整合が生じているのを確認します。