🐷

Windows Client OS で条件付きフォワーダー的なことをやってみる

2024/06/13に公開

TL;DR

  • Windows Client OS でも条件付きフォワーダー的なやつをやり隊
  • Azure DNS Private Resolver を使った Azure Private Endpoint の定番構成を例に Add-DnsClientNrptRule を使ってみる
  • いい感じに動いてそう、hosts の代わりとして使えそう

Update log

  • 図の中の IP アドレスが間違っていたので修正 - 2024/06/14

はじめに

Azure Private Endpoint を使う際には、DNS に関連した設定が必要です。
本番環境への反映を考えると、例えば Active Directory (AD) 環境であれば Conditional forwader (条件付きフォワーダー) を使うことになります。
また、一旦 PoC で、自分のマシンだけ、ということであれば hosts ファイルに書く、という形になります。

なのですが、ひょんなところから Add-DnsClientNrptRule というコマンドを知り、これを使うと Windows client OS でも Conditional forwarder ができそうだ、いや、できたわ、という話です。

Conditional forwarder とはなにか

Azure Private Endpoint を利用している Storage Account、その中でも blob サービスを例にとると、blob.core.windows.net を含む FQDN の名前解決に変化が起こります。
よくある Private DNS Zone を利用している構成だと、blob.core.windows.net に関する DNS のクエリを 168.63.129.16 に向ける必要が出てきます。
方法は様々あるのでここでは割愛してしまいますが、組み合わせることが多い技術の 1 つが Conditional forwarder です。

Conditional forwarder は、特定の FQDN に対して、特定の DNS サーバーに問い合わせるように設定するものです。
上の例では、blob.core.windows.net を 168.63.129.16 に問い合わせるようにする、もしくは Conditional forwarder を設定する AD サーバが Azure 内部になければ Azure DNS Private Resolver の inbound endpoint の IP アドレスに問合せるようにする、などです。

DNS の機能を持った AD サーバに DNS のクエリが来ると、自身がゾーンを持っていればそれを参照して回答し、なければフォワーダーとして設定されているさらに上位の DNS サーバーに問い合わせます。
しかし、ここで Conditional forwarder が設定されている場合、その FQDN に対してはフォワーダーとして設定されている DNS サーバーとは別のサーバーに問い合わせる、ということです。

サンプル構成

ということで早速サンプル構成を見ていきます。

左側の Hub VNet には以下のようなリソースがあります。

  • Azure VM (動作確認用)
  • VNet Peering (Hub VNet と Spoke VNet を VNet Peering で接続済み)
  • Storage Account & Azure Private Endpoint (Storage Account を作成し、blob サービスに対して Azure Private Endpoint を 10.0.0.0/24 の subnet に対して作成済み)
  • Private DNS Zone (Storage Account の Azure Private Endpoint と連携しているリソース、Hub VNet に対して VNet link されている)
  • Azure Private DNS Resolver & inbound endpoint (Azure DNS Private Resovler を作成し、10.0.10.0/24 に inbound endpoint を作成済み)

Hub VNet だけで見れば、Private DNS Zone が link されているので、Azure DNS Private Resolver (ADPR) がなくても、168.63.129.16 に DNS 問合せすれば Azure Private Endpoint の IP アドレスである 10.0.0.6 が返ってきます。

右側の Spoke VNet には以下のようなリソースがあります。

  • Azure VM (動作確認用)
  • VNet Peering (Hub VNet と Spoke VNet を VNet Peering で接続済み)

で、Spoke VNet には Private DNS Zone の VNet link を 設定していない ため、Spoke VNet の Azure VM から 168.63.129.16 に DNS 問合せしても Public 側の IP アドレスしか返ってきません。
んで、hosts ファイルに書いてもいいんですが、ここでは Add-DnsClientNrptRule を使って Conditional forwarder 同等のものを設定してみる、という感じです。

Add-DnsClientNrptRule を使ってみる

ということで、こちら、放り込んでいきます。
-NameServers には、Azure DNS Private Resolver の inbound endpoint の IP アドレスを指定します。

Add-DnsClientNrptRule -Namespace ".blob.core.windows.net" -NameServers 10.0.1.4

注意点としては、管理者権限で実行した PowerShell での実行が必要なことと、-Namespace として与えているパラメーターは "." をちゃんと入れておく必要があります。
"." がないと、blob.core.windows.net に対する完全一致をとってしまうので、例えば xxxxxxxx.blob.core.windows.net に対してはマッチしません。

ということで、まずは事前ですが、普通に Public 側の IP アドレスが返ってきます。
以下の PowerShell は Spoke VNet の Azure VM で実行しています。

> Test-NetConnection dd1u2cekqdgmqbqiuub3.blob.core.windows.net -port 443

ComputerName     : dd1u2cekqdgmqbqiuub3.blob.core.windows.net
RemoteAddress    : 52.239.145.196
RemotePort       : 443

次に、Add-DnsClientNrptRule での設定後、再度問い合わせてみます。
ちゃんと private 側の IP アドレスが返ってきています。

> Test-NetConnection dd1u2cekqdgmqbqiuub3.blob.core.windows.net -port 443

ComputerName     : dd1u2cekqdgmqbqiuub3.blob.core.windows.net
RemoteAddress    : 10.0.0.6
RemotePort       : 443

まとめ

ということで、Add-DnsClientNrptRule を使って、Windows Client OS でも Conditional forwarder 的なことができる、という話でした。
Azure Private Endpoint を使う際には、hosts を使うのが定番なのですが、ホスト名が多いケースなどでは便利じゃあないのでしょうか。

参考

  • Deep Dive on Microsoft Entra Private Access

https://www.youtube.com/watch?v=RsxxsEzQhrM

  • Active Directory Access with Microsoft Entra Private Access

https://www.youtube.com/watch?v=qdNzvy5U3Sw

  • The NRPT

https://learn.microsoft.com/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn593632(v=ws.11)

  • Add-DnsClientNrptRule

https://learn.microsoft.com/powershell/module/dnsclient/add-dnsclientnrptrule?view=windowsserver2022-ps

Discussion