【mDNS / Avahi 完全攻略】第4回:もう迷わない! mDNS / Avahi ホスト名解決のトラブルシューティングとデバッグ術

はじめに

「あれ?昨日まで動いていたのに、急にホスト名でアクセスできなくなった…」

macOSとUbuntu (Multipass) 環境でmDNS/Avahiを活用していると、誰もが一度は経験するであろうこの問題。ローカルネットワークでのホスト名解決は、開発ワークフローを劇的に効率化する一方で、予期せぬトラブルに遭遇することも少なくありません。

本記事では、mDNS/Avahiを使ったホスト名解決でよくある問題とその原因を深掘りし、具体的なデバッグツールと手順を用いて、あなた自身で問題を解決できる「トラブルシューティングのプロ」になるための実践的な知識を提供します。

ローカル開発環境の効率化を目指すソフトウェアエンジニアやシステム管理者の方々にとって、この記事が「もう迷わない」ための決定版となることを目指します。


対象読者

  • mDNS/Avahiのトラブルシューティングに困っている開発者: ホスト名解決やサービスディスカバリがうまくいかず、原因究明と解決策を探している方。
  • MultipassやLinux環境のネットワーク設定に課題を感じている方: VMやコンテナ環境でのmDNS/Avahiのデバッグ方法を知りたい方。
  • ネットワークのデバッグツールに関心がある方: dns-sdavahi-browsegetent hostsなどのコマンドラインツールを使ったデバッグ手法を学びたい方。
  • 開発環境の安定稼働を目指す方: mDNS/Avahiを導入した環境で、予期せぬ問題が発生した際の対処法を身につけたい方。

動作検証環境

この記事で紹介するcurlコマンドの動作は、以下の環境で検証しています。

  • OS : macOS Tahoe Version 26.0
  • ハードウェア : MacBook Air 2024 M3 24GB
  • Multipass : Multipass version 1.16.1

目次


よくあるトラブルとその原因

mDNS/Avahiのホスト名解決がうまくいかない場合、いくつかの典型的な原因が考えられます。


.local ドメインで解決できない

最も一般的な問題の一つが、hostname.local の形式でホスト名が解決できないケースです。

  • 原因1: Avahi/Bonjourサービスが停止している、または起動していない
    • mDNSによるホスト名解決は、macOSのBonjour(mDNSResponder)やLinuxのAvahiデーモンといったサービスがバックグラウンドで動作していることで実現されます。これらのサービスが停止していると、当然ながらホスト名解決は行われません。
  • 原因2: ファイアウォールによるブロック
    • mDNSはUDPポート5353を使用します。OSやネットワーク機器のファイアウォール設定によってこのポートがブロックされていると、mDNSパケットが通信できず、ホスト名解決に失敗します。
  • 原因3: ホスト名が正しく設定されていない、または重複している
    • mDNSは、各デバイスが自身のホスト名をネットワークにブロードキャストすることで機能します。ホスト名が正しく設定されていない、あるいはネットワーク上に同じ.localホスト名を持つデバイスが複数存在する場合、解決に問題が生じることがあります。
  • 原因4: nsswitch.conf の設定不備 (Linux)
    • Linuxシステムでは、ホスト名解決の順序を /etc/nsswitch.conf ファイルで定義します。ここに mdns_minimal [NOTFOUND=return]mdns4_minimal [NOTFOUND=return] が含まれていないと、mDNSによる解決が試みられません。

サービスが見つからない

ssh user@hostname.local のように、ホスト名解決はできるものの、特定のサービス(SSHなど)に接続できない場合があります。

  • 原因: サービスが起動していない、またはmDNSで公開されていない
    • mDNSはホスト名解決だけでなく、サービスディスカバリ(ネットワーク上のサービスを発見する機能)も提供します。サービス自体が起動していないか、AvahiなどのmDNSデーモンがそのサービスをネットワークに公開するように設定されていない可能性があります。

ネットワーク接続の問題

根本的なネットワーク接続に問題がある場合、mDNS以前に通信自体ができません。

  • 原因: IPアドレスの競合、ケーブルの断線、Wi-Fi接続不良など
    • 物理的な接続やIPアドレスの設定に問題がないか、基本的なネットワークトラブルシューティング(ping IPアドレスなど)から確認する必要があります。Multipass環境では、VMのネットワークモード(NAT vs ブリッジ)も影響します。

トラブルシューティングの基本フロー

問題が発生した場合、以下のステップで順を追って確認することで、原因を特定しやすくなります。


Avahiサービスの稼働状況確認 (systemctl status avahi-daemon)

Linux (Ubuntu) 環境では、まずAvahiデーモンが正しく動作しているかを確認します。

systemctl status avahi-daemon
  • active (running) と表示されていれば正常に動作しています。

出力例:

 avahi-daemon.service - Avahi mDNS/DNS-SD Daemon
     Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-26 10:00:00 UTC; 1 day 5h ago
TriggeredBy:  avahi-daemon.socket
       Docs: man:avahi-daemon(8)
   Main PID: 1234 (avahi-daemon)
     Status: "avahi-daemon 0.8 starting up."
      Tasks: 2 (limit: 4634)
     Memory: 1.5M
        CPU: 50ms
     CGroup: /system.slice/avahi-daemon.service
             ├─1234 "avahi-daemon: running [ubuntu-vm.local]"
             └─1235 "avahi-daemon: chroot helper"

Oct 26 10:00:00 ubuntu-vm systemd[1]: Starting Avahi mDNS/DNS-SD Daemon...
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Found user 'avahi' (UID 108) and group 'avahi' (GID 115).
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Successfully dropped root privileges.
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: avahi-daemon 0.8 starting up.
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Successfully established service.
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Network interface enumeration completed.
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Registering host name 'ubuntu-vm.local'.
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Server startup complete. Host name is ubuntu-vm.local.
Oct 26 10:00:00 ubuntu-vm avahi-daemon[1234]: Service "ubuntu-vm" (SSH Remote Terminal) established.
  • inactive (dead)failed と表示されている場合は、サービスが停止しているか、起動に失敗しています。sudo systemctl start avahi-daemon で起動を試み、エラーログを確認してください。
systemctl status avahi-daemon

出力例:

 avahi-daemon.service - Avahi mDNS/DNS-SD Daemon
     Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Mon 2023-10-26 10:00:00 UTC; 1 day 5h ago
TriggeredBy:  avahi-daemon.socket
       Docs: man:avahi-daemon(8)
   Main PID: 1234 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 4634)
     Memory: 0B
        CPU: 0
     CGroup: /system.slice/avahi-daemon.service

Oct 26 10:00:00 ubuntu-vm systemd[1]: Starting Avahi mDNS/DNS-SD Daemon...
Oct 26 10:00:00 ubuntu-vm systemd[1]: Started Avahi mDNS/DNS-SD Daemon.

ホスト名の確認と設定 (hostnamectl)

デバイスのホスト名が正しく設定されているかを確認します。

hostnamectl
  • Static hostname が期待するホスト名になっているか確認します。

出力例:

   Static hostname: ubuntu-avahi
       Icon name: computer-vm
         Chassis: vm 🖴
      Machine ID: 574a27366fd34bdca513d4c15b24504d
         Boot ID: bc7a0bb079a54c098e60ef89d3f2d9cd
  Virtualization: qemu
Operating System: Ubuntu 24.04.3 LTS              
          Kernel: Linux 6.8.0-85-generic
    Architecture: arm64
 Hardware Vendor: QEMU
  Hardware Model: QEMU Virtual Machine
Firmware Version: edk2-stable202302-for-qemu
   Firmware Date: Wed 2023-03-01
    Firmware Age: 2y 7month 5d
  • 必要であれば、sudo hostnamectl set-hostname <新しいホスト名> で変更できます。変更後はAvahiデーモンの再起動が必要です。

nsswitch.conf の確認

LinuxシステムでmDNSによるホスト名解決を有効にするには、/etc/nsswitch.conf に適切なエントリが必要です。

cat /etc/nsswitch.conf | grep hosts

通常、hosts: の行に mdns_minimal [NOTFOUND=return] または mdns4_minimal [NOTFOUND=return] が含まれている必要があります。

hosts:          files mdns4_minimal [NOTFOUND=return] dns
  • もし含まれていない場合は、libnss-mdns パッケージがインストールされているか確認し、インストールされていない場合は sudo apt install libnss-mdns でインストールしてください。通常、このパッケージのインストール時に自動的に設定が追加されます。

デバッグツールの活用

より詳細な情報を得るために、mDNS/Avahi専用のデバッグツールを活用しましょう。


dns-sd (macOS) でサービスを探索する

macOSでは、dns-sd コマンドを使ってネットワーク上のmDNSサービスを探索できます。

dns-sd -B _ssh._tcp local. # SSHサービスを探索

出力例(SSHサービスが発見された場合):

Browsing for _ssh._tcp.local.
DATE: ---Mon 29 Sep 2025---
19:33:45.784  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
19:33:45.786  Add        2  28 local.               _ssh._tcp.           my-ubuntu-vm

この出力は、MyUbuntuVMMyMacBookPro というホストがSSHサービスを公開していることを示しています。Add の行が表示されれば、サービスがネットワーク上で発見されていることを意味します。

