RHEL 中級 #4 ネットワーキング — NetworkManager (nmcli)、bonding、teaming

基礎 #2 のセットアップ時に少しだけ出会ったネットワーク画面を本格的に解いていきます。RHEL 9 のネットワークは NetworkManager 1 つに整理され、この記事ではその設定を実際の運用でどう扱うかを見ていきます。

RHEL 中級 シリーズでこの記事の位置:

NetworkManager がなぜ標準になったか #

昔の RHEL はネットワーク設定を /etc/sysconfig/network-scripts/ifcfg-* ファイルに書き、service network restart で適用しました。単純な役割はうまく動作しましたが、無線・VPN・動的 IP・複数インターフェイスの同時処理には弱かったです。

NetworkManager はこのすべてを 1 つのデーモンに統合したツールです。デスクトップ・サーバー・ノート PC・コンテナすべてで同じモデルで動作し、変更は即座に反映され (restart 不要)、バックエンド (D-Bus) とクライアントツール (nmcli / nmtui / GUI) が多様で自動化も簡単です。

NetworkManager の形
   ユーザーツール: nmcli (CLI)   nmtui (TUI)   GNOME (GUI)   D-Bus
                     │             │              │            │
                     └─────────────┴──────┬───────┴────────────┘
                              ┌────────────────────┐
                              │  NetworkManager    │   ← デーモン
                              │     (NM)           │
                              └─────────┬──────────┘
                  ┌─────────────────────┼─────────────────────┐
                  ▼                     ▼                     ▼
              [Device]              [Connection]         [Routing/DNS]
              実際の NIC            設定プロファイル      /etc/resolv.conf
              (enp0s1...)           (Wired-1, vpn-...)    /etc/hosts

要となる 2 つの概念:

  • Device (装置) — 実際の NIC。enp0s1wlan0 のような名前。
  • Connection (接続) — Device に適用する 設定プロファイル。1 つの Device に複数の connection を作っておき、状況に応じて選んでアクティベート可能。

この 2 つを分けて見るのが NetworkManager のコアモデルです。「今この NIC にどの設定が適用されているか」を常に意識する必要があります。

nmcli — 日常コマンド群 #

nmcli (NetworkManager CLI) がほぼすべての作業の出発点です。3 つのオブジェクト (general / device / connection) にコマンドを付ける形です。

現在の状態を一目で
$ nmcli
enp0s1: connected to Wired connection 1
        "Virtio Network Device"
        ethernet (virtio_net), 52:54:00:..., hw, mtu 1500
        ip4 default
        inet4 192.168.64.15/24
        route4 default via 192.168.64.1 metric 100
        inet6 fe80::.../64
        route6 fe80::/64 metric 256

lo: unmanaged

DNS configuration:
        servers: 192.168.64.1
        interfaces: enp0s1

nmcli だけ叩けばすべての情報が 1 画面に出ます。運用で初めてマシンに入って「ネットワークがどんな状態か」を見るとき最もよく叩きます。

Device を見る #

device コマンド群
$ nmcli device status
DEVICE  TYPE      STATE      CONNECTION
enp0s1  ethernet  connected  Wired connection 1
lo      loopback  unmanaged  --

$ nmcli device show enp0s1     # 1 つの device の詳細
GENERAL.DEVICE:                         enp0s1
GENERAL.TYPE:                           ethernet
GENERAL.HWADDR:                         52:54:00:...
GENERAL.MTU:                            1500
GENERAL.STATE:                          100 (connected)
...
IP4.ADDRESS[1]:                         192.168.64.15/24
IP4.GATEWAY:                            192.168.64.1
IP4.DNS[1]:                             192.168.64.1

Connection を見る #

connection コマンド群
$ nmcli connection show
NAME                 UUID                   TYPE      DEVICE
Wired connection 1   a1b2c3d4-...           ethernet  enp0s1
my-static            d4e5f6a7-...           ethernet  --

$ nmcli connection show "Wired connection 1"   # 1 つの connection の詳細
connection.id:                          Wired connection 1
connection.uuid:                        a1b2c3d4-...
connection.type:                        ethernet
ipv4.method:                            auto
ipv4.dns:                               --
...

