RHEL 中級 #4 ネットワーキング — NetworkManager (nmcli)、bonding、teaming
基礎 #2 のセットアップ時に少しだけ出会ったネットワーク画面を本格的に解いていきます。RHEL 9 のネットワークは NetworkManager 1 つに整理され、この記事ではその設定を実際の運用でどう扱うかを見ていきます。
RHEL 中級 シリーズでこの記事の位置:
- #1 SELinux 入門 — Enforcing/Permissive、ラベル、トラブルシューティング
- #2 LVM — PV/VG/LV、スナップショット、拡張
- #3 ストレージ深化 — Stratis、NFS、Samba
- #4 ネットワーキング — NetworkManager (nmcli)、bonding、teaming ← この記事
- #5 ログ管理 — journald、rsyslog、log rotation
- #6 ジョブスケジューリング — cron、systemd timer、at
- #7 コンテナ入門 — Podman/Buildah/Skopeo (Docker との違い)
NetworkManager がなぜ標準になったか #
昔の RHEL はネットワーク設定を /etc/sysconfig/network-scripts/ifcfg-* ファイルに書き、service network restart で適用しました。単純な役割はうまく動作しましたが、無線・VPN・動的 IP・複数インターフェイスの同時処理には弱かったです。
NetworkManager はこのすべてを 1 つのデーモンに統合したツールです。デスクトップ・サーバー・ノート PC・コンテナすべてで同じモデルで動作し、変更は即座に反映され (restart 不要)、バックエンド (D-Bus) とクライアントツール (nmcli / nmtui / GUI) が多様で自動化も簡単です。
ユーザーツール: 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。
enp0s1、wlan0のような名前。 - 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: enp0s1nmcli だけ叩けばすべての情報が 1 画面に出ます。運用で初めてマシンに入って「ネットワークがどんな状態か」を見るとき最もよく叩きます。
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.1Connection を見る #
$ 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 を作る #
$ 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 の修正 #
$ sudo nmcli connection modify "static-enp0s1" \
ipv4.addresses 192.168.64.51/24
$ sudo nmcli connection up "static-enp0s1" # 再アクティベートしないと反映されないmodify だけでは即座に反映されません。up で再アクティベート するか device を再接続する必要があります。
Connection 切り替え #
$ sudo nmcli connection up "static-enp0s1"
$ sudo nmcli connection down "Wired connection 1"同じ device に 2 つの connection があっても一度に 1 つだけアクティベートされます。よく移動する環境 (ノート PC のオフィス/家/カフェのプロファイル) に有用です。
削除 #
$ 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 の属性として:
$ 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 を使うには:
$ 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 です。障害対策が最もよくある役割です。
eth0 ─┐
├── bond0 ── 192.168.64.50
eth1 ─┘
(1 つの NIC が死んでも別の NIC が受ける)モード #
| mode | 名前 | 用途 |
|---|---|---|
0 | balance-rr | ラウンドロビン (スイッチサポート必要) |
1 | active-backup | 1 つの NIC アクティブ、残りは待機 — 最もよくある |
2 | balance-xor | XOR ハッシュ分散 |
3 | broadcast | すべての NIC に同じパケット |
4 | 802.3ad / LACP | 標準のリンクアグリゲーション — スイッチサポート必要 |
5 | balance-tlb | 送信のみ分散 |
6 | balance-alb | 送受信両方分散 |
運用の 99% は mode 1 (active-backup) または mode 4 (LACP)。単純な障害対策は 1、帯域幅合算が必要でスイッチが LACP をサポートするなら 4。
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 bond0miimon 100 が リンク監視周期 (ms)。100ms ごとに NIC の状態を確認して切れた NIC を自動で外します。
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: fullCurrently Active Slave でどの NIC がアクティブかを確認できます。アクティブな NIC を抜いてみると別の NIC に即座にフェイルオーバー — これが bond の動作確認のポイントです。
Teaming — なぜ deprecated になったか #
RHEL 7〜8 の頃には bonding 以外に teaming という似たツールがありました。ユーザー領域で動作してポリシーをより柔軟に組めるのが魅力でした。しかし RHEL 9 で deprecated、RHEL 10 で 削除 されました。
理由はシンプルです。カーネル内に入っている bonding の方が安定的で速く、NetworkManager / nmcli 統合もより滑らかです。teaming の柔軟性は結局大きな価値になりませんでした。古い記事で teamd や nmcli connection add type team のようなコマンドを見たら bonding に移すタイミング です。
# 昔 (deprecated): nmcli connection add type team ...
# 今: nmcli connection add type bond ...Bridge — 仮想マシンとコンテナの基盤 #
VM やコンテナをホストと同じネットワーク帯に置きたいときに使うツール。ホストの NIC と仮想 NIC を同じ L2 セグメントに束ねます。
┌──── enp0s1 (外部)
│
┌──── br0 ─┤
│ ├──── vnet0 (VM 1)
│ │
│ └──── vnet1 (VM 2)
│
192.168.64.50/24 (ブリッジに IP を与える)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 を付けて仮想インターフェイスを作ることができます。
$ 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/24id 100 が 802.1Q VLAN tag。結果のインターフェイス名は通常 <base>.<id> 形式 (enp0s1.100)。
診断ツール #
ip コマンド
#
ip は最も直接的なコマンド。NetworkManager を経由せずカーネルのネットワーク状態を見ます。
$ ip -4 addr show # IPv4 アドレス
$ ip -6 addr show # IPv6
$ ip route # ルーティングテーブル
$ ip neigh # ARP テーブル
$ ip link show # リンク状態 (up/down)接続性 #
$ ping -c 3 8.8.8.8
$ traceroute google.com
$ mtr -n google.com # ping + traceroute 統合 (対話型)ポート / ソケット #
$ ss -tlnp # TCP listening + プロセス
$ ss -tunap # TCP+UDP すべてのソケット + プロセス
$ ss -s # ソケット統計サマリnetstat は deprecated。新しく学ぶ方は ss で統一。
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.gateway と ipv4.dns を確認。
「DNS を変えたのに /etc/resolv.conf がそのまま」
#
connection の属性で変えずにファイルを直接編集した場合。NetworkManager が次の変更で上書きします。必ず nmcli connection modify ... ipv4.dns ... で。
「modify したのに変化がない」 #
アクティベートされた connection は modify 後 up で再適用 しないと反映されません。または device を reconnect。
「bond / bridge が起動後に上がらない」 #
slave connection たちの connection.autoconnect が yes か確認。NetworkManager は master を先に立ち上げて slave を付けるのですが、slave が autoconnect でないと付きません。
「2 つの connection が衝突」 #
同じ device に connection が 2 つ作られると起動時にどちらがアクティベートされるか不確実。使わない connection は即座に削除 または connection.autoconnect no。
よく使うコマンド一覧 #
| コマンド | やること |
|---|---|
nmcli | 全体状態を一目で |
nmcli device status | device 一覧 |
nmcli device show <dev> | device 詳細 |
nmcli connection show | connection 一覧 |
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 に再読み込みさせる |
nmtui | TUI |
ip -4 addr show / ip route / ip link | カーネル状態 |
ss -tlnp | listening ポート + プロセス |
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 まで運用観点から整理します。