特定のVMのSSHサービスを探索する場合は、以下のコマンドを実行します。

dns-sd -L MyUbuntuVM _ssh._tcp local. # 特定のVMのSSHサービスを探索

出力例(特定のVMのSSHサービスが解決された場合):

Lookup my-ubuntu-vm._ssh._tcp.local.
DATE: ---Mon 29 Sep 2025---
19:33:38.810  ...STARTING...
19:33:38.811  my-ubuntu-vm._ssh._tcp.local. can be reached at my-ubuntu-vm.local.:22 (interface 28)

この出力は、MyUbuntuVM のSSHサービスが MyUbuntuVM.local のポート22で利用可能であり、そのIPv4およびIPv6アドレスも示しています。can be reached at の行が表示されれば、サービスの詳細が正しく解決されていることを意味します。


avahi-browse (Ubuntu) でサービスを探索する

Ubuntuでは、avahi-browse コマンドが dns-sd と同様の機能を提供します。

ネットワーク上の全てのサービスとホスト名を解決するには、以下のコマンドを実行します。

avahi-browse -a -r # ネットワーク上の全てのサービスとホスト名を解決

出力例(SSHサービスが発見・解決された場合):

+ enp0s1 IPv6 my-ubuntu-vm                                  SSH Remote Terminal  local
+ enp0s1 IPv4 my-ubuntu-vm                                  SSH Remote Terminal  local
+     lo IPv4 my-ubuntu-vm                                  SSH Remote Terminal  local
= enp0s1 IPv6 my-ubuntu-vm                                  SSH Remote Terminal  local
   hostname = [my-ubuntu-vm.local]
   address = [fddf:1b6f:e439:b011:5054:ff:fecd:913]
   port = [22]
   txt = []
= enp0s1 IPv4 my-ubuntu-vm                                  SSH Remote Terminal  local
   hostname = [my-ubuntu-vm.local]
   address = [192.168.2.2]
   port = [22]
   txt = []
=     lo IPv4 my-ubuntu-vm                                  SSH Remote Terminal  local
   hostname = [my-ubuntu-vm.local]
   address = [127.0.0.1]
   port = [22]
   txt = []

この出力は、MyUbuntuVMMyMacBookPro がSSHサービスを公開しており、それぞれのホスト名、IPアドレス、ポート番号などが解決されていることを示しています。+ はサービスが発見されたことを、= はその詳細が解決されたことを意味します。

特定のサービス(例: SSH)を探索するには、以下のコマンドを実行します。

avahi-browse -t _ssh._tcp # SSHサービスを探索

出力例(SSHサービスが発見された場合):

+ enp0s1 IPv6 my-ubuntu-vm                                  SSH Remote Terminal  local
+ enp0s1 IPv4 my-ubuntu-vm                                  SSH Remote Terminal  local
+     lo IPv4 my-ubuntu-vm                                  SSH Remote Terminal  local

この出力は、MyUbuntuVM がSSHサービスを公開していることを示しています。+ の行が表示されれば、サービスがネットワーク上で発見されていることを意味します。


avahi-resolve-host-name で特定のホスト名を解決する

Ubuntuで特定のホスト名がmDNSで解決できるかを確認します。

avahi-resolve-host-name MyMacBook.local

出力例(ホスト名が解決された場合):

MyMacBook.local    192.168.64.Y
MyMacBook.local    fe80::abcd:efgh:ijkl:mnop
  • これにより、指定した.localホスト名がどのIPアドレスに解決されるかを確認できます。IPv4アドレスとIPv6アドレスの両方、またはどちらか一方が表示されれば成功です。

getent hosts でシステムレベルの解決を確認する

Linuxシステムで、OSがどのようにホスト名を解決しているかを確認します。

getent hosts MyUbuntuVM.local

出力例(ホスト名が解決された場合):

192.168.64.X    my-ubuntu-vm.local
fddf:1b6f:e439:b011:5054:ff:fecd:913    my-ubuntu-vm.local
  • このコマンドは /etc/nsswitch.conf の設定に従ってホスト名解決を試みるため、システム全体での解決状況を把握するのに役立ちます。IPv4アドレスとIPv6アドレスの両方、またはどちらか一方が表示されれば成功です。

ファイアウォールとネットワーク設定の確認

ファイアウォールやネットワーク設定は、mDNS通信を妨げる主要な原因の一つです。


ufw (Ubuntu) やmacOSのファイアウォール設定

  • Ubuntu (UFW):
sudo ufw status verbose

出力例(UFWが無効な場合):

Status: inactive

この場合、UFWはmDNS通信をブロックしていません。

