💻

名前解決の順番を整理する

2024/12/26に公開

はじめに

あれなんでホスト名でping通るんだっけという時に毎回ググってしまうので、整理のため、書き残します。

Windowsの優先順位

後述のサイトの内容を総合するとこんな感じかと理解してます。

  1. hosts
  2. DNS
  3. LLMNR
  4. NBT(NetBios over TCP/IP)

https://support.microsoft.com/ja-jp/topic/microsoft-tcp-ip-のホスト名解決の順序-dae00cc9-7e9c-c0cc-8360-477b99cb978a
https://atmarkit.itmedia.co.jp/ait/articles/1305/23/news107.html

Linuxの優先順位

ディストリビューションやバージョンによって若干異なると思いますが、ざっくりデフォルトでは以下のようです。

  1. hosts
  2. DNS

なお、/etc/nsswitch.confで優先順位の変更は可能です。

Windowsの動きを試してみた(hosts vs DNS)

Linuxは割とシンプルだったので、Windowsの動きについて確認してみました。
以下のような構成とします。

win02のhostsはわざとwin01のIPアドレスを異なるもので指定してます。この状態でwin02からwin01に対しping打ってみます。

DNSよりもhostsの設定が優先されました。

Windowsの動きを試してみた(LLMNR vs NBT)

次は以下のような構成とします。

win02のhostsには何も定義せず、DNS設定もなくします。この状態でwin02からwin01に対しping打ってみます。

キャッシュしているNetBios名とIPアドレスがないことを確認し、pingを打つと、NetBiosのキャッシュに入ってました。期待値としてはこのキャッシュに入らず、LLMNRだけで解決することだったのですが。。
なお、Resolve-DnsNameで-LlmnrOnlyオプション指定してwin01は解決できるので、LLMNRが動作していない訳ではなさそうです。

Windowsの動きを試してみた(DNS vs NBT)

上でLLMNRの動作が何ともだったので、LLMNRを無効化して試しました。結果はDNSが優先されました。NetBiosのキャッシュも空のままでした。

おわりに

LLMNRとNBTあたりの優先順位はもしかすると違うところがあるのかもしれないのですが、Windowsは多層的に名前解決をする仕組みがあることを再認識しました。そもそもLLMNRの存在知らなかったし。。
あと、Resolve-DnsNameが便利そうということを知れたのも収穫でした。

おまけ

AWSとかAzureとかでNBTとLLMNRの動きを試していたのですが、どうしてもうまくいかず、なんでだろうと思ったら、VPCやVNETではブロードキャストパケットやマルチキャストパケットを通さないようにしているからでした。。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/subnet-sizing.html
https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-faq#what-protocols-can-i-use-in-virtual-networks

Discussion