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

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] 段参数

参数说明示例
MACAddressMAC 地址匹配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
MTUBytesMTU 大小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启用 DHCPDHCP=yes / DHCP=ipv4 / DHCP=ipv6
Address静态 IP 地址Address=192.168.1.100/24
Gateway默认网关Gateway=192.168.1.1
DNSDNS 服务器DNS=8.8.8.8
Domains搜索域Domains=example.com
IPForward启用 IP 转发IPForward=yes
IPMasquerade启用 NATIPMasquerade=yes
IPv6PrivacyExtensionsIPv6 隐私扩展IPv6PrivacyExtensions=yes
LinkLocalAddressing链路本地地址LinkLocalAddressing=yes
VLAN关联 VLANVLAN=vlan10
Bridge关联 BridgeBridge=br0
Bond关联 BondBond=bond0

[DHCPv4] 段参数

参数说明默认值
UseDNS使用 DHCP 获取的 DNSyes
UseNTP使用 DHCP 获取的 NTPyes
UseRoutes使用 DHCP 获取的路由yes
UseDomains使用 DHCP 获取的域名no
RouteMetricDHCP 路由度量值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-xorXOR基于 MAC 地址哈希
broadcast广播所有接口发送
802.3adLACP链路聚合协议(推荐)
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-networkdNetworkManager
定位服务器环境桌面/笔记本
配置方式文本配置文件nmcli/nmtui/GUI
WiFi 支持不支持支持
VPN 支持不支持支持
移动网络不支持支视
高级网络VLAN/Bridge/Bond有限
资源占用极低较高
适用场景云服务器/数据中心桌面/笔记本

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


扩展阅读