出力例(UFWが有効でmDNSポートが許可されている場合):

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
5353/udp                   ALLOW       Anywhere
5353/udp (v6)              ALLOW       Anywhere (v6)

この出力は、UFWが有効であり、UDPポート5353(mDNSが使用するポート)が明示的に許可されている状態です。

もしmDNSポートが許可されていない場合は、以下のコマンドで許可します。

sudo ufw allow proto udp from any to any port 5353 # mDNSポートを許可
  • macOS:
    「システム設定」>「ネットワーク」>「ファイアウォール」で、mDNS(Bonjour)関連の通信がブロックされていないか確認します。必要に応じて、特定のアプリケーション(例: SSH)の通信を許可します。

Multipassのネットワークモードとルーティング

MultipassのVMは、デフォルトでNATモードで起動することが多いです。この場合、ホストOSとVM間でのmDNS通信に制限がある場合があります。

  • NATモード: ホストOSからVMへのアクセスはポートフォワーディングが必要になることがあります。mDNSは通常、ブロードキャストベースで動作するため、NAT環境では期待通りに機能しないことがあります。
  • ブリッジモード: VMがホストOSと同じネットワークセグメントに直接接続されるため、mDNSがよりスムーズに機能します。VM作成時に --network bridge オプションを使用するか、既存のVMのネットワーク設定を変更することを検討してください。
  • ブリッジモードの制約と注意点:
    • ホスト側のネットワークインターフェースの可用性: ブリッジモードを使用するには、ホストマシンに利用可能な物理ネットワークインターフェース(Wi-Fiや有線LAN)が必要です。指定したインターフェースが利用できない場合、VMはネットワークに接続できません。
    • ネットワーク環境の制約: 一部の企業ネットワークや公共Wi-Fiなどでは、セキュリティ上の理由からブリッジモードでの接続が許可されていない場合があります。また、VMがIPアドレスを取得するためにDHCPサーバーが利用可能である必要があります。
    • ホストOSのファイアウォール設定: ホストOSのファイアウォールが、ブリッジされたVMからの通信をブロックする可能性があります。必要に応じて、ファイアウォール設定の見直しが必要になります。
    • VMの移動性: ブリッジモードで設定されたVMは、特定のネットワークインターフェースに依存するため、ホストマシンを別のネットワーク環境に移動した場合、VMのネットワーク設定を再調整する必要がある場合があります。

利用可能なネットワークインターフェースを確認するには、以下のコマンドを実行します。

multipass networks # 利用可能なネットワークインターフェースを確認

出力例(利用可能なネットワークインターフェースが表示された場合):

Name   Type       Description
en0    ethernet   Ethernet
en1    wifi       Wi-Fi
en5    ethernet   Ethernet Adapter (en5)
en6    ethernet   Ethernet Adapter (en6)
en7    ethernet   Ethernet Adapter (en7)

ブリッジモードでVMを起動する場合は、以下のコマンドを実行します。(en0 はホストのネットワークインターフェース名に合わせて変更してください)

multipass launch --name my-bridged-vm --network en0 # ブリッジモードでVMを起動 (en0はホストのネットワークインターフェース名)

出力例(VMが正常に起動した場合):

Launched: my-bridged-vm

まとめと次回予告

本記事では、mDNS/Avahiホスト名解決におけるトラブルシューティングとデバッグ術について、具体的な原因と解決策、そしてデバッグツールの活用法を解説しました。

  • Avahi/Bonjourサービスの稼働状況
  • ホスト名設定
  • nsswitch.conf の設定
  • dns-sdavahi-browse などのデバッグツール
  • ファイアウォールとMultipassのネットワーク設定

これらのポイントを順に確認することで、ほとんどのmDNS/Avahi関連の問題は解決できるはずです。もう「なぜか繋がらない…」と頭を抱える必要はありません。

次回は、【mDNS完全攻略】第5回:Multipassの真価を引き出す!ネットワークモードとmDNSの高度な連携術と題し、MultipassのネットワークモードとmDNSのより高度な連携術について深掘りしていきます。お楽しみに!


シリーズ記事

本シリーズの他の記事もぜひご覧ください。


この記事が役に立ったら、ぜひSNSでシェアしてください!

この記事について質問や疑問があればコメントしてください。あなたの環境でのmDNS活用事例も教えてください!


免責事項

本記事の内容は、執筆時点での情報に基づいています。ソフトウェアのバージョンアップ等により、手順や設定が変更される可能性があります。本記事の内容を参考に作業を行う際は、ご自身の責任において実施してください。いかなる損害が発生した場合でも、筆者および公開元は一切の責任を負いません。

SNSでもご購読できます。

コメントを残す

*