强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

systemd 教程 / 网络管理(systemd-networkd)

网络管理(systemd-networkd)

概述

systemd-networkd 是 systemd 内建的网络管理守护进程,负责网络设备的配置和管理。与 NetworkManager 不同,systemd-networkd 专注于服务器环境,通过简洁的配置文件管理网络,支持静态 IP、DHCP、VLAN、Bridge、Bond 等高级网络配置。


配置文件结构

所有网络配置文件位于 /etc/systemd/network/ 目录:

/etc/systemd/network/
├── 10-eth0.link        # 物理链路配置
├── 20-eth0.network     # 网络地址配置
├── 30-br0.netdev       # 虚拟设备定义
├── 30-br0.network      # 虚拟设备网络配置
└── 40-vlan10.netdev    # VLAN 定义

文件命名规则

文件名格式:优先级-名称.类型

优先级范围 说明
00-09 最高优先级,系统内部使用
10-29 默认配置
30-69 高级配置(VLAN、Bridge 等)
70-99 低优先级覆盖

⚠️ 注意:文件按字典序排序,数字前缀决定处理顺序。相同网卡可能被多个 .network 文件匹配,使用第一个匹配的文件。


.link 文件配置物理网络设备的链路层属性。

基本结构

# /etc/systemd/network/10-eth0.link
[Link]
MACAddress=00:11:22:33:44:55
NamePolicy=mac
AutoNegotiation=yes
Speed=1000
Duplex=full

[Match]
MACAddress=aa:bb:cc:dd:ee:ff

[Match] 段参数

参数 说明 示例
MACAddress MAC 地址匹配 MACAddress=00:11:22:33:44:55
Path 设备路径匹配 Path=pci-0000:02:00.0
Driver 驱动名称匹配 Driver=e1000e
Type 设备类型匹配 Type=ether
Host 主机名匹配 Host=myserver
Virtualization 虚拟化类型 Virtualization=kvm
参数 说明 示例
MACAddress 设置 MAC 地址 MACAddress=00:11:22:33:44:55
NamePolicy 命名策略 NamePolicy=mac onboard
Name 固定设备名称 Name=eth0
AutoNegotiation 自动协商 AutoNegotiation=yes
Speed 链路速度(Mbps) Speed=1000
Duplex 双工模式 Duplex=full
WakeOnLan 网络唤醒 WakeOnLan=magic
MTUBytes MTU 大小 MTUBytes=9000

.network 文件

.network 文件配置网络设备的 IP 地址、路由、DNS 等。

静态 IP 配置

# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8
DNS=8.8.4.4
Domains=example.com

[Route]
Gateway=192.168.1.1
Metric=100

DHCP 客户端配置

# /etc/systemd/network/20-dhcp.network
[Match]
Name=en*

[Network]
DHCP=yes

[DHCPv4]
UseDNS=yes
UseNTP=yes
UseRoutes=yes
RouteMetric=100
SendHostname=yes
Hostname=myserver

[Network] 段常用参数

参数 说明 示例
DHCP 启用 DHCP DHCP=yes / DHCP=ipv4 / DHCP=ipv6
Address 静态 IP 地址 Address=192.168.1.100/24
Gateway 默认网关 Gateway=192.168.1.1
DNS DNS 服务器 DNS=8.8.8.8
Domains 搜索域 Domains=example.com
IPForward 启用 IP 转发 IPForward=yes
IPMasquerade 启用 NAT IPMasquerade=yes
IPv6PrivacyExtensions IPv6 隐私扩展 IPv6PrivacyExtensions=yes
LinkLocalAddressing 链路本地地址 LinkLocalAddressing=yes
VLAN 关联 VLAN VLAN=vlan10
Bridge 关联 Bridge Bridge=br0
Bond 关联 Bond Bond=bond0

[DHCPv4] 段参数

参数 说明 默认值
UseDNS 使用 DHCP 获取的 DNS yes
UseNTP 使用 DHCP 获取的 NTP yes
UseRoutes 使用 DHCP 获取的路由 yes
UseDomains 使用 DHCP 获取的域名 no
RouteMetric DHCP 路由度量值 1024
SendHostname 发送主机名 yes
ClientIdentifier 客户端标识 duid

.netdev 文件

.netdev 文件定义虚拟网络设备(VLAN、Bridge、Bond 等)。

VLAN 配置

# /etc/systemd/network/30-vlan10.netdev
[NetDev]
Name=vlan10
Kind=vlan

[VLAN]
Id=10
# /etc/systemd/network/30-vlan10.network
[Match]
Name=vlan10

[Network]
Address=10.0.10.1/24
Gateway=10.0.10.254
DNS=8.8.8.8

关联物理接口到 VLAN:

# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
VLAN=vlan10
VLAN=vlan20

Bridge 配置

# /etc/systemd/network/30-br0.netdev
[NetDev]
Name=br0
Kind=bridge

[Bridge]
STP=yes
HelloTimeSec=2
MaxAgeSec=20
ForwardDelaySec=15
# /etc/systemd/network/30-br0.network
[Match]
Name=br0

[Network]
Address=192.168.1.1/24
Gateway=192.168.1.254
DNS=8.8.8.8

将物理接口加入 Bridge:

# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
Bridge=br0

Bond 聚合配置

# /etc/systemd/network/30-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=802.3ad
TransmitHashPolicy=layer3+4
MIIMonitorSec=100ms

Bond 模式对照:

Mode 名称 说明
balance-rr 轮询 按包轮询发送
active-backup 主备 仅主接口工作
balance-xor XOR 基于 MAC 地址哈希
broadcast 广播 所有接口发送
802.3ad LACP 链路聚合协议(推荐)
balance-tlb 自适应发送 基于负载的发送
balance-alb 自适应负载 发送和接收均负载
# /etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
Address=192.168.1.1/24
Gateway=192.168.1.254
DNS=8.8.8.8

将物理接口加入 Bond:

# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
Bond=bond0

# /etc/systemd/network/20-eth1.network
[Match]
Name=eth1

[Network]
Bond=bond0

管理命令

基本操作

# 启动/停止/重启
sudo systemctl start systemd-networkd
sudo systemctl stop systemd-networkd
sudo systemctl restart systemd-networkd

# 启用开机启动
sudo systemctl enable systemd-networkd

# 查看状态
systemctl status systemd-networkd

# 查看网络配置
networkctl status

# 查看所有网络设备
networkctl list

# 查看特定设备详情
networkctl status eth0

# 重新加载配置
sudo networkctl reload

networkctl 命令

# 查看所有设备状态
networkctl list

# 输出示例:
# IDX LINK TYPE     OPERATIONAL SETUP
#   1 lo   loopback carrier     unmanaged
#   2 eth0 ether    routable    configured
#   3 br0  bridge   routable    configured

# 查看设备详细信息
networkctl status eth0

# 启用/禁用设备
networkctl up eth0
networkctl down eth0

# 重新配置设备
networkctl reconfigure eth0

调试网络配置

# 查看 systemd-networkd 日志
journalctl -u systemd-networkd

# 实时监控
journalctl -fu systemd-networkd

# 查看详细日志
SYSTEMD_LOG_LEVEL=debug /usr/lib/systemd/systemd-networkd

systemd-networkd-wait-online

该服务在网络完全就绪后才标记为完成,常用于确保依赖网络的服务在网络就绪后启动:

# 检查网络是否就绪
systemd-networkd-wait-online --timeout=30

# 等待特定接口
systemd-networkd-wait-online -i eth0

# 查看服务状态
systemctl status systemd-networkd-wait-online.service

⚠️ 注意:如果网络配置有问题,systemd-networkd-wait-online.service 可能会超时,导致系统启动变慢。可以调整超时时间或按需禁用。

调整超时

# /etc/systemd/system/systemd-networkd-wait-online.service.d/timeout.conf
[Service]
ExecStart=
ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --timeout=10

实际场景

场景 1:服务器静态 IP + VLAN

# /etc/systemd/network/10-eth0.link
[Match]
MACAddress=aa:bb:cc:dd:ee:ff

[Link]
Name=eth0
MTUBytes=9000
# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
VLAN=vlan100
VLAN=vlan200

# 管理网络
Address=10.0.0.1/24
Gateway=10.0.0.254
DNS=10.0.0.1
# /etc/systemd/network/30-vlan100.netdev
[NetDev]
Name=vlan100
Kind=vlan

[VLAN]
Id=100
# /etc/systemd/network/30-vlan100.network
[Match]
Name=vlan100

[Network]
Address=10.0.100.1/24
DNS=10.0.0.1

场景 2:KVM 虚拟化宿主机

# /etc/systemd/network/30-br0.netdev
[NetDev]
Name=br0
Kind=bridge

[Bridge]
STP=yes
# /etc/systemd/network/30-br0.network
[Match]
Name=br0

[Network]
Address=192.168.1.1/24
Gateway=192.168.1.254
DNS=8.8.8.8
IPForward=yes
# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
Bridge=br0

场景 3:双网卡 Bond 高可用

# /etc/systemd/network/30-bond0.netdev
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
MIIMonitorSec=100ms
# /etc/systemd/network/20-eth0.network
[Match]
Name=eth0

[Network]
Bond=bond0

# /etc/systemd/network/20-eth1.network
[Match]
Name=eth1

[Network]
Bond=bond0
# /etc/systemd/network/30-bond0.network
[Match]
Name=bond0

[Network]
Address=192.168.1.1/24
Gateway=192.168.1.254
DNS=8.8.8.8

networkd 与 NetworkManager 对比

对比项 systemd-networkd NetworkManager
定位 服务器环境 桌面/笔记本
配置方式 文本配置文件 nmcli/nmtui/GUI
WiFi 支持 不支持 支持
VPN 支持 不支持 支持
移动网络 不支持 支视
高级网络 VLAN/Bridge/Bond 有限
资源占用 极低 较高
适用场景 云服务器/数据中心 桌面/笔记本

💡 提示:在服务器环境中,推荐使用 systemd-networkd;在需要 WiFi、VPN 等功能的桌面环境中,推荐使用 NetworkManager。


扩展阅读