Windows DNSサーバで特定ホストをローカル解決する設定方法|フォワーダーとの併用を徹底解説

DNSサーバの運用では、社内でだけ異なるホスト名解決を行いたい場合があります。しかし、すべてをローカルゾーンで管理すると大掛かりになり、外部フォワーダーでの問い合わせが使えなくなります。本記事では、Windows DNSサーバで特定ホストだけをローカル解決し、それ以外のドメインは外部にフォワーディングする方法を詳しく紹介します。

Windows DNSサーバで特定ホストだけをローカル解決する背景と目的

企業や組織のIT環境では、外部のDNSサーバで管理されているドメイン(たとえば「abc.com」)を主に利用しながら、一部のホスト名だけは社内独自のアドレスに振りたいというニーズがよくあります。たとえば、「host1.abc.com」だけを社内ネットワークで動かすサーバに指し示し、それ以外のホストは外部が管理するDNSサーバに委任したい場合です。
しかし、Windows DNSサーバ上で「abc.com」というフォワード ルックアップ ゾーンを作成すると、基本的には「abc.com」ドメイン配下の問い合わせはすべてローカルで解決しようとします。つまり、外部DNSへフォワーディングする機能が働かなくなってしまうのです。これは標準的な挙動ですが、今回のように「host1.abc.com」だけをローカル、その他の「*.abc.com」は外部へフォワーディングといった柔軟な構成を求めるケースでは、ひと工夫が必要になります。

DNSポリシーを活用した解決策

Windows Server 2016以降では、DNSポリシーと呼ばれる強力な機能が追加されています。DNSポリシーを使用すると、問い合わせの内容や問い合わせ元のクライアントIPなどに応じて、応答を動的に切り替えることができます。今回のケースでは、「host1.abc.com」へのクエリだけローカルゾーンを参照し、それ以外の「*.abc.com」は外部フォワーダーへ問い合わせるようにする構成が可能です。

DNSポリシー活用のメリット

  • 特定のホストに対するクエリを、通常のゾーン設定とは独立して柔軟に制御できる
  • Windows DNSサーバの標準機能だけで実現でき、特別なアドオンは不要
  • ホスト単位でローカルDNSと外部DNSを切り替えるため、運用負荷を最小限に抑えられる

旧来の方法との比較

DNSポリシーが導入される前のWindows Server(2012以前)では、ドメインごとにフォワードをするスタブ ゾーンを作成するといった回避策が考えられていました。しかし、この方法ではホスト単位での制御が難しく、組織のDNS要件を満たすのが困難でした。DNSポリシーによって、こうした細やかな制御が容易になったのです。

具体的な手順と設定例

以下では、Windows Server 2016以降を前提とし、PowerShellを利用して設定する例をご紹介します。GUIでの設定も可能ですが、PowerShellのコマンドを使うと再現性が高く、スクリプト化による自動化もしやすくなります。

ステップ1:特定ホスト用のゾーン「host1.abc.com」を作成

最初に、「host1.abc.com」というフォワード ルックアップ ゾーンを独立して作成します。このゾーン内にAレコードを定義して、社内で使いたいIPアドレスを割り当てましょう。

# 1. host1.abc.com用のプライマリゾーンを追加
Add-DnsServerPrimaryZone -Name "host1.abc.com" -ZoneFile "host1.abc.com.dns"

# 2. Aレコードを追加
Add-DnsServerResourceRecordA -Name "host1" -ZoneName "host1.abc.com" -IPv4Address "192.168.1.100"
  • Add-DnsServerPrimaryZone:DNSサーバに新しくプライマリゾーンを登録します。
  • Add-DnsServerResourceRecordA:指定したゾーンにAレコードを追加します。ここでは例として「192.168.1.100」を割り当てています。

このステップによって、host1.abc.comというFQDNを引いたときに、Windows DNSサーバはローカルIPの192.168.1.100を返すことができるようになります。

ステップ2:「abc.com」ゾーンを作成または確認

すでに「abc.com」のフォワード ルックアップ ゾーンを作成している場合は、このステップは不要です。もしまだであれば、以下のコマンドで作成しておきます。

Add-DnsServerPrimaryZone -Name "abc.com" -ZoneFile "abc.com.dns"

ここで作成する「abc.com」ゾーンには、全体ドメイン用の設定を行うイメージです。後述するDNSポリシーで、「host1.abc.com」に対する問い合わせだけは先ほど作成したゾーンを参照し、それ以外は外部フォワーダーに投げるようにします。

ステップ3:ゾーンスコープの作成

DNSポリシーを使う際には、ゾーンスコープを設定します。ゾーンスコープとは、同じゾーン名を持ちながらも応答内容を変化させるための論理的なコンテナのようなものです。今回は「abc.com」ゾーンにフォワーダー用のスコープを作り、同様に「host1.abc.com」ゾーンにはローカル用のスコープを作成します。

# 1. abc.comゾーンにフォワーダ用スコープを作成(例:ForwarderZone)
Add-DnsServerZoneScope -ZoneName "abc.com" -Name "ForwarderZone"

# 2. host1.abc.comゾーンにローカル用スコープを作成(例:LocalScope)
Add-DnsServerZoneScope -ZoneName "host1.abc.com" -Name "LocalScope"

これらのゾーンスコープを設定しておくことで、後ほど追加するDNSポリシーが「このドメインへ来たクエリはどのスコープを使って応答するか」を判別できるようになります。

ステップ4:DNSポリシーの設定

いよいよDNSポリシーを追加し、問い合わせ先を振り分けるルールを作ります。クエリ名(FQDN)の内容を条件として、特定のゾーンスコープを使用するかどうかを決定することができます。

Add-DnsServerQueryResolutionPolicy -Name "ForwardAllExceptHost1" -Action ALLOW `
    -ServerInterfaceIP "eq,any" -Fqdn "ne,host1.abc.com" `
    -ZoneScope "ForwarderZone,1" -ZoneName "abc.com"

上記の例では、FQDNが「host1.abc.com」に「ne」(not equal:一致しない)場合に「ForwarderZone」スコープを適用すると指定しています。「host1.abc.com」に一致するクエリは除外されるため、それ以外のクエリはフォワーダーに送られるようになります。なお、「host1.abc.com」に一致するクエリについては、先ほど作成した「host1.abc.com」ゾーンのAレコードが返る仕組みです。

レコードの競合を避ける

もし「abc.com」ゾーン内にも「host1.abc.com」のAレコードが存在していると、競合が発生してしまう可能性があります。DNSポリシーによる制御を行う場合は、不要なレコードや重複定義がないか再度チェックしましょう。

フォワーダーの設定確認

DNSサーバ マネージャの「DNS」→「サーバー名のプロパティ」→「フォワーダー」タブから、外部DNSサーバ(例:8.8.8.8など)の指定をきちんと行っておく必要があります。ここでフォワーダーが設定されていなければ、ポリシーの指示どおりに外部へ問い合わせることができません。

運用時の注意点とトラブルシューティング

Windows Serverのバージョンを確認

DNSポリシー機能はWindows Server 2016以降でサポートされているため、2012 R2以前の環境では同様の設定ができません。古い環境を利用している場合は、ゾーン転送やサブドメインの切り出しなど、別の方法を検討する必要があります。

キャッシュとTTLの影響

DNSではキャッシュとTTL(Time To Live)が大きな影響を与えます。一度クライアントが外部DNSの情報をキャッシュしていると、ポリシーを設定しても変更が即時に反映されないことがあります。テスト時はクライアント側でDNSキャッシュをクリアしてから動作確認するとよいでしょう。

クライアント側でのキャッシュクリア例(Windows)

ipconfig /flushdns

nslookupやResolve-DnsNameによる確認

設定後は正しく動作しているかを必ず確認します。以下のようなコマンドを用いて、host1.abc.comが指定IPを返すか、他のホスト名はフォワーダーを通じて外部IPを返すかをチェックしましょう。

# nslookupを使用する場合
nslookup host1.abc.com <DNSサーバのIP>

# PowerShellのResolve-DnsNameを使用する場合
Resolve-DnsName -Name host1.abc.com -Server <DNSサーバのIP>

もし想定外の結果が返ってきた場合は、次の点を見直してみてください。

  • 「abc.com」のゾーンに余計なAレコードが入っていないか
  • DNSポリシーの条件設定(Fqdnパラメーター)が正しく記述されているか
  • フォワーダー先のDNSサーバに問題がないか

応用編:複数ホストをローカル解決したい場合

今回の例では「host1.abc.com」だけをローカル解決しましたが、複数のホストを同様に振り分けたいケースもあるでしょう。DNSポリシーでは、Fqdnパラメーターの条件式を複数設定することで、より複雑な制御も可能です。
たとえば、「host1.abc.com」および「host2.abc.com」を同一のローカルゾーンで運用したい場合、次のような構成にすることも考えられます。

  • 「localhosts.abc.com」という新しいゾーンを作り、その配下に「host1」と「host2」のAレコードを登録する
  • DNSポリシーでは「Fqdn eq *.localhosts.abc.com」のときにローカルゾーンを参照させるよう設定する

このように、一括管理すればゾーンの分割を最小限に抑えつつ、複数ホストをまとめて制御することができます。

表で見るDNSポリシー関連コマンド一覧

以下はDNSポリシーを活用する際によく使用するコマンドをまとめた表です。

コマンド目的使用例
Add-DnsServerPrimaryZoneプライマリゾーンの作成Add-DnsServerPrimaryZone -Name "abc.com" -ZoneFile "abc.com.dns"
Add-DnsServerResourceRecordAAレコードの作成Add-DnsServerResourceRecordA -Name "host1" -ZoneName "abc.com" -IPv4Address "192.168.1.100"
Add-DnsServerZoneScopeゾーンスコープの作成Add-DnsServerZoneScope -ZoneName "abc.com" -Name "ForwarderZone"
Add-DnsServerQueryResolutionPolicyクエリの振り分けポリシーを追加Add-DnsServerQueryResolutionPolicy -Name "Policy1" -Action ALLOW -Fqdn "eq,host1.abc.com" …
Set-DnsServerForwarderフォワーダーの設定Set-DnsServerForwarder -IPAddress 8.8.8.8

設定完了後のイメージ

最終的に、Windows DNSサーバ上の設定フローとしては以下のようになります。

  1. 「host1.abc.com」用に専用のフォワード ルックアップ ゾーンを作成し、Aレコードを社内IPに設定
  2. 「abc.com」ゾーンを作成し、外部フォワーダーへ問い合わせるようデフォルトの振る舞いを設定
  3. DNSポリシーを利用して、「host1.abc.com」以外はフォワーダーに問い合わせるよう振り分けルールを追加

この構成により、host1.abc.comを引いた場合は社内のIPが返り、www.abc.comなど他のホスト名を引いた場合は外部DNSへ問い合わせが行われます。

よくある質問(FAQ)

Q1:フォワーダーを複数指定したい場合はどうすればよいですか?

Set-DnsServerForwarderコマンドで複数のDNSサーバアドレスを指定すればOKです。たとえば、8.8.8.8(Google Public DNS)と1.1.1.1(Cloudflare DNS)を併用する場合、カンマ区切りやスペース区切りで入力できます。GUIから設定してもかまいません。

Q2:社内の別拠点が異なるDNSサーバを使っている場合はどう連携できますか?

DNSポリシーを使った構成を各拠点のWindows DNSサーバにも展開することで、同様の振り分けが行えます。ただし、拠点間でVPN接続や名前解決プロトコルの設定をどのようにしているかによって、適用方法が変わる可能性があります。必要に応じてスタブ ゾーンや条件付きフォワーダーとの組み合わせも検討しましょう。

Q3:旧バージョンのWindows Serverでは本当に実現できないのですか?

厳密にいうと、条件付きフォワーダーdns.exe /config /forwarddelegationなどのコマンドである程度の制御は可能ですが、ホスト単位での振り分けは難易度が高いです。サブドメインを切り出す、複数のDNSサーバを使い分けるなど、運用コストをかければ類似の構成は作れますが、DNSポリシーほど簡単にはいかないでしょう。

まとめ

Windows DNSサーバで「host1.abc.com」だけをローカルIPに紐づけ、それ以外の「*.abc.com」は外部フォワーダーに渡すには、DNSポリシー機能を活用するのが最もスマートな方法です。以下のポイントを押さえるとスムーズに導入できます。

  • Windows Server 2016以降でDNSポリシーが利用可能
  • 特定ホスト用のゾーンを個別に作成して社内IPを登録
  • メインのゾーン(abc.com)は外部フォワーダーを使う設定を基本にしておく
  • DNSポリシーで「host1.abc.com」へのクエリだけをローカルゾーンへ振り分ける

これで、必要最小限のゾーン管理で済み、柔軟性の高いDNS運用を実現できるはずです。運用開始前には、テスト環境でしっかり動作確認とキャッシュの影響を検証し、クライアント側で実際に名前解決が期待通りに動くかを確かめることをお勧めします。

コメント

コメントする