经常用 debian 的系统,一直配置网络都是在/etc/network/interface/ ,但是在ubuntu 里,配置网络主要用 netplan。两者配置起来还是有不小的区别,最近查了下,现在整体的趋势是用 systemd-networkd,这是 systemd 自带的网络配置工具。netplan 本质上是一个语法转换器,最终的配置也是用的 systemd-networkd。而 network/interface 也比较老旧了,现在的系统是使用 systemd 初始化的,自然也都有 systemd-networkd 工具。
正好需要配置一个网关小主机,学习一下 systemd-networkd 的配置方式。

配置文件说明

systemd-networkd 的配置文件在 /etc/systemd/network/ 目录下,文件主要有两种后缀

  • .network 用于配置网络
  • .netdev 用于定义虚拟设备

网络配置

我的网关小主机有三个网卡,我希望 eth0 作为 wan 口,eth1 和 eth2 创建网桥作为 lan 口。
首先 eth0 作为 wan 口,

# file eth0.network
[Match]
Name=eth0
[Network]
DHCP=yes

然后定义一个网桥 br0.netdev

# file br0.netdev
[NetDev]
Name=br0
Kind=bridge

再将 eth1 和 eth2 都加入到网桥里

# file eth1.network
[Match]
Name=eth1
[Network]
Bridge=br0
# file eth2.network
[Match]
Name=eth2
[Network]
Bridge=br0

然后创建 br0 的配置,正好 systemd-networkd 自身也带了 dhcp server,就不需要用 dnsmasq 来配置了。

# file br0.network
[Match]
Name=br0

[Network]
# 启用 IPv6 的链路本地地址
LinkLocalAddressing=ipv6
# 定义本网口的 IP
Address=192.168.23.1/24
DNS=1.1.1.1
DNS=223.6.6.6
# 开启 IP 转发,这是网卡层面的配置,net.ipv4.ip_forward=1 还是需要配置
IPForward=yes
# 开启 IP 伪装,这个配置了它会自动配 iptables 里配置
IPMasquerade=yes
DHCPServer=yes
# 这个表示没有插网线的情况下也执行配置
ConfigureWithoutCarrier=yes

[DHCPServer]
DNS=223.6.6.6 223.5.5.5
# DHCP 地址的起始 IP
PoolOffset=10
# DHCP 地址的数量,末尾 IP 就是 Offset + Size,这里配置范围的方式和 netplan,dnsmasq 不同
PoolSize=200
# 默认租约时间
DefaultLeaseTimeSec=7d
# 最大租约时间
MaxLeaseTimeSec=7d
# 是否下发 DNS
EmitDNS=yes
# 是否下发网关地址,也就是上面给这个网卡配置的地址
EmitRouter=yes

注意这些文件需要权限是 644。
配置好后执行 systemctl restart systemd-networkd 启动就好了,遇到报错就去 journalctl 里查看。

状态查看

还有一个 networkctl 命令可以查看每个网卡的配置情况

$ networkctl
IDX LINK   TYPE      OPERATIONAL SETUP
  1 lo     loopback  carrier     unmanaged
  2 enp2s0 ether     enslaved    configured
  3 eno1   ether     routable    configured
  4 wwan0  ether     off         unmanaged
  5 br0    bridge    routable    configured
  6 wlan0  wlan      off         unmanaged
  7 wt0    wireguard routable    unmanaged

参考

https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html