【mDNS / Avahi 完全攻略】第2回:Ubuntu ( Multipass ) に Avahi を導入し、ホスト名解決の基盤を築く

ローカル開発環境の「見えない壁」を乗り越える

macOSとUbuntu、異なるOS環境を行き来しながら開発を進める際、誰もが一度は経験するであろう「見えない壁」があります。
それは、ホスト名解決の煩わしさです。特に仮想環境であるMultipass上のUbuntuインスタンスにアクセスしようとすると、「IPアドレスを覚えるのが面倒」「DHCPでIPが変わると設定し直し」といった悩みがつきまといます。

ご安心ください!この「見えない壁」を打ち破る強力なツール、それがmDNS(Multicast DNS)であり、Linux環境におけるその実装であるAvahiです。前回の記事ではmacOSにおけるmDNSの基本とBonjourの役割について解説しました。
今回は、Multipassで構築したUbuntu環境にAvahiを導入し、ローカルネットワーク内でのホスト名解決の基盤を築く方法を、ステップバイステップで丁寧に解説していきます。

この記事を読み終える頃には、あなたはIPアドレスを意識することなく、まるで隣のPCに話しかけるように、ホスト名でUbuntuインスタンスにアクセスできるようになっているでしょう。さあ、よりスムーズで快適な開発ワークフローへの第一歩を踏み出しましょう!


対象読者

  • Multipass利用者: MultipassでUbuntu VMを運用しており、VMのホスト名解決やサービスディスカバリを強化したい方。
  • Linuxユーザー: 特にUbuntu環境でmDNS/Avahiの導入・設定方法を学びたい方。
  • 開発環境構築者: 複数のVMやサービスを扱う開発環境で、IPアドレス管理の手間を減らし、効率的なホスト名解決を実現したい方。
  • ネットワークの基礎知識を深めたい方: mDNS/Avahiの具体的な設定を通じて、ローカルネットワークの仕組みをより深く理解したい方。

動作検証環境

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

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

目次


MultipassでUbuntu VMを準備する

まずは、AvahiをインストールするUbuntu仮想マシンをMultipassで準備しましょう。まだMultipassをインストールしていない方は、前回の記事を参考にインストールを完了してみてください。

Multipassの基本的な使い方とVM起動

Multipassは、コマンド一つでUbuntu仮想マシンを簡単に起動できるツールです。以下のコマンドで新しいUbuntuインスタンスを起動します。ここではubuntu-avahiという名前を付けます。

multipass launch --name ubuntu-avahi

起動が完了したら、以下のコマンドでインスタンスの状態を確認できます。

multipass list

出力例:

Name          State    IPv4             Image
ubuntu-avahi  Running  192.168.64.X     Ubuntu 24.04 LTS

VMへのSSH接続

起動したubuntu-avahiインスタンスにSSHで接続します。これもMultipassのコマンドで簡単に行えます。

mulipass shell ubuntu-avahi

これで、Ubuntu仮想マシン内でコマンドを実行できるようになりました。


Avahiデーモンと関連パッケージのインストール

次に、UbuntuインスタンスにAvahiを導入します。Avahiは、mDNSサービスを提供するデーモンと、システムがmDNSでホスト名を解決できるようにするライブラリで構成されています。

avahi-daemonlibnss-mdns の役割

  • avahi-daemon: mDNSサービスをネットワークに公開し、他のデバイスからのmDNSクエリに応答するデーモン(常駐プロセス)です。これにより、ubuntu-avahi.localのようなホスト名がネットワーク上で認識されるようになります。
  • libnss-mdns: Name Service Switch (NSS) のモジュールの一つで、システムがホスト名を解決する際にmDNSを利用できるようにします。これにより、ping ubuntu-avahi.localのようなコマンドが機能するようになります。

apt コマンドでのインストール手順

以下のコマンドで、これらのパッケージをインストールします。

sudo apt update
sudo apt install -y avahi-daemon libnss-mdns

