本記事で紹介すること
nmcliコマンドの基本的な使い方を紹介します。
nmcliコマンドによるIPアドレス設定、ゲートウェイ設定、DNSクライアント設定などの応用的なコマンド例については、以下の記事で紹介します。
ipコマンドについては、本記事の後半で概要のみ紹介します。
- 本記事で紹介すること
- nmcliの概要
- DeviceとConnection
- nmcli コマンドの基本的な使い方
- 省略表現
- 覚えておきたいコマンド
- (参考) nmtui
- (参考) ipコマンド
- まとめ
- 次の記事
nmcliの概要
RHEL6 / CentOS6でのネットワーク設定は、以下の流れで行われていました。
- 設定ファイルの編集
- networkサービスの再起動で設定反映
しかし、RHEL7 / CentOS7以降ではトレンドが変わり、Network Managerよる設定変更手順が公式手順としてマニュアルに掲載されるようになりました。
言い換えると、原則としてNetworkManagerを使うのが推奨であるということです。
RHEL8 - ネットワークの設定及び管理 - 2. イーサネット接続の設定
したがって、本記事においてもNetwork Managerによるネットワーク設定手順を紹介します。
NetworkManagerにはいくつかの設定管理の方法がありますが、今回はCLIツールであるnmcli
(NetworkManager CLI) を紹介します。
nmcli
には以下の利点があります。
(参考) NetworkManager関連ツール
NetworkManagerを介してネットワーク設定変更をするツールは、nmcli
以外にもいくつかあります。
主なツールを下表にまとめておきます。
ツール名 | 形式 | 特徴 |
---|---|---|
nmcli |
CLI (Command Line Interface) |
|
nmtui |
TUI (Table User Interface) |
|
nmstatectl |
CLI (Command Line Interface) |
|
他にも、GNOME Desktopなどに付属するnm-connection-editor
などのGUI (Graphical User Interface) 形式のツールもあります。
DeviceとConnection
Network Managerの仕組みのなかで、少々ややこしいのが、このDeviceとConnectionの概念です。
この仕組みを一言で言うと、「物理インターフェース (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に紐づけて設定反映することで効果を発揮します。
全体像を図で表すと、以下のようになります。
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を参照する方法
man nm-settings
がnmcli
の最も詳細な説明です。
manが長くて読むのが大変ですが、慣れれば/
によるキーワード検索を駆使して効率よく情報を調べることができるようになります。
特にconnection setting
やipv4 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設定でも、NetworkManager再起動か手動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の設定変更に慣れていない方には良いかもしれません。
nmtuiの設定変更も、nmcli connection modifyと同様に即時反映ではありません。
コネクションのactivationを手動で行う必要があります。
nmtui上でもこの操作は可能ですが、コネクションがアクティブな状態では「Deactivate」ボタンしか表れません。
下記の画面で、Enterキーを「タタン」と素早く2回押せば、Deactivate > Activateされます。
nmcli connection up
を実行するよりも通信影響が大きくなりそうなので、実運用で使えないと思います。
もしnmtuiを実運用で使うなら、設定反映だけはnmcli connection up <connection>
で実施するのが良いかと思います。
(参考) ipコマンド
nmcliとほぼ同等の役割を持つコマンドとして、ipコマンドもあります。
ipコマンドもIPアドレスやルーティングの設定を実装できます。
nmcli との違いは、私の知る限り主に以下の2点です。
- 設定ファイルに反映されないためOS再起動後に設定が消える
- nmcli では実装できない機能を一部持っている
- bridgeやmacvlanなど、nmcliに対応していない論理インターフェースを作成する (man ip-link)
- Linux kernelの機能であるnetwork namespaceにアクセスし、ネットワークスタック (NIC、ARPキャッシュ、ルーティングテーブル、firewalld、Network関連のカーネルパラメータ、他) を論理分割する (man ip-netns)
上記の namespace
や macvlan
のような特殊な要件でもない限り、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の具体的なコマンドサンプルを紹介します。