DEVICE カラムが空の connection (my-static) は作っただけでアクティベートしていないプロファイルです。

静的 IP 設定 — 最もよく出会う作業 #

DHCP ではなく固定 IP を使いたいとき。

新しい connection を作る #

静的 IP プロファイル生成
$ sudo nmcli connection add \
    type ethernet \
    con-name "static-enp0s1" \
    ifname enp0s1 \
    ipv4.method manual \
    ipv4.addresses 192.168.64.50/24 \
    ipv4.gateway 192.168.64.1 \
    ipv4.dns "192.168.64.1 8.8.8.8" \
    autoconnect yes

オプションの読み方:

  • con-name — 人が認識する connection 名
  • ifname — 適用する device 名
  • ipv4.method manual — 固定 IP (DHCP は auto)
  • ipv4.addresses — IP/prefix 形式
  • ipv4.gateway — デフォルトゲートウェイ
  • ipv4.dns — DNS サーバー (空白で複数)
  • autoconnect yes — 起動時自動アクティベーション

既存 connection の修正 #

既存 connection の値を変える
$ sudo nmcli connection modify "static-enp0s1" \
    ipv4.addresses 192.168.64.51/24

$ sudo nmcli connection up "static-enp0s1"     # 再アクティベートしないと反映されない

modify だけでは即座に反映されません。up で再アクティベート するか device を再接続する必要があります。

Connection 切り替え #

別の connection に切り替え
$ sudo nmcli connection up "static-enp0s1"
$ sudo nmcli connection down "Wired connection 1"

同じ device に 2 つの connection があっても一度に 1 つだけアクティベートされます。よく移動する環境 (ノート PC のオフィス/家/カフェのプロファイル) に有用です。

削除 #

connection 削除
$ sudo nmcli connection delete "static-enp0s1"

nmtui — TUI ツール #

nmcli に慣れる前は nmtui (NetworkManager Text User Interface) が素早く道筋を掴ませてくれます。

実行
$ sudo nmtui

矢印キーでメニュー移動、静的 IP / DNS / ゲートウェイをフォームに入力する形。運用マシンに SSH で入って素早く 1 行掴みたいときによく使います。

/etc/resolv.conf — DNS は NetworkManager が管理 #

昔は /etc/resolv.conf を直接編集しましたが、今は NetworkManager が自動で管理します。直接編集すると次の connection 変更時に上書きされます。

DNS 設定は connection の属性として:

DNS 追加 / 変更
$ sudo nmcli connection modify "static-enp0s1" \
    ipv4.dns "1.1.1.1 8.8.8.8" \
    ipv4.dns-search "example.com"

$ sudo nmcli connection up "static-enp0s1"

DHCP が与える DNS を無視して自分の DNS を使うには:

DHCP DNS を無視
$ sudo nmcli connection modify "Wired connection 1" \
    ipv4.ignore-auto-dns yes \
    ipv4.dns "1.1.1.1 8.8.8.8"

Bonding — 2 つの NIC を 1 塊に #

物理 NIC が 2 枚あるとき、2 つを束ねて 障害対策 または 帯域幅の合算 効果を得るのが bonding です。障害対策が最もよくある役割です。

bonding の形
   eth0 ─┐
         ├── bond0 ── 192.168.64.50
   eth1 ─┘
         (1 つの NIC が死んでも別の NIC が受ける)

モード #

mode名前用途
0balance-rrラウンドロビン (スイッチサポート必要)
1active-backup1 つの NIC アクティブ、残りは待機 — 最もよくある
2balance-xorXOR ハッシュ分散
3broadcastすべての NIC に同じパケット
4802.3ad / LACP標準のリンクアグリゲーション — スイッチサポート必要
5balance-tlb送信のみ分散
6balance-alb送受信両方分散

運用の 99% は mode 1 (active-backup) または mode 4 (LACP)。単純な障害対策は 1、帯域幅合算が必要でスイッチが LACP をサポートするなら 4。

bond を作る #

active-backup bond
# 1. bond インターフェイス (master) 生成
$ sudo nmcli connection add \
    type bond \
    con-name bond0 \
    ifname bond0 \
    mode active-backup \
    miimon 100 \
    ipv4.method manual \
    ipv4.addresses 192.168.64.50/24 \
    ipv4.gateway 192.168.64.1 \
    ipv4.dns 192.168.64.1

