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プロトコルなども含まれるかもしれません。)
そのため、サービスに使うコンテンツサーバの動作確認をするようなケースでは、 [ -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の名前解決はできませんでした。
コマンドによって何がデフォルトで実行できるのかは、事前に確認しておかないといけませんね。