犬でも分かるLinuxネットワーク設定(1): nmcliコマンドの使い方

サーバのネットワーク設定、すなわちnmcliコマンドは、Linuxエンジニアの基本中の基本でしょっちょうやるのだけれど、頭で覚えてられないので、メモついでに書くことにしました。初心者の方にも分かり易い内容にしたいと思います。

RedHat系OSのネットワーク設定はnmcliコマンドを使う

nmcliはNetworkManagerのCLI(コマンドインターフェース)です。RedHat系OSでは、サーバのネットワーク管理にNetworkManagerを使っています。OSバージョン8までは、nmcliコマンドで設定した結果は、/etc/sysconfig/network-scripts/ifcfg-*ファイルに記録されていましたが、バージョン9からは、/etc/NetworkManager/system-connections/ 配下の *.nmconnection ファイルに記録されるようになりました。

でも、安心してください。nmcliコマンドの仕様は変わっていません。nmcliコマンドを使えば、上記の設定ファイルをきちんと作成・修正してくれます。

デバイスとコネクション

Linuxサーバが起動すると、実装されているNIC(ネットワークインターフェースカード)を自動認識してくれてデバイスという形で参照することができます。現在ではNICは多くの場合、MB(マザーボード)に標準実装されていますし、オプションカードで実装する場合でも複数のポートを持っていることが多いです。NICはカードというよりは、LANポートに対応していると思って下さい。1つのLANポートに対して1つのネットワーグデバイスが対応しています。

ネットワークデバイスを確認する

利用可能なネットワークデバイスを一覧表示するには、以下のコマンドを使います。

# nmcli device status
DEVICE         TYPE      STATE                                  CONNECTION
enp0s21f0u2c2  ethernet  connected                            enp0s21f0u2c2
enp2s0         ethernet  connecting (getting IP configuration)  enp2s0
enp3s0         ethernet  connecting (getting IP configuration)  enp3s0
lo             loopback  connected (externally)                 lo
wlp1s0         wifi      unmanaged                              --

device と status はそれぞれ d と s に省略できるので省略形は「nmcli d s」です。

この状態は、Rocky9のインストーラでUSB-LANのインターフェースに固定のIPアドレスを割り当てた状態(かつネットワークが接続された状態)なので、USB-LANのデバイス enp0s21f0u2c2 だけが connected になっています。このサーバ(ミニPC)には、2つのLANポートがありますがそれぞれに対応するデバイスenp2s0とenp3s0は、IPアドレスを割り当てしていません。ちなみに、loはloopback用のものなのでハードウェアデバイスではありません。

コネクションを確認する

ネットワークデバイスがハードウェア(仮想化デバイスもあるので実際にはハードウェアだけではない)としてのネットワークデバイスであるのに対して、コネクションは論理的なインターフェースです。IPアドレスのような情報はコネクションが持ち、ネットワークデバイスとコネクションを紐付けて管理します。

コネクションを一覧表示するには、以下のコマンドを使います。

# nmcli connection show
NAME           UUID                      TYPE      DEVICE
enp0s21f0u2c2  72aa0063-4141-36b2-b94b-57ff4dc3b468  ethernet  enp0s21f0u2c2
enp2s0         ae3155d0-19ad-3563-8bd1-27768ced846f  ethernet  enp2s0
enp3s0         aca86ed1-bb04-386c-ac7c-43cf14593091  ethernet  enp3s0
lo             67e756da-52e7-444b-80c4-76a2459d8df0  loopback  lo

connection と show はそれぞれ c と s に省略できるので省略形は「nmcli c s」です。実のところ、nmcliコマンドがオプションを識別できれば問題ないので、connectionはcoでもconでも良く、showはshでもshoでも良いです。

NAME列に表示されているのがconnection名で、DEVICE列に表示されているのが対応しているネットワークデバイス名です。この状態で、/etc/NetworkManager/system-connections/ 配下には、以下のファイルが存在しています。

# ls -l /etc/NetworkManager/system-connections
total 12
-rw-------. 1 root root 319 Dec  7 16:37 enp0s21f0u2c2.nmconnection
-rw-------. 1 root root 208 Dec  7 15:42 enp2s0.nmconnection
-rw-------. 1 root root 208 Dec  7 15:42 enp3s0.nmconnection

このサーバ(ホスト名はbase0)におけるネットワークデバイスとコネクションの状態を図示すると以下のようになります。

