Ubuntu 16.04 Server / 固定IPアドレスを設定する方法

Ubuntu 16.04 Serverでifupdownが管理する固定IPv4(Internet Protocol version 4)アドレスは、/etc/network/interfacesまたはそこから読み込むファイルに設定します。実際のインターフェイス名、アドレス、ネットマスク、ゲートウェイ、DNSを確認し、バックアップと復旧コンソールを用意してから適用してください。

この手順を適用できる環境を確認する

これはUbuntu 16.04の既存ifupdown構成で、一般的な単一の有線インターフェイスを変更する手順です。Netplan、NetworkManager、クラウド初期化ツールが管理するサーバーにそのまま追加しないでください。まず現在の管理ツールと設定元を確認します。

Ubuntu 16.04は古いリリースです。標準サポートは2021年、通常のESM(Expanded Security Maintenance、拡張セキュリティ保守)も2026年に終了しました。継続運用ではCanonicalのUbuntu 16.04サポート案内でLegacy追加サポートの適用と移行計画を確認してください。最新Ubuntuの標準ネットワーク手順ではありません。

インターフェイス名はサーバーごとに異なります。次のコマンドでディストリビューション、装置名、現在のIPv4アドレスとデフォルトルートを確認します。例のenp0s3をコピーせず、実際の接続に使う装置を特定してください。

lsb_release -ds
ip -o link show
ip -4 addr show
ip -4 route
cat /etc/network/interfaces
dpkg -l ifupdown resolvconf

ip -4 routeのdefault viaはデフォルトゲートウェイ、devはそのインターフェイスです。設定ファイルと照合し、dpkg -lでパッケージの導入状態も確認します。ファイルがない場合や管理方式が異なる場合は中止し、その環境の手順を使ってください。

アドレス、ゲートウェイ、DNSを決める

固定IPはサーバーで勝手に選ぶ値ではありません。管理者が割り当てたアドレスを使い、DHCP(Dynamic Host Configuration Protocol、動的ホスト構成プロトコル)の配布範囲と重ならない予約・除外方針を確認します。応答しないだけで未使用と判断しないでください。

  • アドレスとネットマスク:例は192.168.10.50と255.255.255.0で、192.168.10.50/24に相当します。このネットワークの192.168.10.0やブロードキャストの192.168.10.255をホストに設定しません。
  • ゲートウェイ:例は同じネットワークから直接到達できる192.168.10.1です。この単一インターフェイス例はデフォルトルートを1つにします。複数ネットワークやルーティング方針がある場合は別途設計が必要です。
  • DNS:名前をIPアドレスへ変換するDNS(Domain Name System)サーバーを指定します。例の192.168.10.1は、その機器がDNS問い合わせにも対応する場合だけ使えます。内部ドメインには、その名前を解決できる組織のDNSを選んでください。

これらは1つのプライベートネットワークの例です。仮想マシンのNAT、ブリッジ、ホストオンリー接続や、クラウドの割り当て規則に合わせて変更します。ゲストのプライベートIP固定と外部のグローバルIP予約は別の作業になり得ます。

設定をバックアップしDHCPをstaticへ変更する

  1. 物理コンソール、仮想化コンソール、クラウドの復旧コンソールに接続できるか先に確認します。SSH(Secure Shell)だけでアドレスを変更すると、切断後に復旧できない場合があります。停止時間を確保し、従来のアドレス、経路、DNSを記録してください。
  2. ネットワーク設定を別の場所にバックアップします。同名のバックアップがある場合は別名にします。
sudo cp -a /etc/network /etc/network.before-static-ip
sudoedit /etc/network/interfaces

sourceやsource-directoryがあれば読み込み先も確認します。実際の定義が/etc/network/interfaces.d/にあればそのファイルを編集し、主ファイルに同じ装置を重複定義しないでください。クラウド生成ファイルは起動時の上書きと事業者の対応方式も確認します。

  1. 次のDHCP区画を探します。異なる装置名を新しく作るのではなく、実際のインターフェイスの既存IPv4区画を変更します。
auto enp0s3
iface enp0s3 inet dhcp
  1. その区画だけを次のように置き換えます。他のインターフェイス、IPv6、読み込み指示、ループバック設定は保全します。
auto enp0s3
iface enp0s3 inet static
    address 192.168.10.50
    netmask 255.255.255.0
    gateway 192.168.10.1
    dns-nameservers 192.168.10.1

これはファイル全体の置き換えではありません。既存のauto loやiface lo inet loopbackを削除しないでください。autoは起動時に自動で有効にする装置、inet staticは静的IPv4方式を指定します。構文はifupdownのinterfacesマニュアルを参照してください。

dns-nameserversが反映される条件

dns-nameserversはIPアドレスやデフォルトルートとは役割が異なります。Ubuntu 16.04ではresolvconfとifupdownの連携スクリプトが動作して初めてDNS設定へ渡されます。Ubuntu 16.04のresolvconfマニュアルはこの連携と、複数DNSの空白区切りを説明しています。

/etc/resolv.confが自動生成される場合、直接編集しても上書きされることがあります。次で参照先と内容を確認し、resolvconfがある場合は登録されたDNS情報も調べます。

readlink -f /etc/resolv.conf
cat /etc/resolv.conf
if command -v resolvconf >/dev/null 2>&1; then
    resolvconf -l
fi

導入や連携がない環境ではdns-nameserversの1行だけではDNSは変わりません。利用中のDNS管理方式を確認して調整します。resolv.confにローカルキャッシュのアドレスが出る構成もあり、外部DNSが直接見えないだけで失敗とは限りません。

保存した設定を適用して検証する

  1. 保存後、ifupdownが読み取った設定を確認します。装置名、アドレス、ネットマスク、ゲートウェイが計画と一致する必要があります。このコマンドは設定を照会するだけでネットワークに適用しません。
ifquery enp0s3

ifqueryの成功はIP重複や実際の通信を検証したことにはなりません。エラーや未定義の装置が報告されたら、読み込み先、装置名、構文を先に修正します。範囲はifupdownのifquery・ifupマニュアルで確認できます。

  1. 復旧コンソールと停止時間を確保して再起動し、起動時の設定を適用します。次のコマンドはサーバー全体を再起動するため、準備が終わった場合だけ実行します。
sudo reboot

ネットワークサービスの再起動だけで古いアドレスやDHCP状態がすべて消えるとは限りません。一方、IPが変わらないからと再起動を繰り返しても設定の誤りは直りません。起動後はコンソールでアドレスと経路を確認し、新IPへ接続します。

ip -4 addr show dev enp0s3
ip -4 route
ping -c 3 192.168.10.1
getent ahostsv4 ubuntu.com

例なら装置に192.168.10.50/24、経路にdefault via 192.168.10.1 dev enp0s3が表示されます。ゲートウェイへの通信と名前解決を分けて確認してください。ICMP応答が遮断される環境ではping失敗だけで障害と断定せず、必要なサービスや別クライアントからの接続も試します。

失敗原因を調べて以前の設定へ戻す

アドレスがなければ装置名、ファイル位置、管理ツール、構文を確認します。アドレスはあっても他ネットワークへ通信できなければネットマスク、ゲートウェイ、経路を調べます。IP通信だけできて名前が使えなければDNSと内部ドメイン方針を確認してください。誤ったアドレス、DHCPの重複配布、他ファイルの二重定義も原因になります。

サービスのエラーはsudo systemctl status networking.serviceとsudo journalctl -u networking.service -b --no-pagerで確認できます。サービスが正常でもアドレスと通信が正しいとは限らず、前述の結果と照合します。

復元する場合は復旧コンソールで、今回変更したファイルだけを戻します。次は/etc/network/interfacesだけを変更した例です。区画ファイルを編集した場合は対応するバックアップをその場所へ戻し、ディレクトリ全体のコピーで後から加わった無関係な設定を上書きしないでください。

sudo cp -a /etc/network.before-static-ip/interfaces /etc/network/interfaces
sudo reboot

元がDHCPなら、再起動後に同じアドレスになる保証はありません。コンソールで割り当てアドレスと経路を調べ、DNSと管理接続の復旧まで確認して完了します。