nmcli Linux: 静的IP・DNS設定とコマンドラインによるネットワーク管理

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Quick Start: 5分ですぐに使える

サーバーにSSH接続してネットワーク設定をすぐに確認・変更したい?まず覚えておくべき3つのコマンドはこちら:

# すべての接続の状態を確認する
nmcli connection show

# ネットワークカードの情報を確認する
nmcli device status

# デバイスのIP、ゲートウェイ、DNS詳細を確認する
nmcli device show ens33

システムがcommand not foundと表示する場合は、先にNetworkManagerをインストールしてください:

# Ubuntu/Debian
sudo apt install network-manager

# CentOS/AlmaLinux/RHEL
sudo dnf install NetworkManager
sudo systemctl enable --now NetworkManager

動作確認できましたか?それでは各ステップを詳しく見ていきましょう。

nmcliを使う前に理解しておくこと

nmcliはNetworkManagerのCLIフロントエンドです。NetworkManagerはUbuntu 18.04+、Fedora 21+、RHEL/CentOS 7+、Debian 10+でデフォルトのネットワーク管理デーモンです。/etc/network/interfacesや/etc/sysconfig/network-scripts/を手動で編集する代わりに、nmcliを使ってNetworkManagerと通信すれば、あとはNetworkManagerが処理してくれます。

明確に区別すべき2つの概念があります:

  • Device:物理またはバーチャルのネットワークカード(eth0、ens33、wlan0など)
  • Connection:ネットワーク設定プロファイル(名前、IP、DNSなど)— 1つのデバイスに複数のConnectionを持てますが、同時にアクティブにできるのは1つだけです
# デバイスと状態を一覧表示する
nmcli device

# 非アクティブを含むConnectionを一覧表示する
nmcli connection show

# アクティブなConnectionのみ表示する
nmcli connection show --active

nmcli connection showの出力は次のような形式になります:

NAME         UUID                                  TYPE      DEVICE
ens33        a1b2c3d4-e5f6-...                     ethernet  ens33
lo           ...                                   loopback  lo

NAMEカラムの値が、以降のすべてのmodifyコマンドで使用する名前です。

nmcliで静的IPを設定する

ステップ1:Connection名を確認する

nmcli connection show

NAMEカラムの値を確認してください。通常はデバイス名(ens33、eth0など)と一致しますが、常にそうとは限りません。

ステップ2:静的IPを設定する

nmcli connection modify "ens33" \
  ipv4.method manual \
  ipv4.addresses "192.168.1.100/24" \
  ipv4.gateway "192.168.1.1" \
  ipv4.dns "8.8.8.8,1.1.1.1"

ステップ3:変更を適用する

nmcli connection up "ens33"

このコマンドは一度切断してから新しい設定で再接続します。SSH接続中にIPアドレスが変わる場合はセッションが切断されます。コンソールのバックアップを用意するか、新しいIPアドレスに到達可能であることを確認してから実行してください。

DHCPに戻す場合

nmcli connection modify "ens33" ipv4.method auto
nmcli connection up "ens33"

DNSを正しく管理する

これは初心者がよく間違える点です。NetworkManagerを使っているマシンでは、/etc/resolv.confは通常シンボリックリンクで、接続が変わるたびに上書きされます。このファイルを手動で編集してからNetworkManagerを再起動すると、設定が全部消えてしまいます。

正しい方法はnmcliでDNSを設定することです:

# ConnectionのDNSサーバーを設定する
nmcli connection modify "ens33" ipv4.dns "8.8.8.8,1.1.1.1"

# DNS検索ドメインを追加する(企業環境で便利)
nmcli connection modify "ens33" ipv4.dns-search "company.local internal.dev"

# 設定されているDNSを確認する
nmcli connection show "ens33" | grep -i dns

DHCPサーバーから提供されたDNSを無視して、手動で設定したDNSのみを使いたい場合:

nmcli connection modify "ens33" ipv4.ignore-auto-dns yes
nmcli connection up "ens33"

新しいConnectionをゼロから作成する

sysadminを始めた頃、ログをちゃんと読まなかったせいで半日つぶして原因を探し続けたことがありました。前回のOSインストール時に残った古いプロファイルとConflictしていたんです。それ以来、新しいサーバーをセットアップする際は古いConnectionを修正するのではなく、新しいConnectionを作成する習慣がつきました:

nmcli connection add \
  type ethernet \
  ifname ens33 \
  con-name "server-static" \
  ipv4.method manual \
  ipv4.addresses "10.0.0.50/24" \
  ipv4.gateway "10.0.0.1" \
  ipv4.dns "8.8.8.8"

# 新しいConnectionを有効にする
nmcli connection up "server-static"

# 不要な古いConnectionを削除する
nmcli connection delete "ens33"

応用:よくあるシナリオ

同じネットワークカードにIPアドレスを追加する

# +を使って追記する(上書きしない)
nmcli connection modify "ens33" +ipv4.addresses "192.168.1.101/24"
nmcli connection up "ens33"

IPv6の設定

nmcli connection modify "ens33" \
  ipv6.method manual \
  ipv6.addresses "2001:db8::1/64" \
  ipv6.gateway "2001:db8::fffe"
nmcli connection up "ens33"

ConnectionでIPv6を無効にする

nmcli connection modify "ens33" ipv6.method disabled
nmcli connection up "ens33"

Connection詳細を見やすい形式で表示する

nmcli -p connection show "ens33"

-p(pretty)フラグを付けると、テーブル形式で出力されデフォルトよりずっと読みやすくなります。

起動時の自動接続を無効にする

nmcli connection modify "ens33" connection.autoconnect no

日常業務での実践的なヒント

1. 変更後は即座に確認する:

ip addr show ens33
ip route show
cat /etc/resolv.conf

2. DNSが正常に動作しているか確認する:

resolvectl query google.com
# resolvectlがない場合はnslookupを使う
nslookup google.com

3. デバッグ時にNetworkManagerのログを確認する:

# リアルタイムで監視する
journalctl -u NetworkManager -f

# 直近50行を表示する
journalctl -u NetworkManager -n 50

4. 設定のバックアップと複製:Connectionファイルは/etc/NetworkManager/system-connections/にあります。このフォルダを新しいサーバーにコピーするだけで完了です。コマンドを入力し直す必要はありません:

rsync -avz /etc/NetworkManager/system-connections/ \
  root@new-server:/etc/NetworkManager/system-connections/
ssh root@new-server systemctl restart NetworkManager

5. 必要に応じてNetworkManagerを再起動する:

sudo systemctl restart NetworkManager

変更が反映されない場合、DNSがキャッシュされたままの場合、または設定ファイルを手動で編集した後に使用します。

sysadminの日常的なネットワーク作業のほとんどは、よく使うnmcliコマンド10〜15個でこなせます。ディストリビューションごとに異なる設定ファイルのパスを覚える必要がありません。さらに、スクリプトやAnsible playbookを書く際にも便利な点があります。nmcliの終了コードは明確で、0が成功、0以外がエラーです。昔のifconfigやrouteの出力をパースするより、if条件での判定がずっと楽になります。

Share: