えんでぃの技術ブログ

えんでぃの技術ブログ

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

nmcliコマンドの基礎

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

更新履歴

  • 2020/9/27:RHEL7のURLをRHEL8のURLに置き換え。一部文言を変更
  • 2018/9/8:初回投稿

本記事で紹介すること

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 3. 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 は特にオススメです。
Ethernet, Dot1Q, VXLAN のように、設定パターンに応じて指定すべきパラメータを教えてくれます。

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コマンドなど、さまざまなコマンド入力を助けてくれます。
下記コマンドで導入できますので、ぜひインストールしてみてください。

世界が変わります。

# RHEL/CentOS系の場合 (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コマンドを単純に実行することです。
コマンドも簡単ですし、必要な情報のみが端的に表示されます。

Connectionに適用した設定を確認したいときは、nmcli connection show コネクション名 を使います。
Connectionの設定がすべて表示されますので、確認やデバッグに使えます。

※ここでは、「設定」、「ステータス」という用語を以下のように定義します  ・設定: ユーザーが指定したオプション値 (Configured Value)
 ・ステータス: 実際に動作する際の値 (Operational Value)

最後に、あまり使う機会はないかもしれませんが、Device単位での設定を確認することもできます。
nmcli device show コマンドです。
Dot1Q Taggingを利用しているケースなど、1つのDeviceに対して複数の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 device show
# GENERAL.DEVICE:                         enp0s3
# GENERAL.TYPE:                           ethernet
# GENERAL.HWADDR:                         08:00:27:39:51:3B
# GENERAL.MTU:                            1500
# GENERAL.STATE:                          100 (connected)
# GENERAL.CONNECTION:                     enp0s3
# GENERAL.CON-PATH:                       # /org/freedesktop/NetworkManager/ActiveCo
# WIRED-PROPERTIES.CARRIER:               on
# 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
# IP6.ADDRESS[1]:                         fe80::a6eb:bf5a:d727:ac6a/64
# IP6.GATEWAY:                            --
# IP6.ROUTE[1]:                           dst = ff00::/8, nh = ::, mt = 256, # table
# IP6.ROUTE[2]:                           dst = fe80::/64, nh = ::, mt = 256
# IP6.ROUTE[3]:                           dst = fe80::/64, nh = ::, mt = 100
# 
# GENERAL.DEVICE:                         enp0s8
# (後略)

設定変更 / 設定削除 / 設定反映

基本的には設定変更 > 設定反映の流れで実施します。

まず設定変更ですが、これはConnectionの作成、または変更によって実施します。
以下がコマンドのサンプルです。

ここではIPアドレスDHCPに設定し、ネットワークサービス起動時に自動的に設定が適用されるように設定しています。

各オプションの詳しい説明は後述します。

# nmcli connection add で作成します
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 # Connectionの自動接続有効化
nmcli connection modify enp0s3 ipv4.method auto # DHCP有効化

# nmcli connection up で、設定反映します
nmcli connection up enp0s3

パラメータ単位で設定削除をする方法は、パラメータごとに書き方が若干異なります。
この内容は、別記事で紹介するケース別のnmcli設定コマンド例でも触れたいと思います。

# デフォルトゲートウェイの設定 / 削除コマンド
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

(参考) nmcli device modify なんてものもあります

実は、nmcli device modifyコマンドでも設定変更が可能です。
nmcli device modifyで設定変更した場合は、設定が即時反映されます。
nmcli connection up のような設定反映コマンドは不要です。

しかし、OSを再起動すると変更した設定は削除され、元に戻ってしまいます。
CentOS6系のイメージですと、nmcli device modify は、ifconfigやrouteコマンドで設定を変えるイメージに近いですね。
一方で、nmcli connectionは、設定ファイルを書き換えるイメージに近いです。

nmcli device modifyは、ネットワーク設定の検証などに利用できそうです。
サービス提供中のサーバにおいては使わないと思います。

頭の片隅に置いておくと、そのうち役に立つかもしれません。

省略表現

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の作成
  • nmcli connection delete Connection名
    • Connectionの削除
  • nmcli connection modify Connection名
    • Connectionの設定変更
  • nmcli connection up Connection名
    • Connectionの設定反映
    • Deviceとの手動紐づけ
  • nmcli connection down Connection名
    • Connectionの手動紐づけ解除 (インターフェース無効化として使える)
    • autoconnect yes設定でも、OS再起動か手動upさせるまで上がってこない

(参考) nmtui

概要

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

nmtuiは、恐らくnmcliよりも初心者に優しい作りをしています。

個人的には、nmcliを覚えることをオススメします。
慣れれば早く設定できるようになるためです。

小技ですが、Connection名が2バイト文字 (日本語など) で設定されてしまい、CLI環境ではConnectionを削除することすら困難なケースで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回押せば、Activate > Deactivateされます。
でも、サービス影響を抑えたい実運用ではこんなことできませんよね。

f:id:stopendy:20180726231031p:plain

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

RHEL7の公式ドキュメントにnmtuiの概要が載っていますので、参考情報として貼っておきます。

公式サイト

(参考) ipコマンド

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

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

  • 設定ファイルに反映されないためOS再起動後に設定が消える
    • ipコマンドは一時的なテストに便利
    • ipコマンドをOS再起動後も反映する場合は、OS起動後にipコマンドを自動実行するような工夫が必要
  • 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

公式サイト

RHEL7 ネットワークガイド - IP コマンドを使用したIPネットワークの設定

まとめ

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

次の記事

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

endy-tech.hatenablog.jp