DNS (Domain Name Service) 概要 (2)

DNS サーバー

「DNS (Domain Name Service) 概要 (1)」に引き続き DNS について解説していきます.
DNS はインターネットにおいて一番重要なシステム/サービスで,これがない状態は考えられないほど重要なインフラとなっています.

DNS の動き,仕組みを理解することでインターネットに留まらず Active Directory ドメインサービスなどのイントラネットにも役に立ちますので是非理解しましょう.

本記事では,問合せにあたっての通信の動き UDP や TCP,EDNS0 について解説していきます.

DNS (Domain Name Service) の概要

今回は DNS の通信について解説します.

DNS の使用するポート番号

DNS の使用するポート番号は 53番です.UDP 53番は多くの方が認識していると思いますが,TCP 53番も利用される場合があります.

RFC1034 / RFC1035 では UDP で扱えるサイズは 512 オクテット (512 バイト) と定められており,それを超える場合は TCP を利用することと規定されています.

これは,元々 DNS のやり取りは小さなメッセージを大量にさばくことが多いため,ハンドシェイクの不要な UDP が適していたからという背景があります.

また,512 オクテットが最大の理由は IPv4 の仕様による所になります.IPv4 の最小のパケットサイズは 576 バイトで,64 バイトのヘッダーと 512 バイトのデータを最低限処理できないといけない.という所で 512 バイトが最大値として決定されました.
このため,DNS の要求と応答は UDP の場合,必ず1回のやり取りで完結できるようになったのです.

現在,IPv6 アドレスや長大な TXT レコード,DNSSec のおかげで 512 オクテットを超える応答が多いため,口述する EDNS0 が利用できないケースでは TCP による通信に切り替えて行う以外にありません.

TCP フォールバック

DNS 問合せの際,512 オクテットを超える応答がなされる場合,DNS サーバーはレコードサイズが超過しているため,TCP に切り替えて問合せをし直すよう応答を返します.

サーバーは通常の応答メッセージを切り詰めつつ,TC ビットを立てて返します.

クライアントは TC ビットがついていることが確認出来たら,TCP に変えて改めて問合せを行い,サーバーからの応答をを受け取ります.
この動作を TCP フォールバックといいます.

この仕組みにより 512 オクテットを超えたレコードのやり取りが出来るようになりましたが,一度失敗しなければならない.であったり,TCP はハンドシェイクが必要になり負荷が高いためレスポンス悪化につながります.

そのため次に説明する EDNS0 が誕生しました.

EDNS0

DNS が作られた時代と比べて現在はインターネットが Ethernet で構成されており,MTU 1500 バイトが標準となっていること,また,インターネット全体の帯域が大幅に向上しています.

そのような背景もあり,TCPフォールバックのパフォーマンス悪化と負荷に対応するため,UDP のメッセージサイズを緩和させる仕様である「Extension Mechanisms for DNS」が RFC 2671 で標準化されました.

これにより,対応するクライアントからのリクエストへのレスポンスは UDP のまま 512 オクテットを超えて応答が返せるようになりました.
512 オクテットを超えた応答をやり取りできるようになりましたが,推奨値は 1280 バイトから 1410 バイトまでの間とされています.

また,DNSSEC や IPv6 に対応させる場合,EDNS0 の利用は必須という形に RFC 3226 で改定されています.

そのため,現状では TCP フォールバックが発生することはほぼ無い状態ではありますが,絶対に TCP を利用することはない.と言い切れないため TCP 53番も継続して空けておくことをお薦めします.

以下は dig コマンドで実行した結果ですが,クライアントから EDNS version 0 対応であることを通知してリクエストをしていることが確認できます.

以上で DNS 通信の説明を終わります.

次回は押さえておきたい DNS レコードについて解説します.

コメント

タイトルとURLをコピーしました