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,这是一个 oneshot 系统服务,用于等待网络配置完成。后者具有 WantedBy=network-online.target,因此只有在 network-online.target 本身被启用或被其他单元拉入时才会启动。另请参阅 systemd#在网络启动后运行服务。
默认情况下,systemd-networkd-wait-online.service 会等待所有由 systemd-networkd 管理的链路完全配置完成或失败,并确保至少有一个链路处于在线状态。
详情请参见 systemd-networkd-wait-online(8)。
配置
systemd 网络文件示例
启用网络接口的一种快捷方式是使用 /usr/lib/systemd/network/ 中提供的 .example 文件。例如,要启用 Wi-Fi 和以太网,您可以创建指向这些示例文件的符号链接。
# ln -s /usr/lib/systemd/network/80-wifi-station.network.example /etc/systemd/network/80-wifi-station.network # ln -s /usr/lib/systemd/network/89-ethernet.network.example /etc/systemd/network/89-ethernet.network
您可以使用 networkctl 添加任何自定义配置。参见 #networkctl 小节。
并非始终连接的多个接口
对于具有多个并非始终连接的网络接口的系统(例如:双口以太网卡但只插了一根线),systemd-networkd-wait-online.service 将在默认的 2 分钟超时后失败。这可能会导致启动过程中出现不必要的延迟。要将行为更改为等待“任意”接口而不是“所有”接口上线,请 编辑 该服务,并在 ExecStart 行添加 --any 参数。
/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。
.network 配置文件 Link 部分中使用 RequiredForOnline=no。参见 systemd.network(5) § [LINK] 部分选项。等待网络接口获取可路由地址
根据 systemd-networkd-wait-online.service(8),“在线意味着链路的操作状态等于或高于‘降级 (degraded)’。”(参见 networkctl(1) 获取关于“降级”和其他操作状态的定义)。
要防止 systemd-networkd-wait-online.service 在网络接口获取到可路由 IP 地址之前退出(从而避免其他需要网络连接的服务启动过早),请在 .network 文件的 [Link] 部分中添加 RequiredForOnline=routable。
[Link] RequiredForOnline=routable
等待 DNS 服务器可达
systemd-networkd-wait-online.service(8) 可以延迟到所有已配置的接口都能连接到其 DNS 服务器为止。这提高了在达到 network-online.target 时 DNS 已能正常工作的可能性,并确保在它之后排序的单元能顺利启动。
要启用此功能,请 编辑 systemd-networkd-wait-online.service 并在 ExecStart 行添加 --dns 选项。
/etc/systemd/system/systemd-networkd-wait-online.service.d/wait-for-dns.conf
[Service] ExecStart= ExecStart=/usr/lib/systemd/systemd-networkd-wait-online --dns
用法
/etc/systemd/networkd.conf 中的全局配置文件仅可用于覆盖某些默认值。主要配置是针对每个网络设备进行的。配置文件位于 /usr/lib/systemd/network/、临时运行时的网络目录 /run/systemd/network/ 以及本地管理的网络目录 /etc/systemd/network/。/etc/systemd/network/ 中的文件具有最高优先级。
共有三种类型的配置文件。它们都使用类似于 systemd 单元文件的格式。
- .network 文件
- 它们将为匹配的设备应用网络配置。参见 systemd.network(5) 手册页。
- .netdev 文件
- 它们将为匹配的环境创建虚拟网络设备。参见 systemd.netdev(5) 手册页。
- .link 文件
- 当网络设备出现时,udev 将寻找第一个匹配的 .link 文件。参见 systemd.link(5) 手册页。
它们都遵循相同的规则:
- 如果
[Match]部分中的所有条件都匹配,则配置文件将被激活。 - 空的
[Match]部分意味着配置文件在任何情况下都适用(可以类比为*通配符)。 - 所有配置文件会统一按字母顺序排序和处理,无论它们位于哪个目录下。
- 同名的文件会相互覆盖。
修改配置文件后,请 重启 systemd-networkd.service。
- 配置文件中的选项区分大小写。
- 在下面的示例中,
enp1s0是有线适配器,wlp2s0是无线适配器。这些名称在不同系统上可能有所不同。参见 网络配置#网络接口 和 网络配置#更改接口名称。 - 也可以使用通配符,例如
Name=en*或Name=wl*。 - 设备也可以按类型匹配。例如,
Type=ether用于以太网,Type=wlan用于 Wi-Fi,Type=wwan用于 WWAN。 - 请注意,
Type=ether也会匹配虚拟以太网接口。要排除它们,请结合使用Type=ether和Kind=!*。
/etc/systemd/network/中的文件会覆盖/usr/lib/systemd/network/中对应的系统提供文件。可以选择使用指向/dev/null的符号链接来“屏蔽 (mask)”系统文件。- systemd 对布尔值“真”接受
1、true、yes、on,对布尔值“假”接受0、false、no、off。参见 systemd.syntax(7)。 - systemd-networkd 也会修改其他网络软件的路由表。如果这不是所期望的,请在 networkd.conf(5) 中相应地配置
ManageForeignRoutingPolicyRules=。例如,参见 WireGuard#使用 systemd-networkd 后休眠连接丢失。
networkctl
您可以使用 networkctl 查询或修改网络链路的状态。
$ networkctl
IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 wlo1 wlan routable unmanaged 3 tailscale0 none routable unmanaged 4 enp0s20f0u1 ether routable unmanaged
例如,为 Wi-Fi 接口启用多播 DNS:
# networkctl edit @wlan0 --drop-in mdns
[Network] MulticastDNS=true
将 wlan0 替换为您的稳定接口名称或指定完整路径。参见 networkctl(1)。
使用 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 Address=2001:db8:1234:5678::1/64 Gateway=10.1.10.1 Gateway=fe80::1 DNS=10.1.10.1 DNS=2001:db8:1122::3344:1
Address= 可以多次使用以配置多个 IPv4 或 IPv6 地址。更多选项参见 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 在无线接口漫游到同一无线网络(SSID)内的另一个接入点时,不会在短时间内(本例中为 3 秒)重新配置接口(例如,释放并重新获取 DHCP 租约),从而缩短漫游时的停机时间。要认证无线网络,请使用例如 wpa_supplicant 或 iwd。
同一机器上的有线和无线适配器
此设置将为有线和无线连接启用 DHCP IP,并利用 metric 指令允许内核即时决定使用哪一个。这样,当拔掉有线连接时,不会观察到连接中断。
内核的路由度量(与使用 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
DHCP 服务器
这是一个 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 DNS=9.9.9.9
所有可用选项参见 systemd.network(5) § [DHCPSERVER] 部分选项。
添加辅助路由和网关
在单个接口上添加第二个地址和特定子网的辅助网关。
/etc/systemd/network/eth0.network
[Match] Name=eth0 [Network] Address=10.1.0.2/24 Address=10.1.1.2/24 Gateway=10.1.0.1 [Route] Destination=10.10.0.0/16 Gateway=10.1.0.5
在容器中使用
当 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
可选地,在 NetDev 部分添加 MACAddress=none,使网桥从其中一个桥接接口继承 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
Notice
- 现在我们在宿主机上为
br0有一个 IP 地址,在容器中为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
上面的命令输出确认我们已经激活了带有 IP 地址和网关 192.168.1.254 的 br0 和 host0 接口。网关地址已被 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。
- networkd-notify-gitAUR 在接口更改时创建简单的通知消息。
- 至于 DNS 解析器 systemd-resolved,有关当前 DNS 服务器的信息可以使用
resolvectl status可视化。
基于 SSID(位置)配置静态 IP 或 DHCP
通常会出现这种情况:您的家庭无线网络使用 DHCP,而办公室无线网络使用静态 IP。这种混合设置可以配置如下:
[Match]。/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
绑定有线和无线接口
另请参阅 无线绑定。
绑定允许通过多个接口进行连接共享,因此如果例如拔掉有线接口,无线接口仍处于连接状态,网络连接将无缝保持。
创建一个绑定接口。在本例中模式为 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
像普通接口一样配置绑定接口
/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 的家庭互联网连接),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] 部分选项 称 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= 值。参见 #同一机器上的有线和无线适配器 获取对应的示例。
如果某个设备不应该提供默认路由,则可以使用 [DHCPv4] 和 [IPv6AcceptRA] 部分中的 UseGateway=false 选项来省略创建由 DHCP/RA 服务器提供的默认路由,同时保留其他无类的静态路由。这可能很有用,例如,如果该设备仅提供到另一台机器的连接。
在现有接口上配置具有独立 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 (Arch 论坛上 WonderWoofy 的演练)