ウチの環境では、192.168.1.0/24のホームネットワークがあって、更に個別にネットワークSWを購入して、192.168.2.0/24の管理ネットワークを構成しています。USB-LANのデバイスには、インストール時に固定のIPアドレス 192.168.1.200を割り当てましたが、2つのLANポートのほうにはIPアドレスを割り当てていない状態です。

この状態で、IPアドレスを確認してみます。ip address コマンドを実行します(省略形は ip aです)。

# ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 84:47:09:18:c5:4f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8647:9ff:fe18:c54f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 84:47:09:18:c5:3b brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8647:9ff:fe18:c53b/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
4: enp0s21f0u2c2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 20:7b:d2:21:d5:89 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.200/24 brd 192.168.1.255 scope global noprefixroute enp0s21f0u2c2
       valid_lft forever preferred_lft forever
5: wlp1s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 34:6f:24:24:83:ad brd ff:ff:ff:ff:ff:ff

state がUPのものは有効化されているコネクションです。enp0s21f0u2c2だけがIPアドレスを持っている状態です。

コネクションの作成と修正

LANポートであるデバイスにネットワーク設定をしたい、具体的には固定のIPアドレスを割り当てたい、というときには、デバイスに紐付くコネクションを作成し、そのコネクションに対して設定を行う、といった操作が必要になります。

今回の例では、デバイス enp2s0, enp3s0 に対応するコネクションを作成するところから解説したいのですが、インストール時にネットワークSWと接続していたので、コネクションが勝手に作成されていました。邪魔なので、いったん削除しちゃいます。なぜなら、コネクションが存在する状態で、同じデバイスに対してコネクションを新規に作成すると、古いコネクションがゴミとして残ってしまって気持ち悪いからです。。。

コネクションの削除

コネクションを削除する前に、コネクションを必ずDOWN(無効化)させて下さい。そうしないとうまく削除できません。
以下のコマンドは、コネクション enp2s0 をDOWNさせてから、削除を行っています。

# nmcli connection down enp2s0
Connection 'enp2s0' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/55)
# nmcli connection delete enp2s0
Connection 'enp2s0' (ae3155d0-19ad-3563-8bd1-27768ced846f) successfully deleted.

同じように、コネクション enp3s0 もDOWNさせてから、削除を行います。
enp2s0 と enp3s0 の削除に成功すると、/etc/NetwowkManager/system-connections/ 配下から
enp2s0.nmconnection と enp3s0.nmconnection が削除されているとが確認できます。

# ls -l /etc/NetworkManager/system-connections
total 4
-rw-------. 1 root root 319 Dec  7 16:37 enp0s21f0u2c2.nmconnection

delete は長いので、私は del と省略して使うことが多いです。

コネクションを作成して固定のIPアドレスを割り当てる

デバイス enp2s0 をネットワークに接続できるように固定のIPアドレス(IPv4) 192.168.2.200/24 を割り当ててみましょう。コネクションは削除したので、ethernetタイプのコネクションを作成するところから始めます。nmcli connection add で新規にコネクションを作成し、nmcli connection modify でIPアドレス等の設定を行います。

# nmcli connection add type ethernet con-name enp2s0 ifname enp2s0 ★1
Connection 'enp2s0' (fa3cffcf-7e07-48a3-93e6-3bd18fc33380) successfully added.

# nmcli connection modify enp2s0 ipv4.addresses 192.168.2.200/24 ★2
# nmcli connection modify enp2s0 ipv4.method manual ★3
# nmcli connection modify enp2s0 connection.autoconnect yes ★4
# nmcli connection modify enp2s0 ipv6.method ignore ★5
# nmcli connection up enp2s0 ★6
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/58)

★1: ethernetタイプを指定してコネクションを作成。コネクション名(con-name)はenp2s0としてデバイス(ifname)に紐づける
★2: IPアドレス 192.168.2.200/24 を割り当てる(/24はネットワークマスク長)
★3: 静的なIPアドレス割り当て(manual)を行う
★4: システム起動時に自動的に接続する
★5: IPv6を無効化(ignore)する
★6: enp2s0のコネクションを有効化(up)すると同時に、/etc/NetworkManager/system-connections/enp2s0.nmconnection ファイルを作成する。

尚、ここでは IPv6を無効化するのに ignore を指定していますが、ローカルリンクIPv6アドレスは引き続き利用可能(ローカル通信は可能)です。ignoreの代わりに disabled を指定すると、IPv6スタックを完全に無効化し、ローカルリンクIPv6アドレスも含めてIPv6通信を遮断します。通常は、ignoreを指定すれば十分らしいです。

modifyは長いので、私は mod と省略して使うことが多いです。

デフォルトゲートウェイやDNSサーバの指定はどうする

デフォルトゲートウェイやDNSサーバの指定もnmcli connection modify を使います。enp2s0はルータにつながっていないので、デフォルトゲートウェイとDNSサーバを指定するなら、ホームネットワークにつながっているLANポート enp0s21f0u2c2 のほうですね。デフォルトゲートウェイとDNSサーバを指定するのは、同一ホストのLANポートの中で1つだけです。
enp0s21f0u2c2 はインストーラの中でデフォルトゲートウェイとDNSサーバのIPアドレスを指定してしまいましたが、もし nmcli connection modify で設定するなら以下の通りとなります。

# nmcli connection modify enp0s21f0u2c2 ipv4.gateway 192.168.1.1 ★1
# nmcli connection modify enp0s21f0u2c2 ipv4.dns 192.168.1.1 ★2
# nmcli connection up enp0s21f0u2c2 ★3

★1: デフォルトゲートウェイとなるルータまたはサーバのIPアドレスを指定します。ウチの場合は、ホームルータのIPアドレスを指定しています。
★2: DNSサーバのIPアドレスを指定します。ウチの場合は、ホームルータがDNSサーバの機能を持っているので、ホームルータのIPアドレスを指定しています。
★3: 設定を反映すると同時に enp0s21f0u2c2.nmconnection ファイルを更新します。

DNSサーバを指定する場合、プライマリサーバとセカンダリサーバを指定するケースも多いです。例えば、ホームルータ 192.168.1.1 のDNS機能がダウンした場合に、Google Public DNS(8.8.8.8)にアクセスするようにしたいのであれば、上記の2番目の設定は以下のようになります。

# nmcli connection modify enp0s21f0u2c2 ipv4.dns “192.168.1.1 8.8.8.8”

DHCPでIPアドレスを指定するように設定するにはどうする

静的なIPアドレス割り当てではなく、DHCPサーバからIPアドレスを動的に割り当てるようにするにはどうしたら良いでしょうか。この場合も nmcli connection modify を使います。以下は、enp2s0に動的なIPアドレス(IPv4)を割り当てるための設定です。

# nmcli connection modify enp2s0 ipv4.method auto ★1
# nmcli connection modify enp2s0 connection.autoconnect yes ★2
# nmcli connection modify enp2s0 ipv6.method ignore ★3
# nmcli connection up enp2s0 ★
4

★1: 動的なIPアドレス割り当て(auto)を行う
★2: システム起動時に自動的に接続する
★3: IPv6を無効化(ignore)する
★4: 設定を反映すると同時に enp2s0.nmconnection ファイルを更新する

ホスト名の設定

hostname コマンドを実行したときに返ってくるホスト名を設定するにはどうしたら良いでしょうか。これは nmcliコマンドではなく、hostnamectl コマンドを使います。こちらもいつも忘れちゃうので、メモとして書いておきます。以下は、ホスト名に base0 という名前を付ける例です。

# hostnamectl set-hostname base0

広告主へのリンク

オイラが今回のテストに使っているのは、高価なサーバではなくて、安価なミニPC MINISFORUM GK41 というマシンです。LANポートが2つ付いているので、PXEブートのテストにも便利です。


更に、このMINISFORUM GK41のUSBポートに以下のUSB-LAN変換アダプタを付けて、LANポートを合計3つにして運用しています。




このブログにおける関連リンク

犬でも分かるLinuxネットワーク
犬でも分かるLinuxネットワーク設定(1): nmcliコマンドの使い方
犬でも分かるLinuxネットワーク設定(2): ボンディング(bonding)
犬でも分かるLinuxネットワーク設定(3): 仮想ブリッジ
犬でも分かるLinuxネットワーク設定(4): ボンディング+仮想ブリッジ
犬でも分かるLinuxネットワーク設定(5):定義ファイルの修正
犬でも分かるLinuxネットワーク設定(6): ルーティングとNAT
犬でも分かるLinuxネットワーク設定(7):firewalldによるアクセス制限
犬でも分かるLinuxネットワーク設定(8):VLAN
犬でも分かるLinuxネットワーク設定(9):IPエイリアス
犬でも分かるLinuxネットワーク設定(10):outboundのアクセス制限
犬でも分かるLinuxネットワーク設定(11):NATポリシーにアクセス制限を設定する

MINISFORUM GK41 ミニPC を買ってみた

コメント

タイトルとURLをコピーしました