第7回 IPv6とDNSサーバ:Windows管理者のためのIPv6入門
ホスト名からIPv6アドレスを求めたり、その逆を行うには、IPv6に対応したDNSサーバを利用する。Windows ServerのDNSサーバでIPv6を扱う方法を解説する。特に逆引きゾーンの設定方法に注意する。
前回は、LLMNRというWindows OS独自の名前解決機能について紹介した。今回は、より汎用性の高いDNSv6を使った名前解決について取り上げる。
IPv6のDNSとは?
IPv6の名前解決手段として、前回は「LLMNR(Link-Local Multicast Name Resolution)」を取り上げた。これは、単一のネットワーク・セグメント上でのIPv6マルチキャストを使った簡易な名前解決メカニズムである。利用にあたっては何の準備もいらず、名前解決のためのサーバなどを用意する必要もない。
だがLLMNRは簡便だが、ルータを越えたネットワークをまたいで名前解決することはできない。組織内に複数のネットワークがあり、ルーティングが必要な場合は、IPv6向けのDNSサーバを使ってIPv6アドレスとホスト名の対応などを管理する必要がある。DNSサーバとの通信は通常のユニキャスト通信が使われるので、ルータを越えた場所にDNSサーバがあっても問題なく利用できる。
DNSはすでにIPv4の世界では広く使われており、ネットワークには必須のサービスである。Active Directoryでは必須のため、すでにWindows OS上のDNSサーバを導入して使っているケースも多いだろう。Windows ServerのDNSサーバはIPv6に対応しているので、そのままIPv6向けのDNSサーバとして利用できる。
それではIPv6用のDNSサーバは、IPv4用のDNSサーバとは何が異なるのだろうか?
結論から言えば、両者にはほとんど何も違いはない。IPv4用のDNSと比べると、IPv6用のリソース・レコードが登録できたり、IPv6経由でも問い合わせが可能になったりしているだけである。具体的には次のような点が拡張されている。
- IPv6アドレス(AAAAレコード)が登録できる
- IPv6の逆引きレコード(PTRレコード)が登録できる
- DNSの拡張規格EDNS0に対応している
- クエリ/応答はIPv4とIPv6の両方に対応している
「EDNS0(Extension Mechanisms for DNS)」とは、主にIPv4向けのDNSサーバに対する拡張仕様のことであり(RFC2671で定義されている)、より長いクエリ/応答パケットなどを使えるようにしたものである。IPv6のアドレス幅(128bit)はIPv4(32bit)の4倍もあるし、逆引きレコードなども長くなるので、UDPパケットを使った従来のDNSにおける最大512bytesという制限を超える可能性がある(UDPでは512bytesまでのデータ送信は保証されているが、それよりも大きい場合は、環境やシステムによっては通信できない可能性がある)。それを避けるために、EDNS0ではもっと長いパケットを送受信できるように、TCPを使ったクエリ/応答も許可している。IPv6対応のDNSサーバではこのEDNS0に対応する必要がある。
●DNSサーバとの通信プロトコル
最後の「クエリ/応答はIPv4とIPv6の両方に対応」とは、DNSサーバに対するクエリや応答を、IPv4とIPv6のどちらを使ってもアクセスできるようにする、という意味である。これは必須ではないが、一般的にはIPv4とIPv6のどちらのプロトコルを使ってDNSサーバにアクセスしても構わないようになっている。
IPv4とIPv6の両方のDNSサーバが利用できる場合、実際のDNSのクライアント(「DNSリゾルバ」という)が、IPv4とIPv6のどちらを優先して利用するか(どちらへ先に接続を試みるか)は実装依存である(RFC3484にガイドラインがある)。当初は、まずIPv6を試行し、失敗したらIPv4で再試行するというものが多かったが、最近では両方同時に接続を試行し、先に応答があった方を利用する、といった実装も少なくない。
●IPv4レコードとIPv6レコードを両方返すとどうなる?
IPv6に対応しているホストは通常IPv4アドレスも割り当てられているだろう。そのため、DNSサーバにホスト・レコードを登録する場合はIPv4とIPv6アドレスの両方を登録していることがある。例えば以下は、両方のIPアドレス・レコードが登録されているDNSサーバの例である。
※コマンド・プロンプト上のnslookupコマンドで問い合わせた例
C:\>nslookup xbox.com
サーバー: exampleaddc1.example.jp
Address: 10.20.1.101 …サーバへはIPv4アドレスでアクセス
権限のない回答:
名前: xbox.com
Addresses: 2a01:111:f009::3b03 …IPv6アドレス
65.55.42.140 …IPv4アドレス
C:\>
DNSサーバへの問い合わせはいずれもIPv4経由であるが、結果のレコードにはIPv4とIPv6アドレスの両方が含まれている。このような場合に、どちらのIPアドレスを優先して使用するかもやはり実装依存である。基本的には、IPv6アドレスが含まれていると、それを優先する(IPv6で先に接続しようとする)システムが多い。そのためIPv6での到達可能性がなければ(IPv6リーチャブルでなければ)、DNSサーバにはIPv6アドレスを登録しないことが望ましい。
●DNSサーバのアドレスをクライアントに配布するには?
DNSサーバを使うためには、クライアントPCのネットワーク・インターフェイスでTCP/IPのプロパティ画面を開き、DNSサーバのアドレスを設定する必要がある。もしくは、第5回で解説したDHCPの機能を使ってクライアントにDNSサーバのアドレスを配布すればよい。ただしすでにIPv4のDHCPでDNSサーバのアドレスを配布しているなら、IPv6のDHCPで重ねて配布する必要はないだろう。
DNSサーバにIPv6アドレスを登録する
DNSサーバにIPv6アドレスを登録する方法はシステムによっても異なるが、ここではWindows Serverの例を紹介する。以下の画面は、Active Directoryを導入したWindows Server 2008 R2のDNSサーバの例である。この例ではIPv6のアドレスはDHCPv6を使って配布しているため、何もしなくても、クライアントのIPv6アドレスが自動的にDNSサーバに登録されるようになっている(設定によっては、ドメインに参加していないクライアントからの更新要求は無視される。DNSのゾーンのプロパティで確認/設定できる)。
DNSサーバに登録されたIPv6アドレスの例
Windows Serverに付属するDNSサーバは、何も設定しなくてもIPv6アドレスのレコードを登録できるし、IPv6でもアクセスできるようになっている。これはWindows Server 2008 R2のDNSの画面例だが、それ以降のServer OSでも操作方法は同じである。
(1)ホスト名。ここでは1つのホスト名に対して複数のIPアドレスが定義されている。
(2)IPv4アドレスの例。「Aレコード」で登録する。
(3)IPv6アドレスの例。「AAAAレコード」で登録する。
この「svr1」というホストには、静的に割り当てたIPアドレスやDHCPサーバ経由で割り当てたアドレスなど、全部で4つのアドレスが定義されている。「Host (A)」とあるのがIPv4アドレスを定義するAレコード、「IPv6 Host (AAAA)」がIPv6アドレスを定義するAAAAレコードである(IPv6のIPアドレス幅はIPv4の4倍なのでAAAAレコードと表記される)。
このレコードをnslookupコマンドで検索すると次のようになる。
※コマンド・プロンプトからnslookupコマンドで問い合わせた例
C:\>nslookup -type=all svr1 127.0.0.1
サーバー: localhost
Address: 127.0.0.1
svr1.example.jp internet address = 10.100.1.11
svr1.example.jp AAAA IPv6 address = 2001:db8:beef:cafe:919c:df90:ad3a:39c4
svr1.example.jp AAAA IPv6 address = 2001:db8:beef:cafe:3941:a2c7:392e:e3b7
svr1.example.jp AAAA IPv6 address = 2001:db8:beef:cafe:0:100:1:11
※4つのレコードが得られた。1つはIPv4、3つはIPv6のレコードである
C:\>
●IPv6アドレスを登録する
IPv6アドレスをDNSサーバに登録する手順はIPv4アドレスを登録するのと同じである。DNSマネージャで任意のDNZゾーンを選択し、[操作]メニューの[新しいホスト (A または AAAA)]を実行する。すると「新しいホスト」ダイアログが表示されるので、ホスト名とIPv6表記のアドレスを入力する。
IPv6アドレス・レコードの登録
DNSサーバにIPv6アドレスを登録するには、「新しいホスト」ダイアログでIPv6アドレスを指定するだけでよい。
(1)ホスト名。
(2)作成するレコードがAレコードかAAAAレコードかは、入力されたアドレス形式から自動的に判別され、作成される。IPv6形式で入力するとAAAAレコードが作成される。
(3)これをオンにしておくと、対応する逆引きゾーンがあれば(逆引きゾーンについては後述)、逆引きレコードも自動的に作成、登録される。
DNSサーバにIPv6の逆引きアドレスを登録する
逆引きアドレス・レコードとは、IPv4やIPv6アドレスから、そのホスト名(FQDN名)を求めるための定義である。トラブルシューティングのためにIPアドレスからホスト名を見つけるのに使ったりするほか、例えばメール・サーバやWebサーバがそのアクセス元のホスト名を調査するために使ったりする。
Windows Serverでは、DNSの逆引きレコードはデフォルトでは作成されないので、必要なら「逆引き参照ゾーン」をあらかじめ手動で作成しておかなければならない。Windows OSは起動時に自分自身のホスト名や逆引きアドレスを自動的にDNSサーバに登録する機能を持っているが、逆引きゾーンが作成されていないと、逆引きレコードは登録されない(できない)。
IPv6の逆引きはIPv4とは少し違うので注意が必要だ。実際にどのようなものかを次に示す。
※まず「xbox.com」の正引きアドレスを求める
C:\>nslookup xbox.com
サーバー: localhost
Address: ::1
権限のない回答:
名前: xbox.com
Addresses: 2a01:111:f009::3b03 …IPv6アドレス
65.55.42.140 …IPv4アドレス
この2つのIPアドレスの逆引きを求めてみよう。まずはIPv4の逆引きである。
※nslookupの「-type=ptr」オプションで逆引きアドレスを求める
C:\>nslookup -type=ptr 65.55.42.140 …このIPv4アドレスの逆引きを求める
サーバー: localhost
Address: ::1
権限のない回答:
140.42.55.65.in-addr.arpa …結果 name = xbox.com
IPv4アドレス「65.55.42.140」の逆引きを求めるには、(1byteごとに区切られている)4つの数字を逆順に並べ、最後に「.in-addr.arpa」を付ける。最後の行にある「140.42.55.65.in-addr.arpa」が、DNSサーバの逆引きゾーンに登録されている本当の名前(逆引きのFQDN名)である。
これに対してIPv6の場合は少し面倒である。まず元のIPv6アドレス「2a01:111:f009::3b03」を省略しない形式の16進数で表現し直し(「2a01:0111:f009:0000:0000:0000:0000:3b03」となる)、16進数の各桁をばらばらにして逆順に並べ、「ピリオド」で区切る。そして最後に「ip6.arpa」を付加する(IPv6の規格制定当初は「ip6.int」だったが、廃止された)。結果は次のようになる。
C:\>nslookup -type=ptr 2a01:111:f009::3b03 …このIPv6アドレスの逆引きを求める
サーバー: localhost
Address: ::1
権限のない回答:
3.0.b.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.9.0.0.f.1.1.1.0.1.0.a.2.ip6.arpa …結果 name = xbox.com
最後にある「3.0.b.3.0.0.〜〜〜.0.9.0.0.f.1.1.1.0.1.0.a.2.ip6.arpa」がDNSの逆引きゾーンに定義するべき名前の完全な表記ということになる。
とはいえ、このような長い名前をユーザーが手動で定義する必要性は少ないだろう。先ほど述べたように、Windows OSでは起動時に自動的にこの逆引きレコード(PTRレコード)を作成して、DNSサーバに登録してくれるからだ(手動で「ipconfig /registerdns」コマンドを実行すると強制的にすぐ登録できる)。管理者は、このレコードを登録するための逆引きゾーンをあらかじめ作っておけばよい。
●DNSの逆引きゾーンの作成
IPv6の逆引きを行うためには、まず逆引きゾーンを作成する必要がある。このためには、DNSサーバの管理ツールで左側のツリーから「逆引き参照ゾーン」を選択し、[操作]メニューの[新しいゾーン]を実行する。すると「新しいゾーン ウィザード」が起動するので、「ゾーンの種類」画面で「プライマリ・ゾーン」を選択し、ウィザードを先へ進める。
「逆引き参照ゾーン」の画面では「IPv6逆引き参照ゾーン」を選択する。
ウィザードの次の画面では、IPv6アドレスのプリフィックスを入力する。例えば「2001:db8:beef:cafe::/64」のように指定する。最後の「/64」はプリフィックス長である。通常は「/64」を使うことになるだろう。
逆引きゾーンの名前の指定
DNSの逆引きでは、元のIPv6アドレスを16進数で表現し、それぞれを1桁ずつに分解して逆順にした名前のゾーンを使用する。だがウィザードでは、IPv6のプリフィックス・アドレスとプリフィックス長を入力するだけでよい。
(1)IPv6のネットワーク・プリフィックスとプリフィックス長を入力する。プリフィックス長が4の倍数でない場合は、(16進数表現時の境界に揃えるために)複数のゾーンが作成される。プリフィックス長は16〜124を指定可能。
(2)実際に作成されるゾーン名。この例では「/64」なので1つのゾーンしか作られていないが、例えば「/65」なら8ゾーン作成され、ここに表示される。
ネットワーク・プリフィックスの指定欄の下に「逆引き参照ゾーン」という欄があるが、これが作成されるゾーン名を表している。もしプリフィックス長が4の倍数でない場合は複数のゾーンが作られ、ちょうど4の倍数になるように調整される。
後はウィザードを進めていけば、逆引きゾーンの作成は完了である。作成された逆引きゾーンを次に示しておく。
作成された逆引きゾーンの例
IPv6の逆引きゾーンを作成して、いくつかのホストが自動登録されたところ。IPv4の場合と違って、ゾーン名が長く、やや分かりづらい。
(1)作成した逆引きゾーン。
(2)自動登録されたホストや、手動で登録したホストなど。Windows OSは起動時に、自動的に自分のIPアドレスとホスト名を逆引きゾーンに登録する。
●逆引きゾーンに手動でホストを追加する
逆引きゾーンにホストを手動で(静的に)登録するには、右側のウィンドウで右クリックし、ポップアップ・メニューから[新しいポインター (PTR)]を選択する。そして次の画面のように、目的のIPv6アドレスを0を省略しない形式の16進数に分解して、下位から順に、「ピリオド」で区切りながら入力する。例えば目的のIPv6アドレスが「::dcba:0100:1:1234」なら(ここではネットワーク・プレフィックスである上位64bitは入力しない)、「::dcba:0100:0001:1234」→「4.3.2.1.1.0.0.0.0.0.1.0.a.b.c.d」と変換して入力する。正しい形式で入力しないと受け付けられない。よく分からない場合は、すでに登録されているレコードのプロパティを表示させて確認するとよい。
IPv6アドレスの逆引きレコードを手動入力する
IPv6アドレスの逆引きレコードを手動で定義するには、逆順に並べた16進数形式で入力しなければならず、かなり面倒である。
(1)目的のIPv6アドレスを非省略形式の16進数に変換し、それを分解して「ピリオド」で区切りながら逆順に並べて入力する。
(2)最終的なFQDN名。このフィールドは確認用であり、変更できない。
(3)ホスト名をドメインのサフィックス付きで入力すること。
今回はIPv6のDNSについて見てきた。IPv4のDNSと比較すると、レコードの種類やアドレスの指定方法などが少し異なるが(AレコードとAAAAレコード)、機能的にはほとんど同じだし、nslookupのようなコマンドもそのまま使える。Windows OSのDNSサーバを利用する場合は、IPv6の逆引きゾーンの設定が少し面倒だが、それ以外はIPv4の場合とほとんど同じなので、特に難しくはないだろう。
次回はIPv6のルーティングについて取り上げる。
Copyright© Digital Advantage Corp. All Rights Reserved.