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 文件
.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 |
[Link] 段参数
| 参数 | 说明 | 示例 |
|---|---|---|
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。