インストールが完了すると、avahi-daemonは自動的に起動します。
インストール後、avahi-daemonが正しく起動しているかを確認します。

systemctl status avahi-daemon

実行例(正常に動作している場合):

 avahi-daemon.service - Avahi mDNS/DNS-SD Stack
     Loaded: loaded (/usr/lib/systemd/system/avahi-daemon.service; enabled; preset: enabled)
     Active: active (running) since Sun 2025-10-05 10:01:40 JST; 11s ago
TriggeredBy:  avahi-daemon.socket
   Main PID: 1476 (avahi-daemon)
     Status: "avahi-daemon 0.8 starting up."
      Tasks: 2 (limit: 1059)
     Memory: 820.0K (peak: 1.0M)
        CPU: 6ms
     CGroup: /system.slice/avahi-daemon.service
             ├─1476 "avahi-daemon: running [my-dev-vm.local]"
             └─1477 "avahi-daemon: chroot helper"

active (running) と表示されていれば、Avahiデーモンは正常に動作しています。もし inactive (dead) などと表示されている場合は、以下のコマンドで起動してください。

sudo systemctl start avahi-daemon

SSHサービスをAvahiで公開する

AvahiにおけるSSH接続の処理の流れ

ここでは、SSHサービスをAvahiで公開し、macOSなどのクライアントからIPアドレスを意識せずにホスト名でSSH接続できるようにする設定について解説します。

まずは、macOSとMultipass VM上のAvahiにおけるSSH接続の処理の流れです。

macOSとMultipass VM上のAvahiにおけるSSH接続の処理の流れ

図の解説:

  1. macOS Hostubuntu-avahi.local というホスト名でSSH接続を試みます。
  2. macOS Host はローカルネットワークに mDNSクエリ を送信し、ubuntu-avahi.local のIPアドレスを問い合わせます。
  3. Multipass VM (Ubuntu) 内で動作している Avahi Daemon がこのクエリに応答し、自身のIPアドレスを mDNSレスポンス としてローカルネットワークに返します。
  4. macOS Host はAvahi Daemonから受け取った IPアドレス を取得します。
  5. macOS Host は取得したIPアドレスを使用して、Multipass VM 内の SSH Server にSSH接続を確立します。

これにより、macOSホストはIPアドレスを直接知らなくても、ホスト名だけでUbuntu VMにSSH接続できるようになります。


AvahiによるSSHサービスの公開

それでは、AvahiによるSSHサービスの公開して、macOS等からSSH接続先の「発見」を容易にするための設定を行っていきましょう。

AvahiでSSHサービスを公開する主な理由を説明します。

  • サービスディスカバリの容易さ:
  1. Avahiはホスト名解決だけでなく、ネットワーク上で利用可能なサービス(SSH、HTTP、プリンターなど)を自動的に発見する「サービスディスカバリ」の機能も提供します。
  2. dns-sdavahi-browse コマンドを使えば、ネットワーク上のどのホストがどのようなサービスを提供しているかを簡単に確認できます。これは、特に開発環境で新しいサービスを立ち上げた際などに便利です。

Avahiはデフォルトでいくつかのサービスを公開しますが、SSHサービスをmDNSで公開するには、明示的な設定が必要です。これにより、macOSなどのクライアントからホスト名でSSH接続できるようになります。

  1. SSHサービスが起動しているか確認する
    まず、Multipass VM内でSSHサーバー(sshd)が起動しているかを確認します。
sudo systemctl status ssh

active (running) と表示されていれば起動しています。もし起動していなければ、sudo systemctl start ssh で起動してください。

  1. SSHサービス公開用の設定ファイルを作成する
    Avahiは、/etc/avahi/services/ ディレクトリにある .service ファイルを読み込んでサービスを公開します。SSHサービスを公開するための設定ファイルを作成します。
sudo nano /etc/avahi/services/ssh.service

ファイルに以下の内容を記述し、保存してください。

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">%h</name>
  <service>
    <type>_ssh._tcp</type>
    <port>22</port>
  </service>
</service-group>
  • <name replace-wildcards="yes">%h</name>: ホスト名(例: ubuntu-avahi)をサービス名として使用します。
  • <type>_ssh._tcp</type>: SSHサービスであることを示します。
  • <port>22</port>: SSHが通常使用するポート番号です。
  1. Avahiデーモンを再起動する
    設定ファイルを変更したら、Avahiデーモンを再起動して変更を適用します。
sudo systemctl restart avahi-daemon
  1. dns-sd コマンドでサービスを探索する

Avahiが公開しているサービスを探索するには、dns-sd コマンドを使います。
dns-sd コマンドの詳細な使い方や実行例については、【mDNS / Avahi 完全攻略】第1回:ローカルネットワークの賢い名札「mDNS/Avahi」の基本とmacOSでの活用術 を参照してください。

ここでは、SSHサービスが正しく公開されているかを確認するための簡単な実行例を示します。

dns-sd -B _ssh._tcp local.

実行例:

Browsing for _ssh._tcp.local.
DATE: ---Sun 05 Oct 2025---
10:22:46.371  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
10:22:46.372  Add        2  26 local.               _ssh._tcp.           my-dev-vm

ubuntu-avahi のようなサービス名が表示されていれば、SSHサービスがmDNSで正しく公開されていることを確認できます。


Ubuntu VMのホスト名設定と確認

mDNSでホスト名を解決するためには、VM自身のホスト名が適切に設定されている必要があります。Multipassで起動したインスタンスは、デフォルトでインスタンス名がホスト名として設定されますが、念のため確認・設定方法を解説します。


hostnamectl を使ったホスト名の変更

現在のホスト名を確認します。

hostnamectl

実行例:

   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

もしホスト名を変更したい場合は、以下のコマンドを実行します。(ここではubuntu-avahiのまま進めます)

sudo hostnamectl set-hostname your-new-hostname

.local ドメインでの公開準備(ホスト名を一意にする)

Avahiは、デフォルトでホスト名を.localドメインで公開します。特別な設定は不要ですが、ホスト名がネットワーク上で一意であることを確認することが重要です。

ホスト名が重複している場合、以下のような不具合が発生する可能性があります。

  • 名前解決の競合: 複数のデバイスが同じ .local ホスト名を公開すると、クライアントが名前解決を試みた際に、どのデバイスのIPアドレスを取得すべきか判断できなくなります。これにより、意図しないデバイスに接続されたり、名前解決が失敗したりする可能性があります。
  • 接続の不安定化: クライアントが名前解決に成功しても、そのIPアドレスが常に正しいデバイスを指すとは限りません。ネットワークの状態やmDNSのキャッシュによって、接続先が頻繁に変わるなど、接続が不安定になる可能性があります。
  • サービスディスカバリの混乱: SSHなどのサービスをmDNSで公開している場合、同じホスト名で複数のサービスが検出されることになり、どのサービスに接続すべきか混乱が生じます。
  • トラブルシューティングの困難さ: ホスト名が重複していると、ネットワークの問題や接続エラーが発生した際に、原因の特定が非常に困難になります。

これらの問題を避けるためにも、ローカルネットワーク内で使用するホスト名は一意になるように設定することを強く推奨します。


nsswitch.conf の確認とmDNSの有効化

libnss-mdnsパッケージをインストールすると、システムがホスト名を解決する際にmDNSを利用するように設定が変更されます。この設定は/etc/nsswitch.confファイルで行われます。


libnss-mdns による自動設定の確認

nsswitch.confファイルの内容を確認します。

cat /etc/nsswitch.conf | grep hosts

通常、libnss-mdnsがインストールされていると、hosts:の行にmdns4_minimalmdns4が追加されます。

例:

hosts: files mdns4_minimal [NOTFOUND=return] dns

hosts エントリの重要性

このhosts:の行は、システムがホスト名を解決する際の優先順位を定義しています。mdns4_minimalmdns4が含まれていることで、通常のDNSクエリの前にmDNSによる解決が試みられるようになります。これにより、.localドメインのホスト名が正しく解決されるようになります。

mdns4_minimalmdns4は、mDNSによる名前解決の方法を制御する設定値です。

  • mdns4_minimal:
    • mDNSによるIPv4アドレス解決のみを行います。
    • .local ドメインのホスト名解決に特化しており、他のドメイン(例: .com)の解決は行いません。
    • 通常 [NOTFOUND=return] オプションと組み合わせて使用され、.local ドメインのホスト名が見つからなかった場合は、それ以降の名前解決方法(例: dns)を試さずにすぐに結果を返します。これにより、名前解決のパフォーマンスが向上する場合があります。
  • mdns4:
    • mDNSによるIPv4アドレス解決を行います。
    • .local ドメインだけでなく、通常のDNSクエリと同様に他のドメインの解決も試みます。
    • mdns4_minimal よりも広範な名前解決を試みるため、パフォーマンスが若干低下する可能性があります。

一般的には、.local ドメインのホスト名解決を優先し、それ以外の名前解決は通常のDNSに任せるために mdns4_minimal [NOTFOUND=return] が推奨されます。


Avahiサービスの再起動と動作確認

Avahiデーモンが正しく動作しているかを確認し、必要であれば再起動します。


systemctl でのサービス管理

Avahiデーモンの状態を確認します。

systemctl status avahi-daemon

active (running)と表示されていれば問題ありません。もし停止している場合は、以下のコマンドで起動します。

sudo systemctl start avahi-daemon

設定を変更した場合は、以下のコマンドで再起動します。

sudo systemctl restart avahi-daemon

avahi-resolve-host-name での確認

Ubuntuインスタンス内で、自身のホスト名がmDNSで解決できるかを確認します。

インストール後、以下のコマンドを実行します。

avahi-resolve-host-name ubuntu-avahi.local

実行例:

ubuntu-avahi.local    fddf:1b6f:e439:b011:5054:ff:fe15:ae2

自身のIPアドレスが表示されれば成功です。もしIPv6アドレスが表示され、IPv4アドレスを確認したい場合は、-4 オプションを使用します。

avahi-resolve-host-name -4 ubuntu-avahi.local

実行例:

ubuntu-avahi.local    192.168.64.X

もし avahi-resolve-host-name コマンドが見つからない場合は、avahi-utils パッケージをインストールする必要があります。

sudo apt install avahi-utils

まとめと次回予告

今回は、Multipassで構築したUbuntu環境にAvahiを導入し、mDNSによるホスト名解決の基盤を築く方法を学びました。

具体的には、以下の内容を解説しました。

  • MultipassでUbuntu VMを準備し、SSH接続を行う方法
  • Avahiデーモンとlibnss-mdnsの役割とインストール手順
  • systemctl status avahi-daemon コマンドでAvahiデーモンの動作状況を確認する方法
  • SSHサービスをAvahiで公開するための設定と、そのゴールイメージ
  • dns-sd コマンドを使って公開されたSSHサービスを探索する方法
  • hostnamectl コマンドでUbuntu VMのホスト名を確認・変更する方法
  • .local ドメインでのホスト名公開の重要性と、ホスト名重複時の注意点
  • /etc/nsswitch.conf ファイルにおけるmdns4_minimalmdns4の設定がmDNSの名前解決に与える影響
  • avahi-resolve-host-name コマンドでmDNSによるホスト名解決が正しく行われているかを確認する方法

avahi-daemonlibnss-mdnsの役割を理解し、nsswitch.confの設定を確認することで、Ubuntuインスタンスが.localドメインで自身を公開し、ホスト名解決に応答できるようになりました。

次回の記事では、いよいよmacOSホストとUbuntu (Multipass) VM間で、mDNSを利用したシームレスなホスト名解決を体験します。IPアドレスを意識することなく、ホスト名でSSH接続やサービスアクセスが可能になる便利さを実感できるでしょう。どうぞお楽しみに!


シリーズ記事

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


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

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


免責事項

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

SNSでもご購読できます。

コメントを残す

*