April 20, 2025

サーバーを構築せずにmDNSでLAN内のホスト名を解決する

自宅LANとか小規模なネットワークで複数台のPCのホスト名を解決したいけど、DNSサーバーを建てるのは面倒だな、って時はmDNS(マルチキャストDNS)を使うのが楽。

mDNS(Multicast DNS) aka Bonjour / Avahi

mDNSは、

  • マルチキャストを使って基本的にはサブネット内のホスト名を解決する(ルーターを越えられない)
    • その代わり、DNSみたいにサーバー構築不要
  • ドメイン名は「.local」固定

試した環境

  • Windows
    • Windows 11 Home 24H2
  • macOS
    • macOS Sequoia 15.4
  • Linux
    • Debian 12.10

Windows 11 24H2

インストール

標準提供されるので不要。

起動

自動起動して停止できない「DNS Client」サービスによってmDNSも提供される。

サービスはRunningのはず。

PS C:\Users\nissy> Get-Service dnscache

Status   Name               DisplayName
------   ----               -----------
Running  dnscache           DNS Client

mDNSのポート、UDP:5353もリッスンしているはず。

PS C:\Users\nissy> netstat -ano | findstr :5353
  UDP         0.0.0.0:5353           *:*                                    3216
  UDP         [::]:5353              *:*                                    3216

上記で確認したPID(3216)を tasklist コマンドで確認。

PS C:\Users\nissy> tasklist /FI "PID eq 3216"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
svchost.exe                   3216 Services                   0      5,712 K

UDP:5353はGoogle Chrome が起動している場合でもリッスンしている。

PS C:\Users\nissy> netstat -ano | findstr :5353
  UDP         0.0.0.0:5353           *:*                                    32552
  UDP         0.0.0.0:5353           *:*                                    3216
  UDP         0.0.0.0:5353           *:*                                    32552
  UDP         0.0.0.0:5353           *:*                                    32552
  UDP         0.0.0.0:5353           *:*                                    32552
  UDP         [::]:5353              *:*                                    32552
  UDP         [::]:5353              *:*                                    3216
  UDP         [::]:5353              *:*                                    32552
PS C:\Users\nissy> tasklist /FI "PID eq 32552"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
chrome.exe                   32552 Console                    1    282,180 K

確認

mDNS 用の確認コマンドは用意されていなみたいなので ping -4 とか ping -6 を打つくらいだと思う。

> ping -4 win11pc.local

win11pc [192.168.100.113]に ping を送信しています 32 バイトのデータ:
192.168.100.113 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.100.1113 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.100.1113 からの応答: バイト数 =32 時間 <1ms TTL=128
192.168.100.1113 からの応答: バイト数 =32 時間 <1ms TTL=128

192.168.100.1113 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms

macOS Sequoia 15.4

インストール

標準提供されるので不要。

起動

mDNSResponder が自動起動しているはす。

% pgrep -afl 'mDNSResponder$'
617 /usr/sbin/mDNSResponder

通常のリッスンポート確認方法の lsof -nP -iUDP:5353 では出てこないので nettop -p mDNSResponder で確認する。

% nettop -p mDNSResponder

実行すると以下のようにUDP:5353の通信状況が表示される。

                                                      interface
mDNSResponder.617
   udp6 *.5353<->*.*                                  en0
   udp4 *:5353<->*:*                                  en0

抜けるには q キー

確認

dns-sd コマンドで確認できる。

% dns-sd -G v4 mac15.local
DATE: ---Sun 20 Apr 2025---
19:44:16.115  ...STARTING...
Timestamp     A/R  Flags         IF  Hostname          Address              TTL
19:44:16.116  Add  40000003      21  mac15.local.      0.0.0.0              1   No Such Record
19:44:16.116  Add  40000003       1  mac15.local.      127.0.0.1            4500
19:44:16.116  Add  40000003      20  mac15.local.      169.254.55.226       4500
19:44:16.116  Add  40000002      11  mac15.local.      192.168.100.124      4500

IPv6も確認したければ dns-sd -G v4v6 ホスト名.local
抜けるには ctrl + c

Debian 12.10

インストール

入っていなければインストール

$ sudo apt install avahi-daemon avahi-utils

起動

Debian 12 なら自動起動が enabled で、かつ起動もしているはず。
こんな感じ。

$ systemctl status avahi-daemon.socket
● avahi-daemon.socket - Avahi mDNS/DNS-SD Stack Activation Socket
     Loaded: loaded (/lib/systemd/system/avahi-daemon.socket; enabled; preset: enabled)
     Active: active (running) since Sat 2025-04-19 10:11:22 JST; 45min ago
   Triggers: ● avahi-daemon.service
     Listen: /run/avahi-daemon/socket (Stream)
     CGroup: /system.slice/avahi-daemon.socket

avahi-daemon.service は avahi-daemon.socket が必要に応じて起動してくれるので、avahi-daemon.socket が active (running)ならヨシ

確認

正引き

$ avahi-resolve-host-name -n deb12pc.local
deb12pc.local	192.168.100.41

逆引きもできる

$ avahi-resolve-address 192.168.100.41
192.168.100.41	deb12pc.local

おまけ

ついでに調べたこと

  • 「aka」「a.k.a.」
    • 「also known as(オールソー・ノウン・アズ)」の略
    • 意味は「別名〜」「通称〜」「〜としても知られてる」
  • Avahiの読み方
    • Wikipediaでは「アバヒ」

      Avahi とは、キツネザル下目・インドリ科のウーリーキツネザル(アバヒ属)のことであり、マダガスカルだけに棲む霊長類である。Wikipedia

© 2020 nissy-lab.com