systemd-networkd: Linux 网络管理服务详解

发布时间: 更新时间: 总字数:1649 阅读时间:4m 作者: IP上海 分享 网址

systemd-networkdsystemd 套件的一部分,是一个系统守护进程,用于管理网络配置。它能够检测并配置网络设备,创建虚拟网络设备,并根据配置文件自动管理网络连接。

介绍

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 被读取)。

主要有三种类型的文件:

  1. .network 文件:最常用。用于对匹配的网络接口应用配置(如 IP 地址、DNS、路由)。
  2. .netdev 文件:用于创建虚拟网络设备(如 Bridge, Bond, VLAN)。
  3. .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)

这通常需要两个文件:一个定义设备,一个绑定接口。

  1. 定义网桥设备 (/etc/systemd/network/br0.netdev):

    [NetDev]
    Name=br0
    Kind=bridge
    
  2. 将物理接口绑定到网桥 (/etc/systemd/network/10-bind-eth0.network):

    [Match]
    Name=eth0
    
    [Network]
    Bridge=br0
    
  3. 配置网桥的 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 list
    
  • 查看特定接口的详细信息
    networkctl status eth0
    
  • 重新加载配置(修改配置文件后):
    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:

  1. 禁用旧服务(以 NetworkManager 为例):

    systemctl stop NetworkManager
    systemctl disable NetworkManager
    
  2. 启用并启动 systemd-networkd

    systemctl enable systemd-networkd
    systemctl start systemd-networkd
    
  3. 检查状态

    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 工程师,掌握它非常有必要。

参考

  1. https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html
  2. https://wiki.archlinuxcn.org/wiki/Systemd-networkd
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics