![]() |
![]() |
@IT|@IT自分戦略研究所|@IT情報マネジメント |
|
@IT > Master of IP Network > DNSの設定は正しいか? |
![]() 連載:ネットワーク・コマンドでトラブル解決(7) DNSの設定は正しいか? 〜nslookup/ipconfig〜 加地眞也 2002/3/21
■DNS設定と利用DNS(Domain Name Service)は、インターネットの根本ともいえる基本的なサービスだ。ホスト名とIPアドレス間の名前解決などは、インターネットの「ディレクトリ・サービス」の先駆けであり、これなくしてインターネットの運用はありえない。 基本的な概念や製品個々での設定方法については、「連載:DNSの仕組みと運用」などの関連記事を参照いただくとして、ユーザーとして利用する場合の設定は簡単だ。
Windowsでは「ネットワークとダイヤルアップ接続」のプロパティに、Linuxでは/etc/resolv.confファイルに、それぞれ使用するDNSサーバ(フルサービス・リゾルバ)名や所属するドメイン名を指定することで、そのホストのDNSクライアント機能を設定できる。通常、そのホストでリゾルバ(DNSクライアント)機能を使用する際に、すべてのアプリケーションに反映されるメインの設定となる。Windowsでは、ipconfigコマンドから使用されるDNSサーバを確認することもできる。 または、DHCP機能でDNSサーバ名やドメイン名を自動設定することも可能だ。
リゾルバ機能をエミュレートするnslookupコマンドは、この仕組みの中でほかのアプリケーションが実行する名前解決を、まったく同じように実行するためのコマンドだ。通常のアプリケーションでは、プロパティやresolv.confファイルの設定に沿った解決を行うだけだが、nslookupコマンドではDNSサーバの切り替えなど、細かな設定が独自に行える。 また、Windows 2000のipconfigコマンドではローカルのDNSキャッシュの表示を行える。このキャッシュは、DNS Clientサービスが管理する、これまでに名前解決した結果の履歴だ。複数のアプリケーションで効率よく共有することで、パフォーマンス向上が実現できる。DNS Clientサービスは、一種のDNSサーバ(キャッシュ・サーバ)である。DNS Clientサービスを動かしていない場合には無効となり、単純なスタブ・リゾルバ機能のみを提供する。 ■DNSの処理フローDNSの基本仕様はRFC1034/RFC1035で定義されている。問い合わせと回答を表す一連のDNSメッセージを、DNSサーバとDNSクライアントが交換し合って、名前解決を行う。
クライアント→サーバへの問い合わせと、サーバ→クライアントへの回答のためのDNSメッセージ構造は、同じフォーマットが定義されている。もちろん、問い合わせか回答かによって、含まれるデータ・セクションは異なる。 まずヘッダでは、このデータが問い合わせなのか回答なのかなどを表す。特にフラグでは、順に含まれる以下のようなフラグやパラメータを用いて、クライアント/サーバ双方に必要な問い合わせ/回答種類やステータスを通知し合う。 ●QR:1ビット ●オペレーション・コード*1(OPCODE):4ビット
0:標準問い合わせ ●Authoritative Answer(AA):1ビット ●Trancation(TC):1ビット ●再帰検索要求(RD):1ビット
0:インタラクティブ問い合わせ ●再帰検索可能(RA):1ビット
0: 再帰検索不可 ●予約:1ビット ●Authentic Data(RFC2535) ●レスポンス・コード*1(RCODE):4ビット
0:正常(NoError)
一方、セクションは、実際にDNSを検索するキー・データや結果を格納するためのデータ・エリアだ。 ●Questionセクション ●Answerセクション ●Authorityセクション ●追加セクション 問い合わせでは、Questionセクションに検索キーを格納してサーバへ渡される。サーバでは検索結果をAnswerセクションへ格納してクライアントへ回答する。Answerセクションや追加セクションなどに格納されるデータは、DNSサーバが管理するレコード・データ(Resource Records:RR)そのものである。また、セクションには複数のレコード・データが格納される場合もある。 下記は、実際の名前解決(Aレコード検索)時の様子だ。
Answerセクションによって問い合わせられたwww.example.netのIPアドレスを回答するとともに、そのデータにオーソリティを持つ(ゾーン情報の元)NSサーバ名とIPアドレスを、Authorityセクションと追加セクションで通知している。また例では、再帰検索が指定されているので、DNSサーバはフルサービス・リゾルバとして動作して、ほかのDNSサーバー(ドメイン・ツリー)から再帰検索を行っている。DNSサーバが再帰検索を許可されておらず、自身が知らない情報を問い合わされた場合には、エラー(RCODE=3)が返されることだろう。Questionセクションに示される検索キーのタイプがPTRレコードやSOAレコード、MXレコードなどに変更されることで、DNSサーバのさまざまなレコードの検索も可能になる。 ここでは、DNSクライアント〜フルサービス・リゾルバ間での例だが、フルサービス・リゾルバからドメイン・ツリーの各DNSサーバへの検索では再帰検索ではなく、インタラクティブ検索(そのDNSサーバの管理するゾーン情報だけの検索)が指定されるだけで、ほとんど違いはない。 DNSプロトコルは、通常のクライアントからの名前解決時のほか、プライマリDNSサーバからセカンダリDNSサーバへの「ゾーン転送」時にも同様に使用される。プロトコルの理屈はまったく同様だ。
セカンダリDNSサーバがDNSクライアントとして動作して、プライマリDNSサーバが保持する該当ゾーンの全データを要求し、反映を行う。名前解決時との違いは、問い合わせ時のQuestionセクションでTypeとしてAXFR(完全転送)が指定されているだけだ。通常はデータ量が多いため、TCP接続を用いてAnswerセクションにゾーンのレコード情報をまとめて送信する(古い実装ではAnswerセクションではなく、複数のDNSデータに分割される場合もある)。 ■DNS Uodate(ダイナミックDNS)DNS Update(RFC2136)は、「ダイナミックDNS」の名でよく知られている。これまでのDNSでは、ローカルのゾーン定義ファイルを読み込んでゾーン情報を変更する、つまり静的な更新しか行えなかったが、DNS Updateではクライアントなど外部からの要求に応じてゾーン情報(レコード)を追加/削除する仕組みが提供される。「動的DNS」などとも呼ばれる。
DNS UpdateのためのDNSメッセージは、オリジナルのメッセージともフォーマットが多少異なる。これは、DNS Updateはクライアントからサーバへのデータ更新が可能かどうかの確認と変更要求という、これまでにはなかった機能が必要だからだ。ヘッダはオリジナルと同じだが、セクションは以下のデータから構成される。 ●Zoneセクション ●Prerequisiteセクション ●Updateセクション ●追加セクション DNS Updateのフローは大きく2段階に分けられる。 クライアントは、まずDNS検索でUpdateしたいドメインのDNSサーバを調べたうえで、そのDNSサーバに対して必要条件(Prerequisite)を検索する。これは、登録したいホスト名やIPアドレスがすでに存在していないかどうかをチェックするフェイズだ。Prerequisiteセクションで必要条件を指定する。必要条件は通常のレコード情報と酷似しているが、レコード・タイプやクラスなどの指定の仕方によって、以下のような種類の指定ができる。 ●RRset Exists(Value Independent) ●RRset Exists(Value Dependent) ●RRset Does Not Exist ●Name Is In Use ●Name Is Not In Use これらの結果は、通常のDNSの回答メッセージとして示される。すべての条件を満たした場合のみ、RCODE=0(正常)が返答される。そのほかのエラーのために、RCODEとして以下のコード番号が追加されている。
6:登録要求されたのと同じ名前のレコードが既に存在している(YXDOMAIN) 次に実際のレコード登録が行われる。Updateセクションに登録したいレコードを格納するとともに、やはり重複登録などを避けるために必要条件もPrerequisiteセクションで指定する。正常に登録されれば、RCODEが0として返答されるはずだ。AレコードとPTRレコードをそれぞれ登録したい場合には、Prerequisite+Update要求も2回実行されることになる。またここでは新規登録時の例を示したが、単に定期的にクライアントが自身の情報を更新したいだけの場合には、Prerequisite+Update要求のみ行われることになるだろう。 なお、DNS Updateには更新要求自体は定義されていない。レコードを削除したうえで新規登録を要求することになる。レコード削除のためには、レコードのほかの部分を一致させたうえで、クラスが'ANY'でTTLとデータサイズ(LENGTH)が'0'、リソース・データがなし、となるレコードをUpdateセクションに指定すればよい。またさらに、タイプを'ANY'とすることで、同じRR名を持つレコードをすべて削除できる。同じRR名とタイプを持つ複数のレコードが存在している場合には、クラスを'none'としてそのリソース・データとデータ¥サイズを指定すれば、特定のレコードのみを削除可能だ。 ■DNS Notifyと差分転送DNS Updateの適用は、これまでのDNSにおける基本的な考え方にも大きく影響を及ぼす。典型的な例がプライマリ〜セカンダリDNSサーバ間のゾーン転送時の問題だ。 従来のゾーン転送では、プライマリが指定したゾーン情報の更新間隔に従って、セカンダリがプライマリから定期的に、すべてのゾーン情報の転送を行う。これは、ゾーン情報はあまり変更されることが多くない「静的」データであるという前提があったからだ。しかしDNS Updateでは、より頻繁にゾーンが更新されるかもしれない。より短い更新間隔でなければ、セカンダリは最新状態を保てなくなるだろう。また、DNS Updateで更新されるのはレコードの単位だ。すべてのレコードが変更されていないのに、すべてのゾーン情報を転送するのは効率的ではない。 その1つ目の解決策がDNS Notify(RFC1996)だ。DNS Notifyは従来のゾーン転送とは逆に、プライマリからセカンダリに対するゾーン転送開始を指示するための通知だ。これにより、DNS Updateによってゾーン情報が更新されたプライマリから遅滞なく、セカンダリの情報更新も保証できる。 差分転送(IXFR:RFC1995)は常にゾーン情報全体を更新するのではなく、DNS Updateなどで更新されたレコードのみを転送する仕組みだ。これにより転送時間が短縮されるとともに、多数のセカンダリが存在するによるネットワーク帯域への負荷などの問題も低減できる。ただし、DNSサーバ側では、更新されたレコードを更新タイミングのシリアル番号とともに関連付けて把握されていなければならない。
本企画では、各種コマンド/ツール紹介やそれらを活用したTipsを順次追加、各種索引を用意して、読者の方々に手軽にご利用いただける、便利なリソース集としてアップデートしていく予定です。ぜひご期待ください。 |
![]()
|
|
|||||||||
@IT [FYI] 注目記事 ![]() ![]() ![]()
|
Master of IP Networkフォーラムスポンサー |
Copyright(c) 2000-2004 atmarkIT 著作権はアットマーク・アイティまたはその記事の筆者に属します @ITに掲載されている記事や画像などの無断転載を禁止します 「アットマーク・アイティ」「@IT」「@IT自分戦略研究所」「@ITハイブックス」は、株式会社アットマーク・アイティの登録商標です 弊社へのご連絡は「アットマーク・アイティへのお問い合わせ」をご覧ください |