DNSゾーン転送(誘導DNSクエリタイプAXFRとも呼ばれる)は、 DNSトランザクションの一種です。これは、管理者が複数のDNSサーバー間でDNSデータベースを複製するために利用できる多くのメカニズムの1つです。
ゾーン転送は、トランスポートに伝送制御プロトコル(TCP)を使用し、[ 1 ] [ 2 ]クライアントとサーバーのトランザクションの形式をとります。ゾーン転送を要求するクライアントは、プライマリサーバーからデータを要求するセカンダリサーバーである可能性があります。[ 3 ]複製されるデータベースの部分はゾーンです。
ゾーン転送は、前処理とそれに続く実際のデータ転送で構成されます。前処理では、 「ゾーン頂点」、つまり「ゾーン」の最上位にある DNS 名前空間のノードのStart of Authority (SOA) リソースレコードを検索します。この SOA リソースレコードのフィールド、特に「シリアル番号」によって、実際のデータ転送が必要かどうかが決まります。クライアントは、SOA リソースレコードのシリアル番号を、自身が保持しているそのリソースレコードの最後のコピーのシリアル番号と比較します。転送されるレコードのシリアル番号が大きい場合、ゾーン内のデータは(何らかの形で)「変更された」とみなされ、セカンダリは実際のゾーンデータ転送を要求します。シリアル番号が同じ場合、ゾーン内のデータは「変更されていない」とみなされ、クライアントは既に保持しているデータベースのコピーがあれば、それを引き続き使用できます。
実際のデータ転送プロセスは、クライアントがTCP接続を介してサーバーに特別なクエリタイプAXFR(値252)のクエリ(オペコード0)を送信することから始まります。DNSは技術的にはUser Datagram Protocol(UDP)上のAXFRをサポートしていますが、パケットの損失やなりすましのリスクがあるため、受け入れられないと考えられています。[ 2 ] [ 1 ]サーバーは、「ゾーン」内のすべてのドメイン名のすべてのリソースレコードを含む一連の応答メッセージで応答します。最初の応答は、ゾーンの頂点のSOAリソースレコードで構成されます。他のデータは、特定の順序で続くことはありません。データの終了は、サーバーがゾーンの頂点のSOAリソースレコードを含む応答を繰り返すことによって通知されます。
ゾーン転送クライアントの中には、システムの通常のDNSクエリ解決メカニズムを使用して、プリアンブルのSOAルックアップを実行するものがあります。これらのクライアントは、実際のデータ転送を実行する必要があると判断するまで、サーバーへのTCP接続を開きません。しかし、TCPは通常のDNSトランザクションだけでなくゾーン転送にも使用できるため、他のゾーン転送クライアントは、実際のデータ転送を実行する(または実行する)のと同じTCP接続上でSOAルックアッププリアンブルを実行します。これらのクライアントは、プリアンブルを実行する前にサーバーへのTCP接続を開きます。
上記は全ゾーン転送について説明したものです。段階的ゾーン転送は、全ゾーン転送とは以下の点で異なります。
ゾーン転送は完全にクライアント主導で行われます。サーバーはゾーンデータに変更があった場合に、クライアントに通知するNOTIFYメッセージを送信できますが、ゾーン転送のスケジュール設定は完全にクライアントが行います。クライアントは、データベースが空のときに最初にゾーン転送をスケジュールし、その後は、ゾーン頂点のSOAリソースレコードの「refresh」、「retry」、「expire」フィールドの値によって制御されるパターンで、定期的にゾーン転送をスケジュールします。
ゾーン転送は標準化されており、RFC 1034 および RFC 5936 (RFC 1995 で説明されている増分ゾーン転送) で可能なデータベース複製メカニズムの 1 つとして記述されていますが、これらのデータベース複製メカニズムの中で最も制限が多いものです。ゾーン転送は「ワイヤ形式」のリソースレコード、つまりDNS プロトコルを使用して転送されるリソースレコードに基づいて動作します。ただし、ワイヤ形式のリソースレコードのスキーマは、DNS サーバーのバックエンド自体で使用されるデータベーススキーマと同一ではない場合があります。
ゾーン転送のプリアンブル部分は、ゾーンのデータが変更されたかどうか、したがって実際のデータ転送が必要かどうかを判断するために、シリアル番号のみに依存します。一部の DNS サーバー パッケージでは、SOA リソース レコードのシリアル番号は管理者が手動で管理します。データベースを編集するたびに、変更対象のレコードとゾーン シリアル番号の 2 つの変更が必要になります。このプロセスには正確さが求められます。管理者がシリアル番号の変更を忘れたり、誤って変更したり (減らしたり) する可能性があります。RFC 1912 (セクション 2.2 SOA レコード) では、番号として YYYYMMDDnn (YYYY=年、MM=月、DD=日、nn=リビジョン番号) を使用することを推奨しています。これは 4294 年までオーバーフローしません。
一部のDNSサーバーパッケージは、ディスク上のデータベースファイルの最終更新日時からシリアル番号を自動的に生成することで、この問題を解決しています。例えば、djbdnsがこれに該当します。オペレーティングシステムは、管理者がデータベースファイルを編集するたびに最終更新日時が更新されるようにすることで、シリアル番号を自動的に更新します。これにより、管理者は変更ごとに2箇所(異なる場所)を編集する必要がなくなります。
さらに、シリアル番号チェック(およびゾーン転送自体)が設計されているデータベースレプリケーションのパラダイムは、単一の中央DNSサーバーがデータベースのプライマリバージョンを保持し、他のすべてのDNSサーバーは単にコピーを保持するというものであり、多くの最新のDNSサーバーパッケージのそれとは単純に一致しません。SQLサーバーやActive Directoryなどの高度なデータベースバックエンドを備えた最新のDNSサーバーパッケージでは、管理者は複数の場所でデータベースを更新できます(このようなシステムはマルチマスターレプリケーションを採用しています)。データベースバックエンド独自のレプリケーションメカニズムが、他のすべてのサーバーへのレプリケーションを処理します。このパラダイムは、変更を記録するための単一の中央の単調増加する番号のそれとは単純に一致しないため、ゾーン転送と大部分互換性がありません。高度なデータベースバックエンドを備えた最新のDNSサーバーパッケージは、更新が行われる単一の中央の場所の存在をシミュレートするために「シム」シリアル番号を作成することがよくありますが、これはせいぜい不完全なものです。
幸いなことに、こうした理由や後述するいくつかの理由から、このような高度なデータベースバックエンドを使用するDNSサーバーは、そもそもデータベースレプリケーションのメカニズムとしてゾーン転送を使用することはほとんどなく、代わりにバックエンド自体が提供するはるかに優れた分散データベースレプリケーションメカニズムを採用するのが一般的です。
シリアル番号の比較は、 RFC 1982 で定義されているシリアル番号演算を使用することを意図しています。しかし、RFC 1034 ではこの点が明確に規定されていなかったため、プリアンブルでシリアル番号チェックをすべてのクライアントが同じ方法で実行しているわけではありません。一部のクライアントは、サーバーから提供されたシリアル番号がクライアントが認識しているシリアル番号と異なるか、ゼロ以外であるかどうかだけをチェックします。他のクライアントは、サーバーから提供されたシリアル番号が、クライアントが既に認識しているシリアル番号の指定された範囲内にあるかどうかをチェックします。さらに、後者のチェックに加えて、サーバーから提供されたシリアル番号がゼロではないかどうかもチェックするクライアントもあります。
当初、実際のデータ転送では、単一のドメイン名とタイプの各リソースレコードセットが、サーバーからクライアントへ個別の応答メッセージとして転送されていました。しかし、これは非効率的であるため、一部のDNSサーバーソフトウェアは、DNSプロトコルの応答圧縮メカニズムを利用してデータ転送の総帯域幅要件を削減することを目的とした最適化を実装しました。例えば、以下のようなものです。
一部のクライアントは、元の応答形式のみを想定して設計されており、そのような最適化が適用されるとデータ転送が失敗する可能性があります。そのため、いくつかのDNSサーバーパッケージには、管理者が必要なクライアントに対して「単一応答形式」の応答を使用するように指定できる設定項目が用意されています。
DNS ゾーンに含まれるデータは、運用上のセキュリティの観点から機密情報となる可能性があります。これは、サーバーのホスト名などの情報が公開され、組織に関する情報の発見や、より広い攻撃対象領域の提供に利用される可能性があるためです。2017 年 6 月、ロシアのトップレベルドメインを担当するレジストラが誤って AXFR による DNS ゾーン転送を有効にしたため、560 万件のレコードが誤って公開されました。[ 4 ]
2008年、アメリカ合衆国ノースダコタ州の裁判所は、一般に公開されていない情報を入手するために、権限のない部外者としてゾーン転送を行うことは、ノースダコタ州法に違反すると判決を下した。[ 5 ]