systemd-networkd は systemd に組み込まれたネットワーク管理デーモンで、
/etc/systemd/network/ 配下の設定ファイル(拡張子 .network)を読み込んでIPアドレス・ゲートウェイ・DNSを永続設定します。テキストファイルで管理できるため Ansible や Git との相性も抜群で、ヘッドレスサーバーや最小インストール環境に特に向いています。この記事では、Rocky Linux 9 / Ubuntu 24.04 LTS の実機で動作確認した手順をもとに、systemd-networkd の有効化・静的IP設定・networkctl コマンドによる確認方法・よくあるトラブルの切り分けまでを実践的に解説します。
この記事のポイント
・systemd-networkdは.networkファイルで静的IP・DNS・GWを永続設定するデーモン
・networkctl listで「routable/configured」を確認してから次の設定に進む
・NetworkManagerと競合させないことが安定運用の最重要ポイント
・IPが割り当てられない時はjournalctl -u systemd-networkdでエラーを確認する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
NetworkManagerとsystemd-networkdの違い|どちらを選ぶか
NetworkManager と systemd-networkd はどちらも「Linuxのネットワークを管理するデーモン」ですが、得意な場面が異なります。NetworkManager は「接続の切替」に強みを持つ汎用デーモンです。Wi-Fi・有線・VPN・モバイル回線など多様な接続種別を動的に切り替えられ、nmcli/nmtui によるCLI操作や GNOME/KDE の GUI アプレットとも連携します。RHEL 9・Ubuntu Server のデフォルト設定で採用されており、物理サーバーや開発機でよく使われます。
systemd-networkd は「静的なサーバー構成」に最適化された軽量デーモンです。設定をテキストファイルで記述してバージョン管理できるため、Ansible・Terraform・cloud-init との組み合わせで真価を発揮します。CoreOS・Flatcar Linux・Alpine Linux ではデフォルトで採用されており、コンテナホストや VPS でよく選ばれます。
| 用途・状況 | 推奨デーモン |
|---|---|
| RHEL 9 / Rocky Linux のデフォルト環境 | NetworkManager(nmcli) |
| Wi-Fi・複数ネットワーク切替が必要なデスクトップ・開発機 | NetworkManager |
| 最小インストールのVPS・ベアメタルサーバー(静的IP固定) | systemd-networkd |
| DockerホストやPodmanホストなどコンテナ基盤 | systemd-networkd |
| Ansible・cloud-initで設定をコード管理する構成 | systemd-networkd |
| CoreOS / Flatcar / Alpine Linux | systemd-networkd(デフォルト) |
重要なのは、両方を同時に動かさないことです。どちらか一方が同じインターフェースを管理するようにしてください。
systemd-networkdを有効化する手順
Rocky Linux 9 と Ubuntu 24.04 LTS の両方に対応した手順を示します。1. 現在のネットワーク管理デーモンを確認する
まず NetworkManager が動いているかを確認します。$ systemctl is-active NetworkManager active $ systemctl is-active systemd-networkd inactive
2. systemd-networkdとsystemd-resolvedを有効化する
systemd-networkd を有効化します。Rocky Linux 9・Ubuntu 24.04 いずれも以下のコマンドで対応できます。# systemctl enable --now systemd-networkd # systemctl enable --now systemd-resolved
3. NetworkManagerを停止・無効化する
【重要】この手順は SSH セッションが切断される可能性があります。コンソール(シリアルコンソール、KVMコンソール、クラウドのシリアルコンソール等)から作業することを強く推奨します。次の h2 セクションで .network ファイルを先に作成しておけば、NetworkManager 停止後もすぐにネットワークに再接続できます。# systemctl disable --now NetworkManager # systemctl mask NetworkManager
mask まで実施すると誤って再起動されることを防げます。4. 有効化を確認する
$ systemctl is-active systemd-networkd active $ networkctl list IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 ens3 ether no-carrier unmanaged 2 links listed.
unmanaged のままなのは、まだ .network ファイルを配置していないためです。次の手順で設定ファイルを作成します。.networkファイルで静的IPアドレスを永続設定する
設定ファイルは/etc/systemd/network/ ディレクトリに配置します。ファイル名の先頭に数字プレフィックスを付けると処理順を制御できます(数字が小さいほど先に処理)。1. インターフェース名を確認する
$ ip link show 1: lo:
mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: ens3: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether fa:16:3e:xx:xx:xx brd ff:ff:ff:ff:ff:ff
ens3 です。環境によって eth0・enp0s3・ens192 など異なります。2. 静的IP用の.networkファイルを作成する
/etc/systemd/network/10-static-ens3.network をテキストエディタで作成します。# /etc/systemd/network/10-static-ens3.network の内容 [Match] Name=ens3 [Network] Address=192.168.1.100/24 Gateway=192.168.1.1 DNS=8.8.8.8 DNS=1.1.1.1
・[Match] Name=:どのインターフェースにこの設定を適用するかを指定。
ip link show の名前と完全一致させる・Address=:IPアドレスをCIDR形式(/24 など)で指定
・Gateway=:デフォルトゲートウェイのIPアドレス
・DNS=:DNSサーバーのIPアドレス。複数行書くと優先順に複数指定できる
複数のインターフェースがある場合は、ファイルを分けて管理します。
# /etc/systemd/network/20-static-ens4.network(別NIC用) [Match] Name=ens4 [Network] Address=10.0.0.10/16
3. DHCP で自動取得する場合
静的IPではなく DHCP にしたい場合は以下のように書きます。[Match] Name=ens3 [Network] DHCP=yes
4. 設定を反映する
# networkctl reload
# systemctl restart systemd-networkd
networkctlコマンドで接続状態を確認する方法
networkctl は systemd-networkd の管理コマンドです。インターフェースの状態確認・設定再読み込み・再設定を一括で行えます。1. 全インターフェースの状態一覧を確認する
$ networkctl list IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 ens3 ether routable configured 2 links listed.
| OPERATIONAL | SETUP | 意味 |
|---|---|---|
| routable | configured | 正常。IPアドレスが割り当て済みでルーティング可能 |
| degraded | configured | 一部アドレスの取得待ちまたは一部設定に問題あり |
| no-carrier | configuring | 物理リンクが確立していない(ケーブル未接続等) |
| off | unmanaged | systemd-networkdが管理していない(.networkファイルなし) |
| routable | unmanaged | 別のデーモン(NetworkManager等)が管理中 |
2. 特定インターフェースの詳細を確認する
$ networkctl status ens3 * 2: ens3 Link File: /usr/lib/systemd/network/99-default.link Network File: /etc/systemd/network/10-static-ens3.network State: routable (configured) Online State: online Type: ether Driver: virtio_net HW Address: fa:16:3e:xx:xx:xx (Red Hat, Inc.) MTU: 1500 (min: 68, max: 65535) QDisc: fq_codel IPv6 Address Generation Mode: eui64 Queue Length (Tx/Rx): 1/1 Auto negotiation: no Speed: 10Gbps Duplex: full Address: 192.168.1.100 (local) fe80::f816:3eff:fexx:xxxx Gateway: 192.168.1.1 DNS: 8.8.8.8 1.1.1.1
設定変更後の再読み込みには以下を使います。
# networkctl reload # 全インターフェースの設定を再読み込み # networkctl reconfigure ens3 # 特定インターフェースだけ再設定
systemd-resolvedとDNS解決の設定
systemd-networkd で DNS を設定するには、systemd-resolved との連携が必要です。1. /etc/resolv.confをsystemd-resolvedに向ける
/etc/resolv.conf が systemd-resolved のスタブリゾルバーへのシンボリックリンクになっているかを確認します。Linuxのresolv.confとDNS設定の基本でも解説していますが、NetworkManager 環境では resolv.conf が直接書き換えられることが多いため、systemd-networkd に切り替えた後は必ずこの設定を確認してください。$ ls -la /etc/resolv.conf lrwxrwxrwx 1 root root 37 Aug 27 09:58 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
2. DNS解決の動作確認
$ resolvectl status Global Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: stub DNS Servers: 8.8.8.8 1.1.1.1 Link 2 (ens3) Current Scopes: DNS Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported DNS Servers: 8.8.8.8 1.1.1.1 $ ping -c 2 google.com PING google.com (142.250.x.x) 56(84) bytes of data. 64 bytes from 142.250.x.x: icmp_seq=1 ttl=116 time=5.21 ms 64 bytes from 142.250.x.x: icmp_seq=2 ttl=116 time=5.18 ms
よくあるトラブルと切り分け手順
トラブル1: IPアドレスが割り当てられない
まず journalctl でエラーログを確認します。$ journalctl -u systemd-networkd --since "5 min ago" Aug 27 10:15:23 server01 systemd-networkd[823]: ens3: No network file found, ignoring.
[Match] Name= が実際のインターフェース名と一致していません。ip link show で名前を確認してください。$ ip link show | grep -E '^[0-9]' 1: lo: ... 2: ens3: ... ← この名前を [Match] Name= に使う
[Match] Name=ens* # ens0, ens3, ens192 など ens で始まる全NIC
トラブル2: NetworkManagerと競合してIPが安定しない
networkctl list で SETUP が unmanaged のままであれば、NetworkManager が同じインターフェースを管理しています。$ networkctl list IDX LINK TYPE OPERATIONAL SETUP 2 ens3 ether routable unmanaged ← NetworkManagerが管理中 $ systemctl is-active NetworkManager active ← まだ動いている
# systemctl disable --now NetworkManager # systemctl mask NetworkManager # systemctl restart systemd-networkd
トラブル3: 設定変更が反映されない
.network ファイルを変更した後は必ずnetworkctl reload を実行します。変更が反映されない場合は systemd-networkd ごと再起動します。# networkctl reload # networkctl reconfigure ens3 # または # systemctl restart systemd-networkd
networkctl status ens3 で「Network File」に変更した .network ファイルが表示されているか、「Address」に正しいIPが割り当てられているかを確認します。トラブル4: DNSが解決できない
resolvectl status で DNS サーバーのIPが正しく表示されているかを確認します。空欄の場合は .network ファイルの DNS= 行が正しく書かれているか、または systemd-resolved が動いているかを確認してください。# 設定したDNSが引き継がれているか確認 $ resolvectl status | grep "DNS Servers" DNS Servers: 8.8.8.8 1.1.1.1 # DNSの動作テスト(nslookup / dig コマンドでの確認) $ resolvectl query google.com google.com: 142.250.x.x (-- link: ens3) Resolved in 5.2ms
まとめ:systemd-networkd設定のチェックリスト
systemd-networkd によるネットワーク管理は、設定ファイルをコードとして管理できる点が最大のメリットです。NetworkManager が適している動的な環境とは使い分けて、ヘッドレスサーバー・コンテナホスト・Ansible 管理下のサーバーで積極的に活用してください。| やること | コマンド・ファイル |
|---|---|
| systemd-networkdを有効化 | systemctl enable --now systemd-networkd |
| systemd-resolvedを有効化 | systemctl enable --now systemd-resolved |
| NetworkManagerを停止・無効化 | systemctl disable --now NetworkManager |
| 静的IP設定ファイルの配置先 | /etc/systemd/network/10-xxx.network |
| 設定の再読み込み | networkctl reload |
| 接続状態の確認 | networkctl list / networkctl status ens3 |
| エラーログの確認 | journalctl -u systemd-networkd |
| DNS解決の確認 | resolvectl status |
| resolv.confをstubリゾルバーに向ける | ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf |
ネットワーク設定をコードで管理できると、サーバー構築の「型」が見えてきます
systemd-networkdのような仕組みを正しく理解していると、障害時の原因特定が格段に速くなります。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:cgroupv2でsystemdサービスのCPU・メモリを制限する方法|プロセス暴走をシステムレベルで防ぐ実践手順
- この記事の属するカテゴリ:Linuxtips・ネットワークへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます