systemd-networkd
systemd-networkd 是一个系统守护进程,用于管理网络配置。它检测并配置出现的网络设备;它还可以创建虚拟网络设备。此服务对于为由 systemd-nspawn 管理的容器或虚拟机设置复杂的网络配置特别有用。它在简单的连接上也运行良好。
基本用法
systemd 软件包是默认 Arch 安装的一部分,包含操作有线网络所需的所有文件。无线适配器(本文稍后介绍)可以通过诸如 wpa_supplicant 或 iwd 等服务进行设置。
所需服务和设置
要使用 systemd-networkd,启动/启用 systemd-networkd.service
。
systemctl --type=service
查找当前正在运行的服务列表,然后停止或重新配置那些冲突的服务。还可以选择配置 systemd-resolved,这是一个为本地应用程序提供网络名称解析服务的程序,需考虑以下几点
- 理解 resolv.conf 和 systemd-resolved 如何交互以正确配置将要使用的 DNS 非常重要,systemd-resolved 中提供了一些解释。
- 如果在 .network 文件中指定了 DNS 条目,则需要 systemd-resolved。
- 从 DHCP 服务器或 IPv6 路由器通告获取 DNS 地址也需要 systemd-resolved。
(通过在[Network]
区段中设置 (DHCP=
和/或IPv6AcceptRA=
,并在相应的区段[DHCPv4]
、[DHCPv6]
、[IPv6AcceptRA]
中设置UseDNS=yes
(默认值),请参阅 systemd.network(5))。 - 请注意,systemd-resolved 也可以在没有 systemd-networkd 的情况下使用。
systemd-networkd-wait-online
启用 systemd-networkd.service
也会启用 systemd-networkd-wait-online.service
,这是一个等待网络配置完成的单次系统服务。后者具有 WantedBy=network-online.target
,因此只有当 network-online.target
本身被启用或被其他单元拉入时才会启动。另请参阅 systemd#网络启动后运行服务。
默认情况下,systemd-networkd-wait-online.service
等待 systemd-networkd 管理的所有链接完全配置或失败,并等待至少一个链接在线。
有关详细信息,请参阅 systemd-networkd-wait-online(8)。
并非始终连接的多个接口
对于具有多个网络接口的系统,这些接口并非总是预期连接(例如,双端口以太网卡,但仅插入一根电缆),启动 systemd-networkd-wait-online.service
将在默认超时时间 2 分钟后失败。这可能会导致启动过程出现不必要的延迟。要更改行为以等待任何接口而不是所有接口变为在线,编辑该服务并将 --any
参数添加到 ExecStart
行
/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-only-one-interface.conf
[Service] ExecStart= ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --any
或者,使用 systemd-networkd-wait-online@.service
等待特定接口。例如,要等待 enp1s0
,禁用 systemd-networkd-wait-online.service
并 启用 systemd-networkd-wait-online@enp1s0.service
。
等待网络接口获得可路由的地址
根据 systemd-networkd-wait-online.service(8),“在线意味着链接的运行状态等于或高于“降级”。”(有关“降级”和其他运行状态的定义,请参阅 networkctl(1))。
为了防止 systemd-networkd-wait-online.service
在网络接口获得可路由的 IP 地址之前退出(从而导致其他需要工作网络连接的服务过早启动),请将 RequiredForOnline=routable
添加到 .network 文件中的 [Link]
区段
[Link] RequiredForOnline=routable
配置示例
本节中的所有配置都存储为 /etc/systemd/network/
中的 foo.network
。有关选项和处理顺序的完整列表,请参阅 #配置文件 和 systemd.network(5)。
systemd/udev 自动为所有本地以太网、WLAN 和 WWAN 接口分配可预测的、稳定的网络接口名称。使用 networkctl list
列出系统上的设备。如果需要偏离自动接口命名,请参阅 网络配置#更改接口名称 以获取示例。
在更改配置文件后,重启 systemd-networkd.service
。
- 配置文件中指定的选项区分大小写。
- 在下面的示例中,
enp1s0
是有线适配器,wlp2s0
是无线适配器。这些名称在不同的系统上可能会有所不同。有关检查适配器名称的信息,请参阅 网络配置#网络接口。 - 也可以使用通配符,例如
Name=en*
或Name=wl*
。 - 设备也可以按其类型匹配。例如,Ethernet 使用
Type=ether
,Wi-Fi 使用Type=wlan
,WWAN 使用Type=wwan
。 - 请注意,
Type=ether
也将匹配虚拟以太网接口。要排除它们,请将Type=ether
与Kind=!*
结合使用。
使用 DHCP 的有线适配器
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Link] RequiredForOnline=routable [Network] DHCP=yes
使用静态 IP 的有线适配器
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Network] Address=10.1.10.9/24 Gateway=10.1.10.1 DNS=10.1.10.1
Address=
可以多次使用以配置多个 IPv4 或 IPv6 地址。有关更多选项,请参阅 #network 文件 或 systemd.network(5)。
无线适配器
为了使用 systemd-networkd 连接到无线网络,需要使用另一个应用程序(如 wpa_supplicant 或 iwd)配置的无线适配器。
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Link] RequiredForOnline=routable [Network] DHCP=yes IgnoreCarrierLoss=3s
如果无线适配器具有静态 IP 地址,则配置与 有线适配器 中的配置相同(接口名称除外)。
IgnoreCarrierLoss=3s
确保 systemd-networkd 不会因短时间(本例中为 3 秒)而重新配置接口(例如,释放并重新获取 DHCP 租约),而无线接口漫游到同一无线网络 (SSID) 内的另一个接入点,这转化为漫游时更短的停机时间。要对无线网络进行身份验证,请使用例如 wpa_supplicant 或 iwd。
同一机器上的有线和无线适配器
此设置将为有线和无线连接都启用 DHCP IP,并利用指标指令允许内核动态决定使用哪一个。这样,当有线连接被拔下时,不会观察到连接停机。
内核的路由指标(与使用 ip 配置的相同)决定了在多个匹配项的情况下使用哪个路由来发送传出数据包。当系统上的无线和有线设备都具有活动连接时,就会出现这种情况。为了打破僵局,内核使用指标。如果其中一个连接终止,则另一个连接自动获胜,而不会出现未配置任何内容的间隙(正在进行的传输可能仍然无法很好地处理此问题,但这位于不同的 OSI 层)。
systemd-networkd 不设置每接口类型默认路由指标,因此需要手动配置
/etc/systemd/network/20-wired.network
[Match] Name=enp1s0 [Link] RequiredForOnline=routable [Network] DHCP=yes [DHCPv4] RouteMetric=100 [IPv6AcceptRA] RouteMetric=100
/etc/systemd/network/25-wireless.network
[Match] Name=wlp2s0 [Link] RequiredForOnline=routable [Network] DHCP=yes [DHCPv4] RouteMetric=600 [IPv6AcceptRA] RouteMetric=600
配置文件
/etc/systemd/networkd.conf
中的全局配置文件可用于仅覆盖某些默认值。主配置是针对每个网络设备执行的。配置文件位于 /usr/lib/systemd/network/
、易失性运行时网络目录 /run/systemd/network/
和本地管理网络目录 /etc/systemd/network/
中。/etc/systemd/network/
中的文件具有最高优先级。
有三种类型的配置文件。它们都使用类似于 systemd 单元文件 的格式。
- .network 文件。它们将为匹配的设备应用网络配置
- .netdev 文件。它们将为匹配的环境创建一个虚拟网络设备
- .link 文件。当网络设备出现时,udev 将查找第一个匹配的 .link 文件
它们都遵循相同的规则
- 如果
[Match]
区段中的所有条件都匹配,则配置文件将被激活 - 空的
[Match]
区段意味着配置文件将在任何情况下都适用(可以比作*
通配符) - 所有配置文件都按字典顺序集体排序和处理,而与其所在的目录无关
- 名称相同的文件相互替换
/etc/systemd/network/
中的文件将覆盖/usr/lib/systemd/network/
中相应的系统提供的文件。可选地使用指向/dev/null
的符号链接来“屏蔽”系统文件。- systemd 接受值
1
、true
、yes
、on
表示真布尔值,以及值0
、false
、no
、off
表示假布尔值。请参阅 systemd.syntax(7)。 - systemd-networkd 也会更改其他网络软件的路由表。如果不需要这样做,请在 networkd.conf(5) 中相应地配置
ManageForeignRoutingPolicyRules=
。例如,请参阅 WireGuard#使用 systemd-networkd 后睡眠后连接丢失。
network 文件
这些文件旨在设置网络配置变量,特别是对于服务器和容器。
.network 文件具有以下区段:[Match]
、[Link]
、[Network]
、[Address]
、[Route]
和 [DHCPv4]
。以下是每个区段常用的配置键。有关更多信息和示例,请参阅 systemd.network(5)。
[Match]
参数 | 描述 | 接受的值 | 默认值 |
---|---|---|---|
Name= |
匹配设备名称,例如 en* 。通过以 ! 为前缀,可以反转列表。 |
以空格分隔的设备名称,带有 glob,逻辑非 (! ) |
|
MACAddress= |
匹配 MAC 地址,例如 MACAddress=01:23:45:67:89:ab 00-11-22-33-44-55 AABB.CCDD.EEFF |
以空格分隔的 MAC 地址,采用完整的冒号、连字符或点分隔的十六进制格式 | |
Host= |
匹配主机的hostname或machine ID。 | 带有 glob 的 hostname 字符串,machine-id(5) | |
Virtualization= |
检查系统是否在虚拟化环境中执行。Virtualization=false 将仅匹配您的主机,而 Virtualization=true 将匹配任何容器或 VM。可以检查特定的虚拟化类型或实现,或用户命名空间(使用 private-users )。 |
布尔值,逻辑非 (! ),类型 (vm , container ),实现(参见 systemd-detect-virt(1)),private-users |
[Link]
参数 | 描述 | 接受的值 | 默认值 |
---|---|---|---|
MACAddress= |
为设备分配硬件地址。对于 MAC 地址欺骗 很有用。 | 完整的冒号、连字符或点分隔的十六进制 MAC 地址 | |
MTUBytes= |
为设备设置的最大传输单元(以字节为单位)。请注意,如果在接口上启用了 IPv6,并且选择的 MTU 低于 1280(IPv6 的最小 MTU),则会自动增加到此值。设置更大的 MTU 值(例如,使用 巨型帧 时)可以显着加快您的网络传输速度 | 整数(支持常用的后缀 K、M、G,并理解为以 1024 为基数) | |
Multicast= |
允许使用 多播 | 布尔值 | ? 未记录? |
[Network]
参数 | 描述 | 接受的值 | 默认值 |
---|---|---|---|
DHCP= |
控制 DHCPv4 和/或 DHCPv6 客户端支持。 | 布尔值,ipv4 ,ipv6 |
no
|
DHCPServer= |
如果启用,将启动 DHCPv4 服务器。 | 布尔值 | no
|
MulticastDNS= |
启用 多播 DNS 支持。当设置为 resolve 时,仅启用解析,但不启用主机或服务注册和公告。 |
布尔值,resolve |
false
|
DNSSEC= |
控制链接上的 DNSSEC DNS 验证支持。当设置为 allow-downgrade 时,通过在这种情况下自动关闭 DNSSEC,可以提高与不支持 DNSSEC 的网络的兼容性。 |
布尔值,allow-downgrade |
false
|
DNS= |
配置静态 DNS 地址。可以多次指定。 | inet_pton(3) | |
Domains= |
应使用此链接上的 DNS 服务器解析的域列表。systemd.network(5) § [NETWORK] 区段选项 | 域名,可以选择以波浪号 (~ ) 为前缀 |
|
IPv4Forwarding= 和 IPv6Forwarding= |
如果启用,则根据路由表,此网络接口上的传入 (IPv4 / IPv6) 数据包将转发到任何其他接口。这控制网络接口的 net.ipv4/6.conf.INTERFACE.forwarding sysctl 选项。有关详细信息,请参阅 Internet sharing#启用数据包转发。 |
布尔值 | no
|
IPMasquerade= |
如果启用,则从网络接口转发的数据包将显示为来自本地主机。根据值,暗示 IPv6Forwarding=yes 或 IPv4Forwarding=yes 。 |
ipv4 、ipv6 、both 、no |
no
|
IPv6PrivacyExtensions= |
配置随时间变化的无状态临时地址的使用(请参阅 RFC 4941)。当 prefer-public 时,启用隐私扩展,但公共地址优先于临时地址。当 kernel 时,内核的默认设置将保持不变。 |
布尔值,prefer-public ,kernel |
no
|
[Address]
参数 | 描述 | 接受的值 | 默认值 |
---|---|---|---|
Address= |
多次指定此键以配置多个地址。除非使用 DHCP,否则为必填项。如果指定的地址为 0.0.0.0 (对于 IPv4)或 :: (对于 IPv6),则会从系统范围的未使用范围池中自动分配请求大小的新地址范围。 |
静态 IPv4 或 IPv6 地址及其前缀长度(请参阅 inet_pton(3)) |
[Route]
Gateway=
此选项为必填项,除非使用直接路由或 DHCPDestination=
路由的目标前缀,可能后跟斜杠和前缀长度Metrics=
此路由的优先级Type=
路由的类型Table=
路由的表标识符GatewayOnLink=
如果设置为yes
,则内核不必检查网关是否可由当前机器直接访问(即,连接到本地网络)。可用于解决某些路由问题。
如果 [Route]
区段中不存在 Destination
,则此区段将被视为默认路由。
[Address]
区段仅包含 Address
键,而 [Route]
区段仅包含 Gateway
键,则将 Address=
和 Gateway=
键放在 [Network]
区段中作为简写。[RoutingPolicyRule]
标准路由算法通常仅在必须选择向哪个网关发送数据包时才考虑目标地址。但对于更复杂的网络,这还不够。
[RoutingPolicyRule]
区段允许您指定仅应用于那些符合指定条件的数据包的附加规则。
以下是非详尽的匹配列表
TypeOfService=
(匹配)数据包的服务类型,为0..255
范围内的整数;From=
源地址前缀;To=
目标地址前缀;FirewallMark=
iptables 防火墙标记值;IncomingInterface=
入站设备;OutgoingInterface=
出站设备;
其他选项
Type=
路由策略数据库规则类型;Table=
如果数据包匹配规则,则要使用的路由表;Priority=
此规则的优先级。规则按优先级升序评估,因此较低优先级的规则先于其他规则应用;InvertRule=
如果设置为true
,则规则反转,即应用于每个不满足至少一个匹配条件的数据包;SuppressPrefixLength=
如果前缀长度等于或小于指定值,则抑制规则;
[DHCPv4]
参数 | 描述 | 接受的值 | 默认值 |
---|---|---|---|
UseDNS= |
控制是否使用 DHCP 服务器通告的 DNS 服务器 | 布尔值 | true
|
Anonymize= |
当为 true 时,发送到 DHCP 服务器的选项将遵循 RFC:7844(DHCP 客户端的匿名配置文件),以最大限度地减少识别信息的泄露 | 布尔值 | false
|
UseDomains= |
控制是否使用从 DHCP 服务器接收的域名作为 DNS 搜索域。如果设置为 route ,则从 DHCP 服务器接收的域名将仅用于路由 DNS 查询,而不用于搜索。当使用 systemd-resolved 时,此选项有时可以修复本地名称解析 |
布尔值,route |
false
|
IPv6OnlyMode= |
当为 true 时,DHCP 客户端将向 DHCP 服务器发出信号,表明它支持仅 IPv6 操作 (RFC:8925,DHCPv4 的仅 IPv6 首选选项)。如果 DHCPv4 服务器在其 DHCP 响应中返回该选项,则客户端将中止 DHCP 请求,不会获取 IPv4 地址,并将配置仅 IPv6 网络 | 布尔值 | 如果启用了 IPv6,则为 true |
[DHCPServer]
这是一个 DHCP 服务器配置示例,它与 hostapd 配合使用以创建无线热点效果良好。IPMasquerade
添加了 NAT 的防火墙规则,并暗示 IPv4Forwarding=yes
以启用 数据包转发。
/etc/systemd/network/wlan0.network
[Match] Name=wlan0 [Network] Address=10.1.1.1/24 DHCPServer=true IPMasquerade=ipv4 [DHCPServer] PoolOffset=100 PoolSize=20 EmitDNS=yes DNS=9.9.9.9
netdev 文件
这些文件将创建虚拟网络设备。它们有两个区段:[Match]
和 [NetDev]
。以下是每个区段常用的配置键。有关更多信息和示例,请参阅 systemd.netdev(5)。
[Match] 区段
Host=
主机名Virtualization=
检查系统是否在虚拟化环境中运行
[NetDev] 区段
最常用的键是
Name=
接口名称。必填项Kind=
例如 bridge、bond、vlan、veth、sit 等。必填项
容器的使用
当在主机系统和容器内部都使用 systemd-networkd 时,它可以为 systemd-nspawn 容器提供全自动的网络配置,使用私有网络。有关全面的概述,请参阅 systemd-nspawn#网络。
对于以下示例,
- 我们将
ip a
命令的输出限制为相关的接口, - 我们假设主机是在真实硬件上运行的主操作系统,而容器是访客系统,
- 所有接口名称和 IP 地址都只是示例。
使用 DHCP 的网络桥接
桥接接口
首先,创建一个虚拟 桥接 接口,使用 .netdev 单元文件,该文件告诉 systemd-networkd 创建一个名为 br0
的设备,该设备充当以太网桥接。
/etc/systemd/network/25-br0.netdev
[NetDev] Name=br0 Kind=bridge
可选地,将 MACAddress=none
添加到 NetDev
区段,以使桥接从其中一个桥接接口继承 MAC 地址。这也需要创建 25-br0.link 文件。
NetDev
区段中添加行 MACAddress=xx:xx:xx:xx:xx:xx
。重启 systemd-networkd.service
以使 systemd-networkd 创建桥接。
要查看主机和容器上新创建的桥接,请键入
$ ip a
3: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default link/ether ae:bd:35:ea:0c:c9 brd ff:ff:ff:ff:ff:ff
请注意,接口 br0
已列出,但在此时仍处于 DOWN 状态。
将以太网绑定到桥接
下一步是将网络接口添加到新创建的桥接。桥接的配置文件必须在桥接接口的配置文件之前加载,因此其配置文件应在字母数字顺序上优先于后者。在下面的示例中,我们将任何名称与 en*
匹配的接口添加到桥接 br0
中。
/etc/systemd/network/25-br0-en.network
[Match] Name=en* [Network] Bridge=br0
以太网接口不能具有 DHCP 或关联的 IP 地址,因为桥接需要绑定到没有 IP 地址的接口。
Name=en*
匹配接口。仅应用与接口匹配的第一个文件。桥接网络
现在桥接已创建并已绑定到现有网络接口,必须指定桥接接口的 IP 配置。这在第三个 .network 文件中定义,以下示例使用 DHCP。
/etc/systemd/network/25-br0.network
[Match] Name=br0 [Link] RequiredForOnline=routable [Network] DHCP=yes
继承 MAC 地址(可选)
为了使桥接从其中一个桥接接口继承 MAC 地址,请设置 MACAddress=none
和 MACAddressPolicy=none
。
/etc/systemd/network/25-br0.netdev
[NetDev] Name=br0 Kind=bridge MACAddress=none
/etc/systemd/network/25-br0.link
[Match] OriginalName=br0 [Link] MACAddressPolicy=none
配置容器
启动容器时使用 --network-bridge=br0
选项。 详见 systemd-nspawn#使用网络桥接 获取详细信息。
结果
- 在主机上
$ ip a
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 14:da:e9:b5:7a:88 brd ff:ff:ff:ff:ff:ff inet 192.168.1.87/24 brd 192.168.1.255 scope global br0 valid_lft forever preferred_lft forever inet6 fe80::16da:e9ff:feb5:7a88/64 scope link valid_lft forever preferred_lft forever 6: vb-MyContainer: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000 link/ether d2:7c:97:97:37:25 brd ff:ff:ff:ff:ff:ff inet6 fe80::d07c:97ff:fe97:3725/64 scope link valid_lft forever preferred_lft forever
- 在容器中
$ ip a
2: host0: <BROADCAST,MULTICAST,ALLMULTI,AUTOMEDIA,NOTRAILERS,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 5e:96:85:83:a8:5d brd ff:ff:ff:ff:ff:ff inet 192.168.1.73/24 brd 192.168.1.255 scope global host0 valid_lft forever preferred_lft forever inet6 fe80::5c96:85ff:fe83:a85d/64 scope link valid_lft forever preferred_lft forever
注意
- 我们现在为主机上的
br0
和容器中的host0
各分配了一个 IP 地址 - 出现了两个新的接口:主机中的
vb-MyContainer
和容器中的host0
。 这是--network-bridge=br0
选项的结果,详细信息请参见 systemd-nspawn#使用网络桥接。 host0
上的 DHCP 地址来自系统/usr/lib/systemd/network/80-container-host0.network
文件。- 在主机上
$ brctl show
bridge name bridge id STP enabled interfaces br0 8000.14dae9b57a88 no enp7s0 vb-MyContainer
以上命令输出证实我们有一个桥接,并绑定了两个接口。
- 在主机上
$ ip route
default via 192.168.1.254 dev br0 192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.87
- 在容器中
$ ip route
default via 192.168.1.254 dev host0 192.168.1.0/24 dev host0 proto kernel scope link src 192.168.1.73
以上命令输出证实我们已激活了 br0
和 host0
接口,并分配了 IP 地址和网关 192.168.1.254。 网关地址已由 systemd-networkd 自动获取。
具有静态 IP 地址的网络桥接
在部署 Web 服务(例如 FTP、http、SSH)的情况下,为每个设备设置静态 IP 地址可能很有用。 如果您的系统 /usr/lib/systemd/network/99-default.link
文件具有 MACAddressPolicy=persistent
选项(默认情况下是这样),则每个设备将在重启后保持相同的 MAC 地址。 此设置将网关上的任何服务路由到所需的设备。
以下配置需要为此设置完成
- 在主机上
此配置与 #具有 DHCP 的网络桥接 部分非常相似。 首先,需要创建一个虚拟桥接接口,并将主物理接口绑定到它。 此任务可以使用以下两个文件完成,其内容与 DHCP 部分中提供的文件相同。
/etc/systemd/network/MyBridge.netdev /etc/systemd/network/MyEth.network
接下来,您需要配置新创建的虚拟桥接接口的 IP 和 DNS。 例如
/etc/systemd/network/MyBridge.network
[Match] Name=br0 [Network] DNS=192.168.1.254 Address=192.168.1.87/24 Gateway=192.168.1.254
- 在容器中
要在容器上配置静态 IP 地址,我们需要覆盖系统 /usr/lib/systemd/network/80-container-host0.network
文件,该文件为容器的 host0
网络接口提供 DHCP 配置。 这可以通过将配置放置到 /etc/systemd/network/80-container-host0.network
中来完成。 例如
/etc/systemd/network/80-container-host0.network
[Match] Name=host0 [Network] DNS=192.168.1.254 Address=192.168.1.94/24 Gateway=192.168.1.254
确保在容器中 启用 了 systemd-networkd.service
。
MACVLAN 桥接
为了使主机能够访问通过 MACVLAN 连接的容器,主机本身也需要通过 MACVLAN 连接,而不是直接连接到基础以太网网络接口。
在主机上,将基础以太网网络接口附加到 MACVLAN,并确保不为其分配 IP 地址。 例如,使用 mv-0
作为 MACVLAN 接口名称,enp1s0
作为主机的以太网接口
/etc/systemd/network/30-enp1s0.network
[Match] Name=enp1s0 [Link] RequiredForOnline=carrier [Network] MACVLAN=mv-0 DHCP=no IPv6AcceptRA=false LinkLocalAddressing=no MulticastDNS=false LLMNR=false
RequiredForOnline=carrier
阻止 systemd-networkd-wait-online.service 等待(并最终失败)连接获取 IP 地址,这种情况永远不会发生。- 基础网络接口不一定必须是物理以太网接口。 例如,MACVLAN 桥接可以附加到 bond。
创建 MACVLAN 桥接 mv-0
/etc/systemd/network/25-mv-0.netdev
[NetDev] Name=mv-0 Kind=macvlan [MACVLAN] Mode=bridge
在 MACVLAN 桥接 (mv-0
) 上配置主机的网络连接。 以下示例使用 DHCP,根据需要替换选项。
/etc/systemd/network/35-mv-0.network
[Match] Name=mv-0 [Link] RequiredForOnline=routable [Network] BindCarrier=enp1s0 DHCP=yes
对于容器,将 MACVLAN 附加到基础以太网网络接口(在上面的示例中为 enp1s0
)。 例如,在 /etc/systemd/nspawn/container_name.nspawn
中指定
[Network] MACVLAN=enp1s0
对于从命令行启动的容器,将 --network-macvlan=enp1s0
选项传递给它们。
在容器中,MACVLAN 接口将具有名称 mv-underlying_interface_name
(例如 mv-enp1s0
)。 通过匹配接口名称,根据需要配置网络连接(就像在主机中一样)。 例如,使用 DHCP
/etc/systemd/network/30-mv-enp1s0.network
[Match] Name=mv-enp1s0 [Link] RequiredForOnline=routable [Network] DHCP=yes
技巧和窍门
接口和桌面集成
systemd-networkd 没有合适的交互式图形管理界面。 尽管如此,一些工具仍然可以用来显示或修改网络的当前状态、接收通知或与无线配置进行交互
- networkctl 提供了一个 命令行 shell 界面,用于查询或修改网络接口状态。 值得注意的是,为了仅更改接口行为的某些方面,需要首先 编辑
/etc/systemd/network/
中的一个或多个配置文件。 - 当 networkd 配置了 wpa_supplicant 时,wpa_cli 和 wpa_gui 都提供了动态关联和配置 WLAN 接口的能力。
- networkd-dispatcherAUR 守护程序允许执行脚本以响应网络接口状态更改,类似于 NetworkManager-dispatcher。
- 至于 DNS 解析器 systemd-resolved,可以使用
resolvectl status
可视化有关当前 DNS 服务器的信息。
根据 SSID(位置)配置静态 IP 或 DHCP
通常,您的家庭无线网络使用 DHCP,而办公室无线网络使用静态 IP。 可以按如下方式配置此混合设置
/etc/systemd/network/24-wireless-office.network
# special configuration for office Wi-Fi network [Match] Name=wlp2s0 SSID=office_ap_name #BSSID=aa:bb:cc:dd:ee:ff [Network] Address=10.1.10.9/24 Gateway=10.1.10.1 DNS=10.1.10.1 #DNS=8.8.8.8
/etc/systemd/network/25-wireless-dhcp.network
# use DHCP for any other Wi-Fi network [Match] Name=wlp2s0 [Link] RequiredForOnline=routable [Network] DHCP=yes
绑定有线和无线接口
另请参见 无线 bonding。
Bonding 允许通过多个接口共享连接,因此,例如,如果拔下有线接口,无线接口仍然连接,并且网络连接仍然无缝运行。
创建一个 bond 接口。 在这种情况下,模式为 active-backup,这意味着如果主接口发生故障,数据包将通过辅助接口路由。
/etc/systemd/network/30-bond0.netdev
[NetDev] Name=bond0 Kind=bond [Bond] Mode=active-backup PrimaryReselectPolicy=always MIIMonitorSec=1s
将有线接口设置为主接口
/etc/systemd/network/30-ethernet-bond0.network
[Match] Name=enp0s25 [Network] Bond=bond0 PrimarySlave=true
将无线接口设置为辅助接口
/etc/systemd/network/30-wifi-bond0.network
[Match] Name=wlan0 [Network] Bond=bond0
像普通接口一样配置 bond 接口
/etc/systemd/network/30-bond0.network
[Match] Name=bond0 [Link] RequiredForOnline=routable [Network] BindCarrier=enp0s25 wlan0 DHCP=yes
现在,如果拔下有线网络,连接应通过无线网络保持。
$ networkctl
IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 enp0s25 ether no-carrier configured 3 bond0 bond degraded-carrier configured 5 wlan0 wlan enslaved configured 4 links listed.
加速 TCP 慢启动
在具有中等延迟的较高带宽链路(通常是高于 10 Mbit/s 的家庭 Internet 连接)上,TCP 慢启动算法的默认设置有些保守。 此问题表现为下载开始缓慢,并且需要几秒钟才能加速到连接的完整带宽。 这在 pacman 升级中尤其明显,其中下载的每个软件包都开始缓慢,并且通常在达到连接的完整速度之前完成。
可以调整这些设置,使 TCP 连接以比默认值更大的窗口大小启动,从而避免在每个新的 TCP 连接上自动增加窗口大小所需的时间[1]。 虽然这通常会降低慢速连接的性能(或者如果值增加得太远),因为必须重新传输大量丢失的数据包,但它们可以显着提高具有足够带宽的连接的性能。
在更改这些值之前和之后进行基准测试非常重要,以确保它正在提高网络速度而不是降低网络速度。 如果您没有看到下载开始缓慢并逐渐加速,则无需更改这些值,因为它们对于您的连接速度来说已经是最佳的。 在进行基准测试时,请务必针对高速和低速远程服务器进行测试,以确保您不会以牺牲访问慢速服务器的速度为代价来加快对快速计算机的访问速度。
要调整这些值,请编辑连接的 .network 文件
/etc/systemd/network/eth0.network
[Match] Name=eth0 #[Network] #Gateway=... <-- Remove this if you have it, and put it in the Gateway= line below [Route] # This will apply to the gateway supplied via DHCP. If you manually specify # your gateway, put it here instead. Gateway=_dhcp4 # The defaults for these values is 10. They are a multiple of the MSS (1460 bytes). InitialCongestionWindow=10 InitialAdvertisedReceiveWindow=10
10
的默认值适用于速度低于 10 Mbit/s 的连接。 对于 100 Mbit/s 的连接,值 30
效果良好。 手册页 systemd.network(5) § [ROUTE] SECTION OPTIONS 说值 100
被认为是过度的。
如果 sysctl 设置 net.ipv4.tcp_slow_start_after_idle
已启用,则连接将在空闲一段时间后(通常是很短的时间)返回到这些初始设置。 如果禁用此设置,则如果数据包传输期间协商了更大的窗口,则连接将保持更高的窗口。 无论设置如何,每个新的 TCP 连接都将以上面设置的 Initial*
设置开始。
sysctl 设置 net.ipv4.tcp_congestion_control
与这些值没有直接关系,因为它控制在 TCP 链接处于活动状态时,尤其是在两个主机之间的路径拥塞且必须降低吞吐量时,如何调整拥塞窗口和接收窗口。 上述 Initial*
值只是为每个新连接选择的默认窗口值,在任何拥塞算法接管并根据需要调整它们之前。 设置更高的初始值只是捷径一些协商,而拥塞算法试图找到最佳值(或者,相反,设置错误的初始值会增加额外的协商时间,而拥塞算法致力于纠正它们,从而使每个新建立的 TCP 连接额外减慢几秒钟)。
防止多个默认路由
systemd-networkd 未设置每个接口类型的默认路由指标,即在使用多个网络设备时,需要手动配置它们。 例如,以下 ip route
显示了多个默认路由
ip route
default via 10.30.1.1 dev eno2 proto dhcp src 10.30.1.15 metric 1024 default via 192.168.1.254 dev eno1 proto dhcp src 172.18.105.104 metric 1024
由于分配了相同的默认 metric
值 1024
,因此存在竞争条件,其中选择哪个作为默认路由。 由于 eno2
设备首先启动,因此它优先,因此,可以通过 eno1
访问的内容可能会被忽略。
为了防止竞争条件,请为设备分配不同的 RouteMetric=
值。 有关相应的示例,请参见 #同一机器上的有线和无线适配器。
相反,如果一个设备不应提供默认路由,则可以使用 UseRoutes=false
选项来忽略 DHCP 服务器提供的路由。 例如,如果设备提供与单个其他机器的连接,则这可能很有用。
在现有接口上配置具有自己 MAC 地址的第二个静态 IP
要使您的计算机在路由器上显示为两个完全独立的设备,您可以创建一个虚拟接口,不仅具有不同的 IP,而且还具有不同的 MAC 地址。
为了实现此目的,在物理接口之上创建一个具有唯一 MAC 地址的虚拟接口 (macvlan)
/etc/systemd/network/25-eth210.netdev
[NetDev] Name=eth210 Kind=macvlan MACAddress=00:11:22:33:44:55 [MACVLAN] Mode=bridge
然后像往常一样添加网络文件,使用相同的子网和网关,并避免在配置静态 IP 时使用的 DHCP IP 地址范围。 例如
/etc/systemd/network/25-eth210.network
[Match] Name=eth210 [Network] Address=192.168.132.210/24 Gateway=192.168.132.1 [Route] Destination=192.168.132.0/24 Metric=2
macvlan 接口路由的指标为 2。 这确保流量将优先通过主接口,因为主接口(隐式地)具有指标为 1 的默认路由,除非专门指示使用 macvlan 接口。
最后,将 MACVLAN=eth210
添加到主接口的 .network 文件的 [Network]
部分!
此时,要让路由器了解新的 MAC(并配置路由器以接受该 MAC),一种快速方法是例如以 root 身份运行 arping -I eth210 192.168.132.1
。 在为“新设备”配置路由器后,您可以测试新接口是否可以访问互联网,例如使用 curl --interface 192.168.132.210 ifconfig.me
,然后应打印您的公共 IP 号码。
另请参阅
- systemd-networkd(8)
- Tom Gundersen 在 Core OS 博客上的帖子
- 如何使用 wpa_supplicant 设置 systemd-networkd (WonderWoofy 在 Arch 论坛上的演练)