【mDNS / Avahi 完全攻略】第5回: Multipass の真価を引き出す!ネットワークモード設定と mDNS のVM設定の自動化

MultipassでUbuntu VMをサクッと立ち上げて開発環境を構築。でも、ホストOSとの連携やVM間の通信で「あれ?繋がらない…」と頭を抱えた経験はありませんか?

特に、複数のVMを扱うようになると、IPアドレスの管理やホスト名解決が煩雑になりがちです。

本記事では、そんな悩みを解決する鍵となるMultipassのネットワークモードとmDNSの高度な連携術に迫ります。

まるで魔法のようにホスト名でVMにアクセスできるようになるだけでなく、開発ワークフローを劇的に効率化する秘訣を、TechBizPlus編集長が徹底解説します。


対象読者

  • Multipass利用者: 特に、複数のUbuntu VMを運用しており、VM間の通信やホストOSとの連携を最適化したい方。
  • ネットワーク設定に関心のある開発者: NATモードとブリッジモードの違い、mDNSの挙動、cloud-initによる自動設定など、Multipassのネットワーク機能を深く理解したい方。
  • 開発環境の自動化を推進したい方: cloud-initを活用したVMの初期設定自動化に興味がある方。
  • mDNS/Avahiの応用を検討している方: ホスト名解決だけでなく、より高度なネットワーク連携にmDNS/Avahiを利用したい方。

動作検証環境

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

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

目次


Multipassのネットワークモードを理解する

Multipassは、仮想マシン(VM)をホストOS上で動作させるためのツールですが、そのネットワーク設定はVMとホストOS、そして外部ネットワークとの連携において非常に重要です。主に「NATモード」と「ブリッジモード」の2つのモードがあります。


どちらのモードを選ぶべきか?

どちらのモードを選ぶべきかは、あなたの開発環境の要件によって異なります。

ネットワークモード選択の比較表

モード特徴適したケース
NATモードVMがホストOSのプライベートネットワーク内に配置され、ホストOSがトラフィックを仲介。VMは外部から直接アクセス不可(ポートフォワーディング除く)。単一VMでホストOSからの限定アクセスで十分な場合。VMが外部から直接アクセスされる必要がない場合。手軽にVMを立ち上げたい場合。
ブリッジモードVMがホストOSと同じネットワークセグメントに直接参加。VMは独自のIPを持ち、ホストOSや他のデバイスから直接アクセス可能。複数のVM間で通信が必要な場合。ホストOSからVMへの直接的なホスト名解決が必要な場合。VMをネットワーク上の独立したデバイスとして扱いたい場合。

NATモードの適したケースの図解(単一VM、限定的なアクセス)

NATモードの適したケースの図解

ブリッジモードの適したケースの図解(本番環境に近いシミュレーション)

ブリッジモードの適したケースの図解

NATモードの基本とmDNSの挙動

NAT(Network Address Translation)モードは、Multipassのデフォルト設定です。このモードでは、VMはホストOSのプライベートネットワーク内に配置され、ホストOSがVMのネットワークトラフィックを仲介します。VMから外部ネットワークへのアクセスは可能ですが、外部からVMへの直接的なアクセスは、ポートフォワーディングを設定しない限りできません。

NATモードの図解

VMはホストOSのプライベートネットワーク内に配置され、ホストOSがVMのネットワークトラフィックを仲介

mDNS(multicast DNS)は、ローカルネットワーク内でホスト名をIPアドレスに解決するためのプロトコルです。NATモードの場合、mDNSはVM内部でのみ機能し、ホストOSからはVMの.localホスト名を直接解決できないことが多いです。これは、VMがホストOSとは異なるプライベートネットワークにいるため、mDNSパケットがホストOSに到達しないためです。


ブリッジモードのメリットとmDNSの活用

ブリッジモードでは、VMはホストOSと同じネットワークセグメントに直接参加します。これにより、VMは独自のIPアドレスを持ち、ホストOSや同じネットワーク内の他のデバイスから直接アクセスできるようになります。まるで物理的な別のマシンがネットワークに接続されているかのように振る舞います。

ブリッジモードの図解

VMは独自のIPアドレスを持ち、ホストOSや同じネットワーク内の他のデバイスから直接アクセス

このブリッジモードこそが、mDNSを最大限に活用するための鍵となります。VMがホストOSと同じネットワークにいるため、mDNSパケットがネットワーク全体にブロードキャストされ、ホストOSとVM間でシームレスにホスト名解決が可能になります。これにより、IPアドレスを意識することなく、VMのホスト名(例: my-ubuntu-vm.local)でSSH接続したり、サービスにアクセスしたりできるようになります。


Multipassコマンドでネットワークを検査する

Multipassのネットワーク設定の理解と、トラブルシューティングのために、便利なコマンドを紹介します。


multipass networks で利用可能なネットワークを確認

ホストOSで利用可能なネットワークインターフェースと、Multipassがそれらをどのように認識しているかを確認できます。これにより、ブリッジモードでどのインターフェースを使用できるかを判断するのに役立ちます。

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)

この出力は、ホストマシンで利用可能なネットワークインターフェースと、Multipassが作成するブリッジインターフェースを示しています。


multipass info <VM名> でVMのネットワーク情報を確認

特定のVMのIPアドレス、MACアドレス、ネットワークインターフェースなどの詳細情報を取得できます。VMがどのネットワークモードで動作しているか、どのようなIPアドレスが割り当てられているかを確認する際に非常に便利です。

multipass info my-ubuntu-vm

出力例(VMの詳細情報が表示された場合):

Name:           my-ubuntu-vm
State:          Running
Snapshots:      0
IPv4:           192.168.2.6
Release:        Ubuntu 24.04.3 LTS
Image hash:     6177a7958f01 (Ubuntu 24.04 LTS)
CPU(s):         1
Load:           0.00 0.00 0.00
Disk usage:     2.6GiB out of 4.8GiB
Memory usage:   221.0MiB out of 952.7MiB
Mounts:         --

この出力は、VMの名前、状態、割り当てられているIPv4アドレス(NATモードとブリッジモードの両方)、Ubuntuのバージョンなどを示しています。ブリッジモードの場合、192.168.1.Y (en0) のように、ホストのネットワークインターフェース名と共にIPアドレスが表示されることがあります。


ip aroute コマンドでのVM内からの確認

VM内部から自身のIPアドレスやルーティングテーブルを確認し、ネットワーク設定が正しく適用されているかを検証します。これにより、VMがネットワークに正しく接続されているか、意図した経路で通信が行われているかを確認できます。

# VM内で実行
ip a

出力例(VMにIPアドレスが割り当てられている場合):

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp0s1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:15:0a:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.6/24 metric 100 brd 192.168.2.255 scope global dynamic enp0s1
       valid_lft 3144sec preferred_lft 3144sec
    inet6 fddf:1b6f:e439:b011:5054:ff:fe15:ae2/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 2591937sec preferred_lft 604737sec
    inet6 fe80::5054:ff:fe15:ae2/64 scope link 
       valid_lft forever preferred_lft forever

この出力は、enp0s1 インターフェースにIPv4アドレス (192.168.2.X) とIPv6アドレスが割り当てられていることを示しています。

# VM内で実行
route -n

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

sudo apt install net-tools

インストール後、再度 route -n コマンドを実行してください。

出力例(VMのルーティングテーブルが表示された場合):

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.2.1     0.0.0.0         UG    100    0        0 enp0s1
192.168.2.0     0.0.0.0         255.255.255.0   U     100    0        0 enp0s1
192.168.2.1     0.0.0.0         255.255.255.255 UH    100    0        0 enp0s1

この出力は、デフォルトゲートウェイ (192.168.2.1) と、enp0s1 インターフェースに接続されているネットワーク (192.168.2.0/24) を示しています。


cloud-initを活用したmDNSの自動設定

複数のVMを構築したり、開発環境を再現性高くセットアップしたりする場合、手動での設定は手間がかかります。ここで強力な味方となるのがcloud-initです。

cloud-initの基本とMultipassでの利用

cloud-initは、VM起動時にスクリプトを実行し、初期設定を自動化するためのツールです。ユーザーデータとしてスクリプトを渡すことで、パッケージのインストール、ユーザーの追加、ファイルの配置、サービスの起動など、様々な初期設定を自動で行うことができます。

Multipassは、VM作成時に--cloud-initオプションを使ってcloud-initスクリプトを渡すことができます。これにより、VMが起動した瞬間にAvahiデーモンをインストールし、mDNSを有効化するといった自動設定が可能になります。


Avahiインストールと設定を自動化するcloud-initスクリプト例

以下は、Avahiデーモンと必要なライブラリをインストールし、nsswitch.confを更新してmDNSを有効化、SSHサービスを自動登録・有効化するcloud-initスクリプトの例です。これをcloud-init.yamlなどのファイル名で保存し、MultipassでVMを作成する際に指定します。

#cloud-config
packages:
  - avahi-daemon
  - libnss-mdns
  - openssh-server # SSHサービスがインストールされていることを確認

runcmd:
  - echo "hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4" | sudo tee /etc/nsswitch.conf > /dev/null
  - sudo systemctl enable avahi-daemon
  - sudo systemctl restart avahi-daemon
  - sudo systemctl enable ssh # SSHサービスを有効化
  - sudo systemctl start ssh # SSHサービスを開始

write_files:
  - path: /etc/avahi/services/ssh.service
    mode: '0644'
    content: |
      <?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>

VM作成時のコマンド例:

multipass launch --name my-avahi-vm --cloud-init cloud-init.yaml

これにより、VMが起動した時点でmDNSが有効になり、ホストOSからmy-avahi-vm.localといったホスト名でアクセスできるようになります。また、SSHサービスも自動的にAvahiに登録され、ホストOSからホスト名でのSSH接続が可能になります。

出力例(起動後のサービス確認):

Browsing for _ssh._tcp.local.
DATE: ---Sun 05 Oct 2025---
12:32:40.040  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
12:32:40.041  Add        2  26 local.               _ssh._tcp.           my-avahi-vm

まとめと次回予告

Multipassのネットワークモードを深く理解し、mDNSと組み合わせることで、ローカル開発環境は劇的に進化します。

本記事では、以下の内容を解説しました。

  • Multipassのネットワークモード: NATモードとブリッジモードの基本的な違い、それぞれのメリット・デメリット、そして適切な選択基準を理解しました。
  • mDNSの挙動: 各ネットワークモードにおけるmDNSの動作原理と、ホストOSとの連携における重要性を学びました。
  • ネットワーク検査コマンド: multipass networksmultipass info <VM名>、VM内でのip arouteコマンドを使って、ネットワーク設定を確認・トラブルシューティングする方法を習得しました。
  • cloud-initによる自動設定: Avahiデーモンのインストール、nsswitch.confの更新、SSHサービスの自動登録、そしてSSH公開鍵のVMへの登録をcloud-initスクリプトで自動化する方法を実践しました。

特にcloud-initを活用した自動設定は、複数のVMを扱う開発者にとって強力な武器となるでしょう。

IPアドレスを意識することなくホスト名でVMにアクセスできる快適さを、ぜひあなたの開発ワークフローに取り入れてみてください。

次回の記事では、このシリーズの総まとめとして、mDNS/Avahiを開発ワークフロー全体で加速させる応用テクニックをご紹介します。お楽しみに!


シリーズ記事

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


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

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


免責事項

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

SNSでもご購読できます。

コメントを残す

*