ネットワーク技術

Windows PowerShellでResolve-DnsNameを使って名前解決する

アイキャッチ

PowerShellのコマンドレット [ Resolve-DnsName ] を使います。
Windows環境ではnslookupを使うこともできますが、 [ Resolve-DnsName ] のほうがデフォルトでうまいことやってくれます。
Resolve-DnsNameの使い方と出力例を紹介します。

Microsoft PowerShell DnsClientリファレンス

個人的におすすめな使い方

Resolve-DnsName -Name example.com -DnsOnly

名前解決を行う際に、hostsファイル等を参照しません。

シンプルな使い方

Resolve-DnsName -Name example.com

出力結果
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
example.com AAAA 77835 Answer 2606:2800:220:1:248:1893:25c8:1946
example.com A 81566 Answer 93.184.216.34

リゾルバを指定して名前解決をする

Resolve-DnsName -Name example.com -Server 1.1.1.1

TTLのキャッシュが聞いているリゾルバを回避する場合など、デフォルトのリゾルバでは都合が悪いときに使います。

DNSのみを使って名前解決を行う

Resolve-DnsNameコマンドレットを用いた場合、必ずしもリゾルバに問い合わせをするわけではありません。
hostsファイルを参照したうえで、名前解決を行うため、hostsファイルに記述があればそれを参照してしまいます。また検証できてはいませんが、下記のリファレンスを読むに、NetBIOSでの名前解決も発生する可能性があります。
(スイッチの選択肢より、LLMNRプロトコルなども含まれるかもしれません。)

Microsoft TCP/IPのホスト名解決の順序

そのため、サービスに使うコンテンツサーバの動作確認をするようなケースでは、 [ -DnsOnly ] スイッチを利用するべきでしょう。

hostsファイルに下記のような記載を行った場合に、コマンドを実行してみます。

127.0.0.1 example.com

Resolve-DnsName -name example.com

出力結果
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
example.com A 59933 Answer 127.0.0.1

Resolve-DnsName -name example.com -DnsOnly

出力結果
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
example.com AAAA 75752 Answer 2606:2800:220:1:248:1893:25c8:1946
example.com A 79643 Answer 93.184.216.34

出力結果より、-DnsOnlyを付与した場合とそうでないに差が生まれることがわかります。

DNSSECによる検証を行う

DnssecOkスイッチを使うことで検証を行うことができます。
[ digコマンド ] の [ +dnssec ] オプションのように、TCPフォールバックなどもサポートされているかは検証しきれていません。
デフォルトの挙動ではDNSSECの検証は行わないものと思われます。

Resolve-DnsName -Name example.com -DnssecOk

出力結果
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
example.com AAAA 86400 Answer 2606:2800:220:1:248:1893:25c8:1946
example.com A 86400 Answer 93.184.216.34

Name : example.com
QueryType : RRSIG
TTL : 86400
Section : Answer
TypeCovered : AAAA
Algorithm : 13
LabelCount : 2
OriginalTtl : 86400
Expiration : 2024/03/24 0:44:08
Signed : 2024/03/02 21:38:20
Signer : example.com
Signature : {48, 108, 176, 231…}

RRのタイプを指定して名前解決を行う

デフォルトではタイプAもしくはAAAAで照会を試みます。

Resolve-DnsName -Name example.com -Type A

Resolve-DnsName -Name example.com -Type 1

出力結果
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
example.com A 80825 Answer 93.184.216.34

取得するタイプとそれに対応するスイッチパラメータ値については、リファレンスを参照してください。

追記

-NoIdnスイッチ

なぜ日本語のドメインにアクセスできるのか疑問でしたが、このスイッチについて調べたところ解決しました。国際化ドメイン名(Internationalized Domain Name)を使うことによって実現していることがわかりました。
Resolve-DnsNameコマンドパレットでは、デフォルトでIDNの名前解決ができるようになっています。

Resolve-DnsName -name 総務省.jp

出力結果
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
xn--lhr645fjve.jp AAAA 3600 Answer 2001:218:3001:7::10
xn--lhr645fjve.jp A 3600 Answer 117.104.133.171

名前解決された結果は、Punycode表記ドメインで総務省を表すため正常です。

Resolve-DnsName -name 総務省.jp -NoIdn

上記のコマンドを実行すると、IDNを使用しないため、エラーが発生します。

なお、私が使っているWindows環境のnslookupでは総務省.jpの名前解決はできませんでした。
コマンドによって何がデフォルトで実行できるのかは、事前に確認しておかないといけませんね。