systemd-networkd 是 systemd 套件的一部分,是一个系统守护进程,用于管理网络配置。它能够检测并配置网络设备,创建虚拟网络设备,并根据配置文件自动管理网络连接。
介绍
systemd-networkd 相比于传统的网络管理工具(如 NetworkManager 或旧式的 ifupdown 脚本),systemd-networkd 的设计目标是轻量级、简单且专为服务器和容器环境优化。
核心特点
- 轻量级与高性能:资源占用极低,依赖少,启动速度快。
- 紧密集成:作为 systemd 的一部分,它能利用 systemd 的依赖管理和日志功能。
- 声明式配置:通过简单的文本文件配置网络,易于版本控制和自动化部署(Ansible/Puppet 等)。
- 支持热插拔:能够检测新添加的网络设备并自动应用配置。
- 功能丰富:支持静态 IP、DHCP(客户端和服务端)、IPv6、VLAN、网桥(Bridge)、Bonding、VXLAN、隧道(Tunnel)等。
- 容器友好:非常适合用于 systemd-nspawn 容器和虚拟机环境。
适用场景 vs 不适用场景
-
✅ 推荐使用场景:
- 服务器环境(Server)。
- 云实例(Cloud Instances)。
- 嵌入式设备。
- 容器和虚拟机。
- 需要固定、静态网络配置的环境。
-
❌ 不推荐使用场景:
- 桌面环境/笔记本电脑:如果你需要频繁切换 WiFi、连接 VPN 或使用 GUI 管理网络,NetworkManager 是更好的选择。
配置文件结构
配置文件通常位于 /etc/systemd/network/ 目录下。文件按字典序处理(10-*.network 会先于 20-*.network 被读取)。
主要有三种类型的文件:
.network 文件:最常用。用于对匹配的网络接口应用配置(如 IP 地址、DNS、路由)。
.netdev 文件:用于创建虚拟网络设备(如 Bridge, Bond, VLAN)。
.link 文件:用于底层链路配置(如修改 MAC 地址、重命名接口名称)。
配置示例
以下展示如何在 /etc/systemd/network/ 下创建配置文件。
配置 DHCP(自动获取 IP)
创建一个文件,例如 /etc/systemd/network/80-dhcp.network:
[Match]
Name=eth0 # 或者使用通配符,如 en*
[Network]
DHCP=yes
配置静态 IP (Static IP)
创建一个文件,例如 /etc/systemd/network/10-static-enp3s0.network:
[Match]
Name=enp3s0
[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=1.1.1.1
配置网桥 (Bridge)
这通常需要两个文件:一个定义设备,一个绑定接口。
-
定义网桥设备 (/etc/systemd/network/br0.netdev):
[NetDev]
Name=br0
Kind=bridge
-
将物理接口绑定到网桥 (/etc/systemd/network/10-bind-eth0.network):
[Match]
Name=eth0
[Network]
Bridge=br0
-
配置网桥的 IP (/etc/systemd/network/20-br0.network):
[Match]
Name=br0
[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
或
- /etc/systemd/network/25-bridge-static.netdev
[NetDev]
Name=bridge0
Kind=bridge
- /etc/systemd/network/25-bridge-static.network
[Match]
Name=bridge0
[Network]
Address=192.168.0.15/24
Gateway=192.168.0.1
DNS=192.168.0.1
- /etc/systemd/network/25-bridge-slave-interface-1.network
[Match]
Name=enp2s0
[Network]
Bridge=bridge0
- /etc/systemd/network/25-bridge-slave-interface-2.network
[Match]
Name=wlp3s0
[Network]
Bridge=bridge0
IPv6 Prefix Delegation (DHCPv6 PD)
- /etc/systemd/network/55-dhcpv6-pd-upstream.network
[Match]
Name=enp1s0
[Network]
DHCP=ipv6
- /etc/systemd/network/55-dhcpv6-pd-downstream.network
[Match]
Name=enp2s0
[Network]
DHCPPrefixDelegation=yes
IPv6SendRA=yes
网桥与 VLAN
- /etc/systemd/network/25-bridge-slave-interface-1.network
[Match]
Name=enp2s0
[Network]
Bridge=bridge0
[BridgeVLAN]
VLAN=1-32
PVID=42
EgressUntagged=42
[BridgeVLAN]
VLAN=100-200
[BridgeVLAN]
EgressUntagged=300-400
隧道
# /etc/systemd/network/25-tunnels.network
[Match]
Name=ens1
[Network]
Tunnel=ipip-tun
Tunnel=sit-tun
Tunnel=gre-tun
Tunnel=vti-tun
# /etc/systemd/network/25-tunnel-ipip.netdev
[NetDev]
Name=ipip-tun
Kind=ipip
# /etc/systemd/network/25-tunnel-sit.netdev
[NetDev]
Name=sit-tun
Kind=sit
# /etc/systemd/network/25-tunnel-gre.netdev
[NetDev]
Name=gre-tun
Kind=gre
# /etc/systemd/network/25-tunnel-vti.netdev
[NetDev]
Name=vti-tun
Kind=vti
bond 设备
# /etc/systemd/network/30-bond1.network
[Match]
Name=bond1
[Network]
DHCP=ipv6
# /etc/systemd/network/30-bond1.netdev
[NetDev]
Name=bond1
Kind=bond
# /etc/systemd/network/30-bond1-dev1.network
[Match]
MACAddress=52:54:00:e9:64:41
[Network]
Bond=bond1
# /etc/systemd/network/30-bond1-dev2.network
[Match]
MACAddress=52:54:00:e9:64:42
[Network]
Bond=bond1
无线适配器
- /etc/systemd/network/25-wireless.network
[Match]
Name=wlp2s0
[Network]
DHCP=yes
IgnoreCarrierLoss=3s
管理与命令 (networkctl)
systemd-networkd 配套了一个命令行工具 networkctl 用于查看状态。
- 查看网络链接状态:
- 查看特定接口的详细信息:
- 重新加载配置(修改配置文件后):
networkctl reload
# 或者
systemctl restart systemd-networkd
DNS 解析 (systemd-resolved)
systemd-networkd 通常与 systemd-resolved 配合使用来处理 DNS 解析。
networkd 获取到 DNS 服务器地址(通过 DHCP 或静态配置),然后传递给 resolved。
要使 DNS 正常工作,你需要确保 systemd-resolved 已启用,并且 /etc/resolv.conf 是一个软链接:
systemctl enable --now systemd-resolved
ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
如何启用 systemd-networkd
如果你决定从 NetworkManager 或其他工具切换到 systemd-networkd:
-
禁用旧服务(以 NetworkManager 为例):
systemctl stop NetworkManager
systemctl disable NetworkManager
-
启用并启动 systemd-networkd:
systemctl enable systemd-networkd
systemctl start systemd-networkd
-
检查状态:
systemctl status systemd-networkd
networkctl
扩展
- 其他
systemd-networkd-wait-online.service 主要作用是等待网络配置达到可用状态,具体包括:确保网络已连接并配置完成、同步网络相关服务(它实现了一个特殊的 network-online.target 目标。依赖于网络的服务可以声明它们需要在这个 target 之后启动。这样就避免了服务在网络尚未就绪时就尝试启动并失败,从而导致启动过程中的错误或延迟)
F&Q
systemd-networkd 出现 ibs8f0: Gained carrier/ Lost carrier
排查物理链路,如网口(如未插紧、物理故障灯)、网线、交换机等
总结
systemd-networkd 是现代 Linux 发行版(如 Ubuntu Server 18.04+, Arch Linux, CoreOS, Debian 等)中管理服务器网络的强大工具。它去除了多余的 GUI 依赖,通过标准化的配置文件提供稳定、快速的网络管理能力。如果你是一名系统管理员或 DevOps 工程师,掌握它非常有必要。