# 2. slave 2 つを bond に付ける
$ sudo nmcli connection add \
    type ethernet \
    con-name bond0-slave1 \
    ifname enp0s1 \
    master bond0

$ sudo nmcli connection add \
    type ethernet \
    con-name bond0-slave2 \
    ifname enp0s2 \
    master bond0

# 3. アクティベート
$ sudo nmcli connection up bond0-slave1
$ sudo nmcli connection up bond0-slave2
$ sudo nmcli connection up bond0

miimon 100リンク監視周期 (ms)。100ms ごとに NIC の状態を確認して切れた NIC を自動で外します。

bond 状態確認 #

bond 状態
$ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v...
Bonding Mode: fault-tolerance (active-backup)
Currently Active Slave: enp0s1
MII Status: up
MII Polling Interval (ms): 100

Slave Interface: enp0s1
MII Status: up
Speed: 1000 Mbps
Duplex: full

Slave Interface: enp0s2
MII Status: up
Speed: 1000 Mbps
Duplex: full

Currently Active Slave でどの NIC がアクティブかを確認できます。アクティブな NIC を抜いてみると別の NIC に即座にフェイルオーバー — これが bond の動作確認のポイントです。

Teaming — なぜ deprecated になったか #

RHEL 7〜8 の頃には bonding 以外に teaming という似たツールがありました。ユーザー領域で動作してポリシーをより柔軟に組めるのが魅力でした。しかし RHEL 9 で deprecated、RHEL 10 で 削除 されました。

理由はシンプルです。カーネル内に入っている bonding の方が安定的で速く、NetworkManager / nmcli 統合もより滑らかです。teaming の柔軟性は結局大きな価値になりませんでした。古い記事で teamdnmcli connection add type team のようなコマンドを見たら bonding に移すタイミング です。

team → bond 切り替え
# 昔 (deprecated):  nmcli connection add type team ...
# 今:               nmcli connection add type bond ...

Bridge — 仮想マシンとコンテナの基盤 #

VM やコンテナをホストと同じネットワーク帯に置きたいときに使うツール。ホストの NIC と仮想 NIC を同じ L2 セグメントに束ねます。

bridge の形
              ┌──── enp0s1 (外部)
   ┌──── br0 ─┤
   │          ├──── vnet0 (VM 1)
   │          │
   │          └──── vnet1 (VM 2)
   192.168.64.50/24 (ブリッジに IP を与える)

bridge を作る #

bridge 生成
# 1. bridge インターフェイス
$ sudo nmcli connection add \
    type bridge \
    con-name br0 \
    ifname br0 \
    ipv4.method manual \
    ipv4.addresses 192.168.64.50/24 \
    ipv4.gateway 192.168.64.1 \
    ipv4.dns 192.168.64.1

# 2. 物理 NIC を bridge に付ける
$ sudo nmcli connection add \
    type ethernet \
    con-name br0-slave1 \
    ifname enp0s1 \
    master br0

# 3. アクティベート
$ sudo nmcli connection up br0

これで enp0s1 は IP を失い、br0 がその IP を引き継ぎます。VM を作るときネットワークを br0 に接続すれば同じ LAN の他のマシンと直接通信できます。

落とし穴 — ホストが SSH で接続中の NIC をそのまま bridge に入れると一時的に接続が切れます。コンソールアクセスが可能な状態で作業するか、自動化スクリプトで一度に適用してください。

VLAN #

1 つの NIC に複数の VLAN tag を付けて仮想インターフェイスを作ることができます。

VLAN 生成
$ sudo nmcli connection add \
    type vlan \
    con-name vlan100 \
    ifname enp0s1.100 \
    dev enp0s1 \
    id 100 \
    ipv4.method manual \
    ipv4.addresses 10.0.100.50/24

id 100 が 802.1Q VLAN tag。結果のインターフェイス名は通常 <base>.<id> 形式 (enp0s1.100)。

診断ツール #

ip コマンド #

ip は最も直接的なコマンド。NetworkManager を経由せずカーネルのネットワーク状態を見ます。

ip よく使うパターン
$ ip -4 addr show              # IPv4 アドレス
$ ip -6 addr show              # IPv6
$ ip route                     # ルーティングテーブル
$ ip neigh                     # ARP テーブル
$ ip link show                 # リンク状態 (up/down)

接続性 #

ping / traceroute / mtr
$ ping -c 3 8.8.8.8
$ traceroute google.com
$ mtr -n google.com           # ping + traceroute 統合 (対話型)

ポート / ソケット #

ss
$ ss -tlnp                     # TCP listening + プロセス
$ ss -tunap                    # TCP+UDP すべてのソケット + プロセス
$ ss -s                        # ソケット統計サマリ

netstat は deprecated。新しく学ぶ方は ss で統一。

DNS #

DNS 照会
$ dig example.com              # DNS 応答詳細
$ dig +short example.com       # IP のみ
$ host example.com             # 短い応答
$ nslookup example.com         # 古いツール、互換用

運用では dig が標準。+short をよく使います。

AlmaLinux / Rocky の違い #

この記事のすべてのコマンドが そのまま動作 します。NetworkManager / nmcli / bonding / bridge / VLAN すべて RHEL のパッケージをそのまま持ってきます。

よく出会う落とし穴 #

「静的 IP を掴んだのに外部と通信できない」 #

99% はゲートウェイまたは DNS を抜かしている場合。nmcli connection show <name>ipv4.gatewayipv4.dns を確認。

「DNS を変えたのに /etc/resolv.conf がそのまま」 #

connection の属性で変えずにファイルを直接編集した場合。NetworkManager が次の変更で上書きします。必ず nmcli connection modify ... ipv4.dns ... で。

「modify したのに変化がない」 #

アクティベートされた connection は modify 後 up で再適用 しないと反映されません。または device を reconnect。

「bond / bridge が起動後に上がらない」 #

slave connection たちの connection.autoconnectyes か確認。NetworkManager は master を先に立ち上げて slave を付けるのですが、slave が autoconnect でないと付きません。

「2 つの connection が衝突」 #

同じ device に connection が 2 つ作られると起動時にどちらがアクティベートされるか不確実。使わない connection は即座に削除 または connection.autoconnect no

よく使うコマンド一覧 #

コマンドやること
nmcli全体状態を一目で
nmcli device statusdevice 一覧
nmcli device show <dev>device 詳細
nmcli connection showconnection 一覧
nmcli connection show <name>connection 詳細
nmcli connection add type ethernet ...新しい connection 追加
nmcli connection modify <name> <key> <value>属性修正
nmcli connection up/down <name>アクティベート / 非アクティベート
nmcli connection delete <name>削除
nmcli connection reloadディスクの変更を NM に再読み込みさせる
nmtuiTUI
ip -4 addr show / ip route / ip linkカーネル状態
ss -tlnplistening ポート + プロセス
dig +short <host>DNS 照会

まとめ #

この記事で整理したフロー:

  • RHEL 9 のネットワーク標準は NetworkManager 1 ツール。ifcfg / network サービスは消えた。
  • 要となるモデルは Device (NIC) + Connection (設定プロファイル)。1 つの device に複数の connection が可能。
  • nmcli が日常コマンド。最初の 1 行は常に nmcli で一目で見る。
  • 静的 IP パターン: nmcli connection add type ethernet ... ipv4.method manual ipv4.addresses ... gateway ... dns ...
  • DNS は connection の属性として — /etc/resolv.conf 直接編集禁止。
  • bonding の 99% は mode 1 (active-backup)、または LACP が可能な環境では mode 4。teaming は deprecated
  • bridge は VM / コンテナをホストと同じ LAN に置く基盤。
  • 診断は ip / ss / dig が標準 (netstat は deprecated)。

次 — ログ管理 #

ネットワークが掴まれれば、その上で動作するシステムの事件も結局ログとして残ります。次の記事ではそのログをどう扱うかを見ていきます。

#5 ログ管理 — journald、rsyslog、log rotation では、journald の保管ポリシーとディスク使用量制御、古い標準ですが依然として生きている rsyslog とリモートログ収集、そしてすべてのログファイルを一定サイズ・期間で自動回転する logrotate まで運用観点から整理します。

X