跳转至内容

systemd-networkd

来自 ArchWiki

systemd-networkd 是一个管理网络配置的系统守护进程。它可以在网络设备出现时对其进行检测和配置;它还可以创建虚拟网络设备。此服务在为 systemd-nspawn 管理的容器或虚拟机设置复杂网络配置时特别有用。它同样适用于简单的连接。

安装

systemd 是 Arch 默认安装的一部分,包含了运行有线网络所需的所有文件。无线适配器(将在本文稍后介绍)可以通过 wpa_supplicantiwd 等服务进行设置。

所需服务与设置

要使用 systemd-networkd,请 启动/启用 systemd-networkd.service

注意 每个网络接口应仅由一个 DHCP 客户端或网络管理器管理,因此建议在系统上仅运行一个 DHCP 客户端或网络管理器。使用 systemctl --type=service 查看当前运行的服务列表,然后 停止 或重新配置那些冲突的服务。

可选配置 systemd-resolved,这是一个为本地应用程序提供网络名称解析的服务,请考虑以下几点:

  • 了解 resolv.confsystemd-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

用法

本条目或章节是合并至 #配置 的候选对象。

注:解释配置文件如何工作的内容属于配置章节。(讨论请见 Talk:Systemd-networkd

本文章或章节需要扩充。

原因:添加 networkctl 命令并简化从以前的“配置文件”章节合并的内容(讨论请见 Talk:Systemd-networkd

/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=etherKind=!*
提示
  • /etc/systemd/network/ 中的文件会覆盖 /usr/lib/systemd/network/ 中对应的系统提供文件。可以选择使用指向 /dev/null 的符号链接来“屏蔽 (mask)”系统文件。
  • systemd 对布尔值“真”接受 1trueyeson,对布尔值“假”接受 0falsenooff。参见 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_supplicantiwd)配置无线适配器。

/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_supplicantiwd

同一机器上的有线和无线适配器

此设置将为有线和无线连接启用 DHCP IP,并利用 metric 指令允许内核即时决定使用哪一个。这样,当拔掉有线连接时,不会观察到连接中断。

内核的路由度量(与使用 ip 配置的一样)决定了在多个路由匹配时,出口数据包使用哪条路由。当系统上的无线和有线设备都有活动连接时就是这种情况。为了打破僵局,内核使用度量值。如果其中一个连接终止,另一个会自动获胜,而不会出现没有任何配置的空隙(正在进行的传输可能仍然无法很好地处理此问题,但这属于不同的 OSI 层)。

systemd-networkd 不会设置每接口类型的默认路由度量,因此需要手动配置。

注意 Metric 选项用于静态路由,而 RouteMetric 选项用于不使用静态路由的设置。更多详情参见 systemd.network(5)
/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 配合良好,可用于创建无线热点。IPMasqueradeNAT 添加了防火墙规则,并隐含了 IPv4Forwarding=yes 以启用 数据包转发

本文或本章节的准确性存在争议。

原因: IPMasquerade=ipv4 不会为 filter 表添加规则,它们必须手动添加。参见 systemd-nspawn#使用虚拟以太网链路。(讨论请见 Talk:Systemd-networkd
/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#网络

提示 在宿主机上 启动 systemd-networkd.service 即足以为使用默认 虚拟以太网链路设置的容器提供所述的网络自动配置。以下内容仅在其他私有网络场景下需要。

对于下面的示例,

  • 我们将 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 文件。

提示 systemd-networkd 会根据接口名称和机器 ID 为网桥分配一个 MAC 地址。这可能会导致连接问题,例如在使用基于 MAC 过滤的路由时。为了规避此类问题,请为您的网桥分配一个 MAC 地址,通常与您的物理设备相同,并在上面的 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 地址。

注意 确保没有其他 .network 文件尝试按 Name=en* 匹配接口。仅会应用第一个匹配接口的文件。

网桥网络

现在网桥已创建并绑定到现有网络接口,必须指定网桥接口的 IP 配置。这是在第三个 .network 文件中定义的,下例使用 DHCP。

/etc/systemd/network/25-br0.network
[Match]
Name=br0

[Link]
RequiredForOnline=routable

[Network]
DHCP=yes

继承 MAC 地址(可选)

为了让网桥从其中一个桥接接口继承 MAC 地址,请设置 MACAddress=noneMACAddressPolicy=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 已弃用,请使用 bridge link。参见 网络网桥#使用 iproute2。(讨论请见 Talk:Systemd-networkd
$ 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 的 br0host0 接口。网关地址已被 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/ 中的一个或多个配置文件。
  • networkdwpa_supplicant 配置在一起时,wpa_cliwpa_gui 都提供了动态关联和配置 WLAN 接口的能力。
  • networkd-dispatcherAUR 守护进程允许执行脚本以响应网络接口状态的变化,类似于 NetworkManager-dispatcher
  • networkd-notify-gitAUR 在接口更改时创建简单的通知消息。
  • 至于 DNS 解析器 systemd-resolved,有关当前 DNS 服务器的信息可以使用 resolvectl status 可视化。

基于 SSID(位置)配置静态 IP 或 DHCP

通常会出现这种情况:您的家庭无线网络使用 DHCP,而办公室无线网络使用静态 IP。这种混合设置可以配置如下:

注意 文件名中的数字决定了文件的处理顺序。用户可以根据 SSID 或 BSSID(或两者)进行 [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
注意[Match] 部分使用 MAC 地址时,建议使用 PermanentMACAddress 而不是 MACAddress,参见 此上游讨论

像普通接口一样配置绑定接口

/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

由于分配了相同的默认 metric1024,因此存在一个竞争条件,即两者中哪一个被选为默认路由。由于 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 号码。

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.