Linuxサーバーのネットワーク設定をsystemd-networkdで管理する方法|networkctlと設定ファイルの実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ネットワーク > Linuxサーバーのネットワーク設定をsystemd-networkdで管理する方法|networkctlと設定ファイルの実践手順
「NetworkManagerを使わずにLinuxサーバーのネットワーク設定を一元管理したい」「コンテナホストや最小構成のVPSで、再起動後もIPアドレスが元に戻ってしまう」。そんな場面で力を発揮するのが systemd-networkd です。

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でエラーを確認する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

systemd-resolved は DNS 名前解決を担当するデーモンです。systemd-networkd と組み合わせて使うのが一般的です。

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.

SETUP 列が 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 です。環境によって eth0enp0s3ens192 など異なります。

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

または systemd-networkd を再起動して反映します。

# 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.

OPERATIONALSETUP の組み合わせの読み方は以下の通りです。

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

Network File に作成した .network ファイルのパスが表示されれば、設定が正しく読み込まれています。

設定変更後の再読み込みには以下を使います。

# 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.

No network file found」が出た場合、.network ファイルの [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 ← まだ動いている

NetworkManager を停止・無効化してから systemd-networkd を再起動します。

# 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

ポートの疎通確認には ss コマンドも活用できます。Linux ポート確認の全コマンドも合わせて参照してください。

まとめ: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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。