
ローカル開発環境の「見えない壁」を乗り越える
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デーモンと関連パッケージのインストール
- SSHサービスをAvahiで公開する
- Ubuntu VMのホスト名設定と確認
- nsswitch.conf の確認とmDNSの有効化
- Avahiサービスの再起動と動作確認
- まとめと次回予告
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-daemon
と libnss-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 Host が
ubuntu-avahi.local
というホスト名でSSH接続を試みます。 - macOS Host はローカルネットワークに mDNSクエリ を送信し、
ubuntu-avahi.local
のIPアドレスを問い合わせます。 - Multipass VM (Ubuntu) 内で動作している Avahi Daemon がこのクエリに応答し、自身のIPアドレスを mDNSレスポンス としてローカルネットワークに返します。
- macOS Host はAvahi Daemonから受け取った IPアドレス を取得します。
- macOS Host は取得したIPアドレスを使用して、Multipass VM 内の SSH Server にSSH接続を確立します。
これにより、macOSホストはIPアドレスを直接知らなくても、ホスト名だけでUbuntu VMにSSH接続できるようになります。
AvahiによるSSHサービスの公開
それでは、AvahiによるSSHサービスの公開して、macOS等からSSH接続先の「発見」を容易にするための設定を行っていきましょう。
AvahiでSSHサービスを公開する主な理由を説明します。
- サービスディスカバリの容易さ:
- Avahiはホスト名解決だけでなく、ネットワーク上で利用可能なサービス(SSH、HTTP、プリンターなど)を自動的に発見する「サービスディスカバリ」の機能も提供します。
dns-sd
やavahi-browse
コマンドを使えば、ネットワーク上のどのホストがどのようなサービスを提供しているかを簡単に確認できます。これは、特に開発環境で新しいサービスを立ち上げた際などに便利です。
Avahiはデフォルトでいくつかのサービスを公開しますが、SSHサービスをmDNSで公開するには、明示的な設定が必要です。これにより、macOSなどのクライアントからホスト名でSSH接続できるようになります。
- SSHサービスが起動しているか確認する
まず、Multipass VM内でSSHサーバー(sshd
)が起動しているかを確認します。
sudo systemctl status ssh
active (running)
と表示されていれば起動しています。もし起動していなければ、sudo systemctl start ssh
で起動してください。
- 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が通常使用するポート番号です。
- Avahiデーモンを再起動する
設定ファイルを変更したら、Avahiデーモンを再起動して変更を適用します。
sudo systemctl restart avahi-daemon
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_minimal
やmdns4
が追加されます。
例:
hosts: files mdns4_minimal [NOTFOUND=return] dns
hosts
エントリの重要性
このhosts:
の行は、システムがホスト名を解決する際の優先順位を定義しています。mdns4_minimal
やmdns4
が含まれていることで、通常のDNSクエリの前にmDNSによる解決が試みられるようになります。これにより、.local
ドメインのホスト名が正しく解決されるようになります。
mdns4_minimal
とmdns4
は、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_minimal
やmdns4
の設定がmDNSの名前解決に与える影響avahi-resolve-host-name
コマンドでmDNSによるホスト名解決が正しく行われているかを確認する方法
avahi-daemon
とlibnss-mdns
の役割を理解し、nsswitch.conf
の設定を確認することで、Ubuntuインスタンスが.local
ドメインで自身を公開し、ホスト名解決に応答できるようになりました。
次回の記事では、いよいよmacOSホストとUbuntu (Multipass) VM間で、mDNSを利用したシームレスなホスト名解決を体験します。IPアドレスを意識することなく、ホスト名でSSH接続やサービスアクセスが可能になる便利さを実感できるでしょう。どうぞお楽しみに!
シリーズ記事
本シリーズの他の記事もぜひご覧ください。
- 【mDNS完全攻略】第1回:ローカルネットワークの賢い名札「mDNS/Avahi」の基本とmacOSでの活用術
- 【mDNS完全攻略】第2回:Ubuntu (Multipass) にAvahiを導入し、ホスト名解決の基盤を築く
- 【mDNS完全攻略】第3回:macOSとUbuntu (Multipass) を繋ぐ!シームレスなホスト名解決を体験
- 【mDNS完全攻略】第4回:もう迷わない!mDNS/Avahiホスト名解決のトラブルシューティングとデバッグ術
- 【mDNS完全攻略】第5回:Multipassの真価を引き出す!ネットワークモードとmDNSの高度な連携術
- 【mDNS完全攻略】最終回:mDNS/Avahiで開発ワークフローを加速!自動化とサービスディスカバリの応用
この記事が役に立ったら、ぜひSNSでシェアしてください!
この記事について質問や疑問があればコメントしてください。あなたの環境でのmDNS活用事例も教えてください!
免責事項
本記事の内容は、執筆時点での情報に基づいています。ソフトウェアのバージョンアップ等により、手順や設定が変更される可能性があります。本記事の内容を参考に作業を行う際は、ご自身の責任において実施してください。いかなる損害が発生した場合でも、筆者および公開元は一切の責任を負いません。