Windows Server DNS 設定を動的に変更してみましょう

今回は PC 内部のネットワークに関連する話題を取り上げたいと思います。

例えば www.microsoft.com にアクセスを行いたい場合、ブラウザーDNS サーバーに IP アドレスを問い合わせ、その IP アドレスを接続先にしてデータを取りに行くという動きとなります。

このうち DNS については組織利用の場合自組織の DNS を通じて問い合わせチェーンを作り、上位の DNS サーバーに問い合わせを行って www.microsoft.com の IP を確定するのですが、時にこの IP を自社サーバーに変更してインターセプトしたいケースが発生することがあります。

しかし DNS サーバーは一つのゾーン(通常は microsoft.com のサブドメイン範囲)でひとくくりに管理するため、 www.microsoft.com の IP を制御したい場合は PC 側の hosts ファイルに情報を書き込んで逃げるくらいしか手がありません。

この方法をとるとすべての PC のファイルを変更する必要が出てくるためあまりお薦めできる手法ではありません。

そこで DNS サービスを活用し、ゾーンをホスト単位まで最小化して管理するという方法を見てみたいと思います。

理論は簡単で変更が必要なホスト(ここでは www.microsoft.com )をゾーンに見立て、そのルートドメインを管理してしまおうという考え方です。

Windows Server を利用していれば DNS サーバーは標準機能としてついてくるため個別に購入する必要がないことも大きな利点です。

まずはゾーンを作ることが大事なのでそこまでは DNS マネージャーから実施するとよいでしょう。ゾーンを作成するには Active Directory サーバーに入り DNS マネージャーを開きます。

そこで前方参照ゾーンを選択し、右クリックで表示される新しいゾーンをクリックします。

ウィザードで追加してくことができるのでどんどん進めていきましょう。

まずはゾーンを作るところから。

ゾーンはプライマリゾーンを選びましょう。これを選ぶことでそのサーバーで変更が可能なゾーンが生まれます。

Active Directory に格納するにチェックを入れておけば複数のサーバーで同じ設定を使えるようになります。逆に東京拠点と大阪拠点で同じ DNS 名でのアクセスに対して別のサーバーにつなげる場合などはスコープを絞るためにチェックを外しておくとよいでしょう。

レプリケーションスコープはフォレストまたはドメインすべての DNS サーバーを選んでおけば、指定した範囲でデータの自動同期が行われます。

続いてゾーン名の設定です。

この名前がホスト名となるように設定していくことがポイントとなります。

通常は microsoft.com のような、下にサーバーをぶら下げる前提の名前を選びますが、 www.microsoft.com といったホスト名を選ぶことで同列のほかのサーバーへ影響を及ぼさずにホストのみに影響を狭めることができるのです。

これでウィザードは完了となります。

この時点で DNS マネージャーを見てみると、 SOA レコードと NS レコードが用意されるだkとなっています。

この時点で nslookup コマンドを実行すると、このように応答を得ることができません。

nslookup www.microsoft.com

本来あるべき IP アドレスを見たい場合はパブリック DNS サーバーを選択して動かしてみるとよいでしょう。

nslookup www.microsoft.com 8.8.8.8

後は IP アドレスを返すための A レコードと AAAA レコードを作成すればよいのですが、簡単に行いたいなら以下の内容を PowerShell で用意するとよいでしょう。

最初の 3 行にある変数を変更することで対応するレコードが準備されます。

$zoneName ="www.microsoft.com"
$ipv4 = "11.11.11.10"
$ipv6 = "2620:1ec:c11::242"

$OldIPv4Obj = Get-DnsServerResourceRecord -Name "@" -ZoneName $zoneName -RRType "A"

if( $OldIPv4Obj -eq $null){
    Add-DnsServerResourceRecordA -Name "@" -ZoneName $zoneName -IPv4Address $ipv4
}else
{
    $NewIPv4Obj = [ciminstance]::new($OldIPv4Obj)
    $NewIPv4Obj.RecordData.IPv4Address = $ipv4
    Set-DnsServerResourceRecord -NewInputObject $NewIPv4Obj -OldInputObject $OldIPv4Obj -ZoneName $zoneName -PassThru
}

$OldIPv6Obj = Get-DnsServerResourceRecord -Name "@" -ZoneName $zoneName -RRType "AAAA"

if( $OldIPv6Obj -eq $null){
    Add-DnsServerResourceRecordAAAA -Name "@" -ZoneName $zoneName -IPv6Address $ipv6
}else{
    $NewIPv6Obj = [ciminstance]::new($OldIPv6Obj)
    $NewIPv6Obj.RecordData.IPv6Address = $ipv6
    Set-DnsServerResourceRecord -NewInputObject $NewIPv6Obj -OldInputObject $OldIPv6Obj -ZoneName $zoneName -PassThru
}

実行するとこのような形になります。
ipv4ipv6 変数で設定した IP のレコードが出来上がっていることが確認できますね。

この状態で nslookup を実行すると IP が返ってくることも確認ができました。

この手法を利用するケースはどこまであるかわかりませんが、テクニックとして覚えておくとよいでしょう。

音楽:Prism