UbuntuのNetplan:プロのためのYAMLネットワーク設定ガイド

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

消えた /etc/network/interfaces の謎

Debianや古いバージョンのUbuntuを管理して育った人にとって、サーバーの応答がなくなると、体が覚えている操作で真っ先に /etc/network/interfaces を開こうとするでしょう。そこには eth0 や ens33 の見慣れた設定リストがあるはずです。しかし、Ubuntu Server 22.04や24.04 LTSなどのモダンなエディションでは、そのファイルを開いても空だったり、別の場所を見るように促すコメントが1行あるだけだったりします。

この変化は、当初多くのシステム管理者に頭痛の種をもたらしました。かつて私が20台のWebノードをデプロイした際、レガシーな設定編集が再起動のたびに消えてしまう理由を突き止めるのに30分も費やしたことがあります。実質的に、自分のリモートインスタンスから締め出されてしまったのです。これはバグではなく、Linuxネットワーク抽象化レイヤーの完全な刷新によるものでした。

なぜUbuntuはNetplanに切り替えたのか

Canonicalは、ハイレベルなトランスレーター(翻訳役)として機能させるために Netplan を導入しました。systemd-networkdNetworkManager のための複雑で低レベルなスクリプトを書く代わりに、単一のYAMLファイルに設定の意図を定義するようになりました。Netplanはこのファイルを読み取り、バックエンドに応じた具体的な設定ファイルを生成します。

Ubuntu Serverは通常、デフォルトのレンダラーとして systemd-networkd を使用しますが、Desktop版は NetworkManager を使用する傾向があります。この統一された構文は強力ですが、正確さが求められます。YAMLは空白(スペース)に非常にうるさいことで知られています。2つのスペースの代わりにタブ文字を1つ使っただけで、ネットワークスタック全体が読み込まれなくなってしまいます。

設定ファイルの場所

ネットワーク定義は /etc/netplan/ に保存されています。通常、01-netcfg.yaml50-cloud-init.yaml といった名前のファイルが見つかります。ファイル名の先頭にある数字は、複数のファイルがある場合の読み込み順序を決定するものです。

設定を変更する前に、ハードウェアの論理名を確認しましょう。カーネルが認識している名前を確認するには、ip link コマンドを実行します。

ip link show

enp0s3ens18 といった識別子を探してください。YAMLファイルではこれらの文字列を正確に使用する必要があります。そうでないと、設定をハードウェアに紐付けることができません。

基本的なDHCP設定

DHCPがIP割り当てを行う標準的なラボ環境やパブリッククラウドのVPC内であれば、設定は非常にシンプルです。標準的なDHCP設定は以下のようになります。

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: true

この階層構造では、network がルートであり、version: 2 が現在の標準です。各レベルは正確に2つのスペースでインデントする必要があります。タブは使用しないでください。使用するとNetplanが構文エラーを返します。

静的IPアドレスの設定(モダンな方法)

本番環境のサーバーでは、ほぼ常に静的IPが必要です。データベースクラスターの運用でもWebプロキシの構築でも、内部ルーティングにおいてIPの永続性は不可欠です。私はこれまで何百もの本番環境デプロイメントで、以下のテンプレートを問題なく使用してきました。

以下は、Ubuntu 22.04および24.04で検証済みの静的IP設定です。

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      addresses:
        - 10.0.0.50/24
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
      routes:
        - to: default
          via: 10.0.0.1

重要な構文の変更点:

  • addresses: CIDR表記が必要です。標準的な255.255.255.0のサブネットマスクには /24 を使用します。
  • nameservers: ブラケット内にコンマ区切りで複数のDNSプロバイダーをリストできます。
  • routes: 古い gateway4 キーは正式に非推奨となりました。モダンなNetplanでは、routes ブロックを使用してゲートウェイIPへの default パスを定義します。

「セーフティネット」コマンド

SSH経由でネットワーク設定を変更するのは、自分自身を手術するようなものです。タイポ(打ち間違い)ひとつでサーバーから切り離され、データセンターまで足を運ぶか、シリアルコンソールでのログインを余儀なくされます。Netplanは「try」機能でこの問題を解決します。

設定を盲目的に適用するのではなく、必ずこのコマンドを実行してください:

sudo netplan try

このコマンドは設定を適用しますが、120秒のカウントダウンを開始します。Enterキーを押して確定しない限り、Netplanは接続が失われたと判断し、自動的に以前の動作していた設定にロールバックします。これはリモート管理者にとって最も重要なツールです。

インデントとロジックのトラブルシューティング

netplan apply が失敗する場合、原因のほとんどはフォーマットエラーです。YAMLはタブをサポートしていないため、テキストエディタがスペースを挿入するように設定されているか確認してください。「Invalid YAML」エラーが表示された場合は、カラム(列)の位置を再確認しましょう。

内部で何が起きているかを確認するには、デバッグフラグを使用します:

sudo netplan --debug apply

この出力により、NetplanがYAMLを /run/systemd/network/ にある実際のファイルにどのように変換しているかがわかります。YAMLが有効なのにIPが表示されない場合、デバッグログを見れば、バックエンドのデーモンがパラメータを拒否しているかどうかが判断できます。

複数インターフェースの処理

モダンなサーバーでは、パブリックなインターネット通信とプライベートなバックエンドネットワークでトラフィックを分けることがよくあります。Netplanでは、ethernets キーの下にセカンダリエントリを追加することでこれを管理します:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: true
    enp0s8:
      addresses:
        - 192.168.10.15/24

このシナリオでは、enp0s3 がインターネットアクセスのために動的IPを取得します。一方で、enp0s8 はローカルのデータベース通信のために静的なプライベートIPに固定されます。enp0s8 にはゲートウェイがないため、システムはすべての外部トラフィックを最初のインターフェースのDHCPから提供されたゲートウェイ経由で正しくルーティングします。

まとめ

Netplanへの移行は、古い方法に慣れている人には手間に感じるかもしれませんが、Linuxのネットワーク管理に待望の構造化をもたらしました。ネットワークを宣言的なYAMLファイルとして扱う手法は、モダンな「Infrastructure as Code」のワークフローに完璧に適合します。スペースの一貫性を保つこと、そして不慮の締め出しを避けるために必ず netplan try を使用することを忘れないでください。

Share: