えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

nmcliコマンドの基礎

f:id:stopendy:20180908141506p:plain:w400

本記事で紹介すること

nmcliコマンドの基本的な使い方を紹介します。

nmcliコマンドによるIPアドレス設定、ゲートウェイ設定、DNSクライアント設定などの応用的なコマンド例については、以下の記事で紹介します。

endy-tech.hatenablog.jp

ipコマンドについては、本記事の後半で概要のみ紹介します。

nmcliの概要

RHEL6 / CentOS6でのネットワーク設定は、以下の流れで行われていました。

  1. 設定ファイルの編集
  2. networkサービスの再起動で設定反映

しかし、RHEL7 / CentOS7以降ではトレンドが変わり、Network Managerよる設定変更手順が公式で推奨されるようになりました。
※(追記) RHEL8では、ip コマンドがネットワーク設定方法の一覧に載らなくなりました。NetworkManager をますます推奨する動きになっているようです

今回紹介するのは、Network Managerサービスを利用して設定変更するやり方です。
nmcli (Network Manager CLI) とは、この設定変更をCLIで実施するコマンドです。

nmcliよりもGUIっぽくしたnmtui (Network Manager Table User Interface) というコマンドもありますが、設定の効率性を考えるとnmcliの方がオススメです。
nmtui についても本記事の後半で概要のみ紹介しています。

Network Managerについて深く知りたい方は、Redhat公式マニュアルをご覧ください。
とはいえ、簡単な設定変更であれば、マニュアルを読まなくても十分対応可能です。
Chapter 2. Getting started with NetworkManager Red Hat Enterprise Linux 8 | Red Hat Customer Portal

Device と Connection

Network Managerの仕組みのなかで、少々ややこしいのが、この DeviceConnection の概念です。
この仕組みを一言で言うと、「物理インターフェース (Device) とネットワーク設定 (Connection) を別々に管理することで柔軟性を高めている」 ということです。

Device の説明

Deviceは、"enp0s3" とか "eth0" といった物理インターフェース名がついています。
物理インターフェースがLinux Kernelに認識されると、恐らく自動的にDeviceは追加されます。

現在認識されている Device を一覧表示するには、以下のコマンドを実行します。

nmcli device 
# DEVICE           TYPE      STATE      CONNECTION         
# enp0s3           ethernet  connected  enp0s3
# enp0s8           ethernet  connected  enp0s8
# enp0s9           ethernet  connected  enp0s9

Connection の説明

Connectionは、Deviceに対して紐づく論理インターフェースです。
「設定オブジェクト」と言い換えても問題ありません。

IPアドレスやVLAN-IDなどのネットワーク設定は、全てConnectionに対して行います。
そしてConnectionをDeviceに対して紐づけると、ネットワーク設定が物理インターフェースに対して適用されることになります。

現在設定されている Connection を一覧表示するには、以下のコマンドを実行します。

nmcli connection 
# NAME    UUID                                  TYPE      DEVICE      
# enp0s3  8e8b4ff2-9e28-3017-b1a6-52eb65e0e49c  ethernet  enp0s3      
# enp0s8  3ad9f029-8fd4-3511-a9b1-5943620708eb  ethernet  enp0s8      
# enp0s9  5eaed3b4-7a97-3179-8a8e-b6b99890e16e  ethernet  enp0s9

Device と Connection のまとめ

Deviceは、物理インターフェースのことです。
Linuxカーネル (OS) が物理インターフェースを認識した時点で自動生成します。

Connectionとは、論理インターフェース、または設定オブジェクトのことです。
Connectionはユーザーが明示的に作成し、Deviceに紐づけて設定反映することで効果を発揮します。

全体像を図で表すと、以下のようになります。

f:id:stopendy:20190113222838p:plain

nmcli コマンドの基本的な使い方

コマンドのヘルプ

コマンドのヘルプの参照の仕方は2通りあります。

helpサブコマンドを利用する方法

helpサブコマンドは、各階層で実行できます。
下の階層で実行することで、より具体的な情報を得ることができます。

nmcli help
nmcli device help
nmcli connection help
nmcli connection add help
...

nmcli connection add helpのCOMMON_OPTIONSの部分が簡潔で、慣れていない方にはおすすめできます。

bash-completionを利用する方法

nmcliの扱いに慣れてきたら、こちらの確認方法が手軽でオススメです。
bash-completion の機能を利用して、サブコマンドの一覧を手軽に確認できます。

nmcli connection add ipv4.  ## ここでTABキーを2回押す
# ipv4.addresses           ipv4.dns                 ipv4.may-fail
# ipv4.dad-timeout         ipv4.dns-options         ipv4.method
# ipv4.dhcp-client-id      ipv4.dns-priority        ipv4.never-default
# ipv4.dhcp-fqdn           ipv4.dns-search          ipv4.route-metric
# ipv4.dhcp-hostname       ipv4.gateway             ipv4.routes
# ipv4.dhcp-send-hostname  ipv4.ignore-auto-dns     ipv4.route-table
# ipv4.dhcp-timeout        ipv4.ignore-auto-routes

bash-completionとは、TABキーを押下することでサブコマンドの補完や、候補の列挙をしてくれるお助けツールです。
nmcliコマンド以外にも、system-ctlやyum/apt、manコマンドなど、さまざまなコマンド入力を助けてくれます。

RHEL8以降であれば、bash-completion-extrasは存在せず、bash-completionに統合されていると思います。
また、bash-completionは初めからインストールされています。
したがって、RHEL8以降であれば以下のコマンドの実行は不要です。

# RHEL7/CentOS7以前の場合 (epelリポジトリが必要です)
sudo yum install epel
sudo yum install bash-completion bash-completion-extras

# Ubuntu系の場合
sudo apt install bash-completion

man を参照する方法

nmcli の設定オプションについて、最も詳細な説明が参照できます。
特にconnection settingipv4 settingのセクションがおすすめです。

man nm-settings

設定確認

設定確認には、以下のコマンドが役に立ちます。

コマンド 説明
nmcli IPアドレスDNSサーバ、ルーティングなど要点をわかりやすく表示する
nmcli connection <connection_name> 特定connectionの設定を全て表示する

以下にコマンド実行サンプルを示します。

nmcli
# enp0s3: connected to enp0s3
#         "Red Hat Virtio network device"
#         ethernet (virtio_net), 08:00:27:39:51:3B, hw, mtu 1500
#         ip4 default
#         inet4 10.0.2.15/24
#         route4 0.0.0.0/0
#         route4 10.0.2.0/24
#         inet6 fe80::a6eb:bf5a:d727:ac6a/64
#         route6 ff00::/8
#         route6 fe80::/64
#         route6 fe80::/64
# 
# enp0s8: connected to enp0s8
# (後略)

nmcli connection show enp0s3
# connection.id:                          enp0s3
# (中略)
# IP4.ADDRESS[1]:                         10.0.2.15/24
# IP4.GATEWAY:                            10.0.2.2
# IP4.ROUTE[1]:                           dst = 0.0.0.0/0, nh = 10.0.2.2, mt = 100
# IP4.ROUTE[2]:                           dst = 10.0.2.0/24, nh = 0.0.0.0, mt = 10
# IP4.DNS[1]:                             8.8.8.8
# IP4.DNS[2]:                             8.8.4.4
# (後略)

設定の変更/反映

nmcliによるconnectionの設定変更は、設定変更→設定反映の流れが基本です。
connectionを作成した場合も反映が必要となります。

以下に例を示します。

ifnameなどのパラメータの意味は次の記事で説明します。
今の時点ではあまり気にしなくて結構です。

# nmcli add でConnectionの作成
nmcli connection add ifname enp0s3 con-name enp0s3 type ethernet autoconnect yes ipv4.method auto

# nmcli connection delete でConnectionの削除
nmcli connection delete enp0s3 

# nmcli connection modify で、作成済みConnectionの設定変更
nmcli connection add ifname enp0s3 con-name enp0s3 type ethernet
nmcli connection modify enp0s3 autoconnect yes
nmcli connection modify enp0s3 ipv4.method auto

# nmcli connection up で、設定反映 (Connectionの手動Upの意味もある)
nmcli connection up enp0s3

パラメータ単位で設定削除をする方法は、パラメータごとに書き方が若干異なります。
オプションによって表現方法が異なるのでややこしいですが、これも次の記事でカバーします。

# デフォルトゲートウェイの設定 / 削除コマンド
nmcli connection modify enp0s3 ipv4.gateway 10.0.0.1
nmcli connection modify enp0s3 ipv4.gateway 0.0.0.0

# DNS設定の設定 / 削除コマンド
nmcli connection modify enp0s3 ipv4.dns 8.8.8.8
nmcli connection modify enp0s3 +ipv4.dns 8.8.4.4
nmcli connection modify enp0s3 -ipv4.dns 8.8.8.8 -ipv4.dns 8.8.4.4

Connection をDeviceから紐付け解除する

メンテナンス時にConnection を一時的にDownさせることで、通信を遮断することも可能です。

# nmcli connection down で、Connection を Device から紐づけ解除する
nmcli connection down enp0s3

# nmcli connection up で、Connection を Device から再度紐付ける
nmcli connection up enp0s3

Connectionの設定を複製する

Connectionは、Deviceとは独立して存在できる設定オブジェクトであると冒頭で説明しました。
実はこの方式にはメリットがあります。

それは、Connectionをクローン機能で複製し、手軽にバックアップを取得できることです。

Connectionの複製は以下のように行います。

# nmcli connection clone <connection> <new_connection_name>
nmcli connection clone enp0s3 enp0s3_backup

上記コマンドでConnectionを複製したら、enp0s3で強気に設定変更を試せます。
もし設定がうまく行かなければ、以下の要領で設定復旧できます。

# バックアップしたConnectionをUpし、通信を復旧させる
nmcli connection up enp0s3_backup

# 不要設定を一旦削除し、cloneで作り直す
nmcli connection delete enp0s3
nmcli connection clone enp0s3_backup enp0s3
nmcli connection up enp0s3
nmcli connection delete enp0s3_backup

なお、nmcliにConnection名を後から変える機能はありません。
名前を変えたい場合は、nmcli connection cloneで新しい名前のConnectionを作ってから、古い名前のConnectionを削除する流れになると思います。

(参考) nmcli device modify

実は、nmcli device modifyでも設定変更が可能です。
しかし、あまり使いみちはありません。

nmcli device modifyで設定変更した場合は、設定が即時反映されます。
nmcli connection upで設定反映する必要はありません。

しかし、OSを再起動すると変更した設定は削除され、元に戻ってしまいます。
OS再起動後も設定が削除されないnmcli connectionとは挙動が異なります。

nmcli device modifyは一時的に設定変更を試すときに役に立ちそうなものです。
...が、nmcli connection cloneコマンドがあるのでやはり必要性を感じません。

(参考) Connection名は被っても良い?

混乱するのであまり推奨はしませんが、同じ名前のConnectionを複数作成することは可能です。
ConnectionはUUID (Universally Unique IDentifier) という絶対に被らない一意の文字列が自動で割り振られる仕組みになっており、UUIDで識別できます。
なので、名前が被っても問題ないのです。

ここで、tmpというconnectionを2つ作ってみます。
nmcli connection addで作っても良いのですが、ものぐさなのでcloneで作ります。

最後にnmcli connection showを実行していますが、これはnmcli connectionと同じ意味です。

nmcli connection clone enp0s3 tmp
# enp0s3 (5eae6951-aae0-4475-baaa-6e5222bf7e45) cloned as tmp (3bb117d7-df76-4945-87ce-26d9a38d29fd).

nmcli connection clone enp0s3 tmp
# enp0s3 (5eae6951-aae0-4475-baaa-6e5222bf7e45) cloned as tmp (a33fa9be-45e9-41a4-bad2-1334002f957e).

nmcli connection clone enp0s3 tmp
# enp0s3 (5eae6951-aae0-4475-baaa-6e5222bf7e45) cloned as tmp (323e22c1-1256-488e-abd6-88aa6827c3c5).

nmcli connection show

# NAME          UUID                                  TYPE      DEVICE 
# enp0s3        5eae6951-aae0-4475-baaa-6e5222bf7e45  ethernet  enp0s3
# tmp           3bb117d7-df76-4945-87ce-26d9a38d29fd  ethernet  --  
# tmp           a33fa9be-45e9-41a4-bad2-1334002f957e  ethernet  --  
# tmp           323e22c1-1256-488e-abd6-88aa6827c3c5  ethernet  --  

nmcliにおいては、Connection名の代わりにUUIDを指定することでも対象を指定できます。
同じ名前のConnectionが複数ある場合には、基本的にはこのUUIDを使うことになります。

ためしにtmpを1つ削除します。

nmcli connection delete 323e22c1-1256-488e-abd6-88aa6827c3c5
# Connection 'tmp' (323e22c1-1256-488e-abd6-88aa6827c3c5) successfully deleted.

nmcli connection
# NAME          UUID                                  TYPE      DEVICE 
# enp0s3        5eae6951-aae0-4475-baaa-6e5222bf7e45  ethernet  enp0s3
# tmp           3bb117d7-df76-4945-87ce-26d9a38d29fd  ethernet  --  
# tmp           a33fa9be-45e9-41a4-bad2-1334002f957e  ethernet  --  

ここで更に、tmpという名前を指定して削除してみます。
Connectionを特定できないのでエラーになると思いきや、両方のConnectionが削除されます。
怖いですね。

nmcli connection delete tmp
# Connection 'tmp' (3bb117d7-df76-4945-87ce-26d9a38d29fd) successfully deleted.
# Connection 'tmp' (a33fa9be-45e9-41a4-bad2-1334002f957e) successfully deleted.

nmcli connection
# NAME          UUID                                  TYPE      DEVICE 
# enp0s3        5eae6951-aae0-4475-baaa-6e5222bf7e45  ethernet  enp0s3

Connection名を被らせることは技術的には可能ですが、運用上の事故に繋がりかねないので可能な限り避けるようにしましょう。

最後に余談ですが、LANG=ja_JP.UTF-8のような日本語環境でConnection名が2バイト文字表記になってしまった時、nmcli connection delete <UUID>で削除する時にもUUIDは活躍します。

省略表現

nmcliは、ネットワーク機器のCLIのように省略表現が可能です。

サブコマンドの文字列を途中まで打ち、後は一意に補完できるような状況になったらそのまま実行できます。

Cisco機器で言えば、show running-config の代わりに show run でも良いのと同じことです。

以下にサンプルを示します。

# nmcli device
nmcli d

# nmcli connection
nmcli c

# nmcli connection modify enp0s3 autoconnect yes
# autoconnectのような Connection のオプションは省略表記できませんでした。TAB補完しましょう。
nmcli con mod enp0s3 autoconnect y

覚えておきたいコマンド

最後に、よく使うコマンドを列挙します。

これらのコマンドをひたすら何度も打っていれば、nmcliの使い方などすぐに慣れてしまうでしょう。

  • nmcli
    • ネットワークステータス、設定をざっくり確認
  • nmcli connection show インターフェース名
    • Connection単位で、ネットワーク設定を詳細に確認
  • nmcli device
    • Deviceの一覧表示
  • nmcli connection
    • Connectionの一覧表示
  • nmcli connection add <connection> <options...>
    • Connectionの作成
  • nmcli connection delete <connection>
    • Connectionの削除
  • nmcli connection modify <connection> <options...>
    • Connectionの設定変更
  • nmcli connection up <connection>
    • Connectionの設定反映
    • Deviceとの手動紐づけ
  • nmcli connection down <connection>
    • Connectionの手動紐づけ解除 (インターフェース無効化として使える)
    • autoconnect yes設定でも、OS再起動か手動upさせるまで上がってこない
  • nmcli connection clone <connection> <new_connection_name>

(参考) nmtui

概要

nmcliと等価な機能を持つコマンドです。
Network Managerサービスを介して、Linuxのネットワーク設定を変更します。

予備知識が一切なくても直感的に操作できることが唯一の長所ですが、基本的にはnmtuiではなくnmcliを使うことをおすすめします。
理由は以下のとおりです。

  • 慣れればnmcliの方が早いし楽
  • nmcliはシェルスクリプト化できる
  • nmtuiは設定反映の操作が少し怖い (次のセクションで触れます)

nmtuiの使い方

nmtuiと1行でコマンドを実行すると、TUI (Text User Interface) の対話画面が現れます。
CLI環境でも実行可能です。
十字キーで項目を選択し、Enterキーで決定、Escキーでメニューを抜けるという、直観的な操作が可能です。
設定の選択肢が見えているので、Network Managerの設定変更に慣れていない方には良いかもしれません。

f:id:stopendy:20180726230758p:plain

nmtuiの設定変更も、nmcli connection modifyと同様に即時反映ではありません。
コネクションのactivationを手動で行う必要があります。

nmtui上でもこの操作は可能ですが、コネクションがアクティブな状態では「Deactivate」ボタンしか表れません。
下記の画面で、Enterキーを「タタン」と素早く2回押せば、Deactivate > Activateされます。
nmcli connection upを実行するよりも通信影響が大きくなりそうなので、実運用で使えないと思います。

f:id:stopendy:20180726231031p:plain

もしnmtuiを実運用で使うなら、設定反映だけはnmcli connection up <connection> で実施するのが良いかと思います。

(参考) ipコマンド

nmcliとほぼ同等の役割を持つコマンドとして、ipコマンドもあります。

ipコマンドもIPアドレスやルーティングの設定を実装できます。
nmcli との違いは、私の知る限り主に以下の2点です。

  • 設定ファイルに反映されないためOS再起動後に設定が消える
  • nmcli では実装できない機能を一部持っている

上記の namespacemacvlan のような特殊な要件でもない限り、ipコマンドの設定変更のやり方を覚える必要性は薄いと思います。
しかし、ip routeコマンドだけは、覚えておいて損はないでしょう。
ip routeコマンドにより、nmcliよりもわかりやすくルーティングテーブルを表示できます。

ip route
# 172.16.0.0/24 dev enp0s8 proto kernel scope link src 172.16.0.10
# 172.16.2.0/24 dev enp0s9 proto kernel scope link src 172.16.2.10

まとめ

本記事では、nmcliの基本的な使い方について紹介しました。

次の記事

nmcliの基本的なオプション、IPアドレスデフォルトゲートウェイの追加/削除など、nmcliの具体的なコマンドサンプルを紹介します。

endy-tech.hatenablog.jp