netctl

来自 ArchWiki

netctl 是一个基于 CLI 和配置文件的网络管理器,也是一个 Arch 项目。

安装

安装 netctl 软件包。

netctl#特殊的 systemd 单元 用于自动化连接,需要一些额外的依赖项;请参阅该章节以获取更多信息。

其他可选依赖项如下表所示。

功能 依赖项
WPA wpa_supplicant
DHCP dhcpcddhclient
wifi-menu dialog
PPPoE ppp
警告: 请勿启用并发的、冲突的网络服务。使用 systemctl --type=service 确保在启用 netctl 配置文件/服务之前没有其他网络服务正在运行。

配置

netctl 使用配置文件来管理网络连接,并使用不同的操作模式来自动或手动按需启动配置文件。

netctl 配置文件存储在 /etc/netctl/ 中,示例配置文件位于 /etc/netctl/examples/ 中。

要使用示例配置文件,只需将其从 /etc/netctl/examples/ 复制到 /etc/netctl/ 并根据您的需求进行配置;请参阅下面的基本 #示例配置文件。创建配置文件的第一个参数是网络 Interface,有关详细信息,请参阅 网络配置#网络接口

提示
  • 对于无线设置,您可以以 root 身份使用 wifi-menu/etc/netctl/ 中生成配置文件。使用 wifi-menu 需要 dialog 软件包。
  • 在您的配置文件中使用 SkipNoCarrier=yes 可以在有线接口上启用静态 IP 配置文件,无论网线是否已连接。

有关完整的配置文件选项列表,请参阅 netctl.profile(5)

用法

有关完整的 netctl 命令列表,请参阅 netctl(1)

启动配置文件

创建配置文件后,尝试建立连接,其中 profile 仅是配置文件名,而不是完整路径

# netctl start profile

如果上述命令导致失败,请以 root 身份运行 journalctl -xnnetctl status profile 以获取更深入的失败原因说明。

启用配置文件

可以使用以下命令启用配置文件在启动时启动

# netctl enable profile

这将创建并启用一个 systemd 服务,该服务将在计算机启动时启动。对配置文件所做的更改不会自动传播到服务文件。进行此类更改后,需要重新启用配置文件

# netctl reenable profile

启用配置文件后,它将在下次启动时启动。显然,这只有在有线连接的网线已插入,或者配置文件中使用的无线接入点在范围内时才能成功。

如果您需要频繁切换多个配置文件(例如,携带笔记本电脑旅行),请使用 #特殊的 systemd 单元 而不是启用配置文件。

特殊的 systemd 单元

netctl 提供了特殊的 systemd 服务,用于自动切换有线和无线连接的配置文件。有关特殊的 systemd 单元的完整列表,请参阅 netctl.special(7)

有线

安装 ifplugd 软件包,并 启动/启用 netctl-ifplugd@interface.service systemd 单元。当网线插入/拔出时,将启动/停止 DHCP 配置文件。

  • netctl-ifplugd@interface.service 将优先选择使用 DHCP 的配置文件。
  • 要自动启动静态 IP 配置文件,需要在其中设置选项 ExcludeAuto=no
  • 要优先于 DHCP 配置文件使用静态 IP 配置文件,您可以设置 Priority=2,这高于 DHCP 配置文件的默认优先级 Priority=1

无线

启动/启用 netctl-auto@interface.service systemd 单元。当您从一个网络的范围内移动到另一个网络的范围内(漫游)时,netctl 配置文件将自动启动/停止。

  • 配置文件必须使用 Security=wpa-configsectionSecurity=wpa 才能与 netctl-auto 一起工作,而不是 Security=wpa-config
  • 如果您希望某些无线配置文件 netctl-auto@interface.service 自动启动,则必须显式地将 ExcludeAuto=yes 添加到该配置文件中。
  • 您可以在 WPAConfigSection 中使用 priority=(请参阅 /etc/netctl/examples/wireless-wpa-configsection)来设置多个无线接入点可用时配置文件的优先级。数字越大表示优先级越高。

请注意,interface 不是字面意思,而是要替换为您的设备接口的名称,例如 netctl-auto@wlp4s0.service。有关详细信息,请参阅 netctl.profile(5)

注意
  • 如果任何配置文件包含错误,例如空的或错误引用的 Key= 变量,则单元将无法加载,并显示消息 "Failed to read or parse configuration '/run/network/wpa_supplicant_wlan0.conf',即使该配置文件没有被使用。
  • 如果您之前通过 netctl 启用了配置文件,请运行 netctl disable profile 以防止配置文件在启动时启动两次。

可以手动控制由 netctl-auto 管理的接口,而无需停止 netctl-auto.service。这可以使用 netctl-auto 命令完成。有关可用操作的完整列表,请参阅 netctl-auto(1)

技巧与诀窍

示例配置文件

有线

对于 DHCP 连接,只需在将 /etc/netctl/examples/ethernet-dhcp 示例配置文件复制到 /etc/netctl 后配置 Interface 即可。

例如

/etc/netctl/my_dhcp_profile
Interface=enp1s0
Connection=ethernet
IP=dhcp

对于静态 IP 配置,将 /etc/netctl/examples/ethernet-static 示例配置文件复制到 /etc/netctl 并根据需要修改 InterfaceAddressGatewayDNS

例如

/etc/netctl/my_static_profile
Interface=enp1s0
Connection=ethernet
IP=static
Address=('10.1.10.2/24')
Gateway='10.1.10.1'
DNS=('10.1.10.1')

请注意包含 /24 的子网表示法。它等同于 255.255.255.0 的子网掩码,如果没有它,配置文件将无法启动。另请参阅 CIDR 表示法。要为每个 NIC 别名多个 IP 地址,请设置 Address=('10.1.10.2/24' '192.168.1.2/24')。要别名多个 DNS 服务器地址,请设置例如 DNS=('1.1.1.1' '1.0.0.1')

无线 (WPA-PSK)

以下内容适用于使用预共享密钥 (WPA-PSK) 的标准无线连接。

/etc/netctl/wireless-wpa
Description='A simple WPA encrypted wireless connection using 256-bit PSK'
Interface=wlp2s2
Connection=wireless
Security=wpa
IP=dhcp
ESSID=your_essid
Key=\"64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
注意
  • 请务必对 Key 变量使用特殊的引用规则,如 netctl.profile(5) § SPECIAL QUOTING RULES 中所述。
  • 如果密码短语失败,请尝试删除 Key 变量中的 \"
  • 虽然是“加密”的,但您放在配置文件中的密钥足以连接到 WPA-PSK 网络。因此,此过程仅用于隐藏密码短语的人类可读版本。这不会阻止任何有权读取此文件的人连接到网络。

混淆无线密码

您也可以按照以下步骤混淆无线密码短语(当使用 -o 标志时,wifi-menu 会自动执行此操作)

希望以纯文本形式存储其无线网络密码短语的用户可以选择存储相应的 256 位预共享密钥,该密钥是使用标准算法从密码短语和 SSID 计算得出的。

使用 wpa_passphrase 计算您的 256 位 PSK

$ wpa_passphrase your_essid
network={
  ssid="your_essid"
  #psk="passphrase"
  psk=64cf3ced850ecef39197bb7b7b301fc39437a6aa6c6a599d0534b16af578e04a
}

现在,预共享密钥 (psk) 需要替换配置文件中 Key 变量的纯文本密码短语。

使用实验性 GUI

如果您想要一个图形用户界面来管理 netctl 和您的连接,并且您不害怕高度实验性的非官方软件包,那么有一些选项可用。netctl-guiAUR 提供了一个基于 Qt 的图形界面、DBus 守护程序和 KDE 小部件。netmenuAUR 使用 dmenu 作为其图形界面。

还有一个应用程序可以在配置文件更改时显示桌面通知并显示托盘图标:netctl-trayAUR

链路聚合

来自 内核文档

Linux 链路聚合驱动程序提供了一种将多个网络接口聚合到单个逻辑“绑定”接口中的方法。绑定接口的行为取决于模式。一般来说,模式提供热备用或负载均衡服务。此外,还可以执行链路完整性监控。

负载均衡

/etc/netctl/examples/bonding 复制到 /etc/netctl/bond0 并对其进行编辑,例如

/etc/netctl/bond0
Description='Bond Interface'
Interface='bond0'
Connection=bond
BindsToInterfaces=('eth0' 'eth1')
IP=dhcp
IP6=stateless

现在您可以禁用旧配置并将 bond0 设置为自动启动。切换到新配置文件,例如

# netctl switch-to bond0
注意: 这使用了轮询策略,它是 bonding 驱动程序的默认策略。有关详细信息,请参阅 官方文档

在 netctl 配置中设置 MODE 并非总是成功,可能需要将选项直接传递给加载时的 bonding 模块,如 此处 所述。这可能需要使用 LACP / 模式 4。

提示: 要检查状态和链路聚合模式
$ cat /proc/net/bonding/bond0

有线到无线故障转移

此示例描述了如何在有线以太网断开连接时使用 bonding 回退到无线。当有线和无线接口都将连接到同一网络时,这最有用。您的无线路由器/接入点必须配置为 桥接 模式。

您将需要一个额外的软件包:wpa_supplicant

首先,在启动时加载模块

/etc/modules-load.d/bonding.conf
bonding

然后,配置 bonding 驱动程序的选项以使用 active-backup,并将 primary 参数配置为您希望作为活动设备的设备(通常是有线接口)。此外,请确保使用运行 ip link 时返回的相同设备名称

/etc/modprobe.d/bonding.conf
options bonding mode=active-backup miimon=100 primary=eth0 max_bonds=0

miimon 选项是链路故障检测所必需的。max_bonds 选项避免了 Interface bond0 already exists 错误。有关更多信息,请参见 内核文档

接下来,配置 netctl 配置文件以绑定两个硬件接口。使用您要绑定的所有设备的名称。如果您有多个有线或无线接口,则可以将它们全部绑定到一个绑定接口上。但是,在大多数情况下,您将只有两个设备,一个有线设备和一个无线设备

/etc/netctl/failover
Description='A wired connection with failover to wireless'
Interface='bond0'
Connection=bond
BindsToInterfaces=('eth0' 'wlan0')
IP='dhcp'

禁用您之前启用的任何其他配置文件(特别是 wired 或 wireless),然后在启动时启用故障转移配置文件

# netctl enable failover

现在,您需要配置 wpa_supplicant 以连接到您希望的任何已知网络。您应该为每个接口创建一个文件,并在 systemd 上启用它。创建以下内容的文件

/etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ctrl_interface=/run/wpa_supplicant
update_config=1

并将您要连接的任何网络附加到此文件的末尾

network={
    ssid="SSID"
    psk=PSK
}

要生成混淆的 PSK,您可以像 wpa_supplicant#使用 wpa_passphrase 连接 页面上一样运行 wpa_passphrase

现在,在网络接口上 启用 wpa_supplicant@ 模板服务,例如 wpa_supplicant@wlan0

您现在可以尝试重新启动计算机,看看您的配置是否有效。

现在,您可以通过启动大型下载来测试您的故障转移设置。拔下您的有线接口。您的下载应继续通过无线接口进行。然后,再次插入您的有线接口,它应该继续工作。您可以通过检查 journalctl 来调试 netctl@failover.servicewpa_supplicant@wlan0.service 单元。

使用任何接口

在某些情况下,可能需要允许配置文件使用系统上的任何接口。一个常见的示例用例是在具有不同硬件的许多机器上使用通用磁盘映像(如果它们是无头的,则特别有用)。如果您使用内核的命名方案,并且您的计算机只有一个以太网接口,您可能会猜到 eth0 是正确的接口。但是,如果您使用 udev 的 可预测网络接口名称,则名称将基于特定的硬件本身(例如 enp1s0)而不是硬件被检测到的顺序(例如 eth0、eth1)分配。这意味着 netctl 配置文件可能在一台机器上工作,而在另一台机器上不工作,因为它们各自具有不同的接口名称。

一种快速而粗略的解决方案是使用 /etc/netctl/interfaces/ 目录。为您的接口别名选择一个名称(在本例中为 en-any),并将以下内容写入具有该名称的文件(确保它是 可执行的)。

/etc/netctl/interfaces/en-any
#!/bin/sh
for interface in /sys/class/net/en*; do
        break;
done
Interface=$(basename "$interface")
echo "en-any: using interface $Interface";

然后创建一个使用该接口的配置文件。特别注意 Interface 指令。其余的仅作为示例提供。

/etc/netctl/wired
Description='Wired'
Interface=en-any
Connection=ethernet
IP=static
Address=('192.168.1.15/24')
Gateway='192.168.1.1'
DNS=('192.168.1.1')

当启动 wired 配置文件时,使用上述两个文件的任何机器都将自动启动并配置系统上找到的第一个以太网接口,而不管 udev 为其分配了什么名称。请注意,这不是配置接口的最可靠方法。如果您使用多个接口,netctl 可能会尝试将同一接口分配给它们,并且可能会导致连接中断。如果您不介意更复杂的解决方案,netctl-auto 可能会更可靠。

使用钩子

netctl 支持 /etc/netctl/hooks/ 中的钩子和 /etc/netctl/interfaces/ 中的每个接口的钩子。您可以在钩子/接口中设置配置文件中可以设置的任何选项。最重要的是,这包括 ExecUpPostExecDownPre

读取配置文件时,netctl 会读取 hooks 中的所有可执行脚本,然后读取连接的配置文件,最后从 interfaces 目录中读取与配置文件中使用的接口名称相同的可执行脚本。因此,接口脚本中的声明会覆盖配置文件中的声明,而配置文件中的声明会覆盖钩子中的声明。

仅当使用 netctl-auto 时,变量 $INTERFACE$ACTION 才在钩子/接口中可用

示例

在建立连接时执行命令
/etc/netctl/hooks/myservices
#!/bin/sh
ExecUpPost="systemctl start crashplan.service; systemctl start dropbox@<username>.service"
ExecDownPre="systemctl stop crashplan.service; systemctl stop dropbox@<username>.service"
设置默认 DHCP 客户端

要设置或更改所有配置文件使用的 DHCP 客户端

/etc/netctl/hooks/dhcp
#!/bin/sh
DHCPClient='dhclient'

不要忘记使该文件 可执行

或者,也可以通过创建可执行文件 /etc/netctl/interfaces/<interface> 并包含以下行来为特定网络接口指定它

DHCPClient='dhclient'

本文或章节需要扩充。

原因: 用一个通用钩子替换示例会很有用,该钩子根据 $ACTION 是 CONNECT 还是 DISCONNECT 执行不同的操作。(在 Talk:Netctl 中讨论)

最小化 WPAConfigSection

netctl.profile(5) § OPTIONS FOR ‘WIRELESS’ CONNECTIONS 中所述,WPAConfigSection 变量是一个配置行数组,传递给 wpa_supplicant。因此,最小的 WPAConfigSection 将包含

Description='A wireless connection using a custom network block configuration'
Interface=wlan0
Connection=wireless
Security=wpa-configsection
IP=dhcp
WPAConfigSection=(
    'ssid="University"'
    'psk="very secret passphrase"'
)
注意: 如果尝试连接到具有非 ASCII 字符(unicode、emoji 等)的 SSID,您可以将 SSID 指定为十六进制而不是字符串,例如 ssid=F09F90BA 表示 “🐺”。当不确定十六进制编码时,运行 wifi-menu(务必删除 \ 和 x 字符)。

/etc/resolv.conf

如果您在配置文件中使用 DNS* 选项,netctl 会调用 resolvconf 来覆盖 resolv.conf

故障排除

netctl@wlan(...).service 任务失败

警告: 本节假设在启动 netctl 配置文件/服务之前没有其他网络服务正在运行。有关详细信息,请参阅 #安装

有些人在使用 netctl 连接到网络时遇到问题,例如

# netctl start wlan0-ssid
Job for netctl@wlan0\x2ssid.service failed. See 'systemctl status netctl@wlan0\x2ssid.service' and 'journalctl -xn' for details.

当查看以 root 身份运行 journalctl -xn 的日志时,会显示以下任一项

1. 如果您的设备(在本例中为 wlan0)已启动

network[2322]: The interface of network profile 'wlan0-ssid' is already up

将接口关闭应该可以解决问题

# ip link set wlan0 down

然后重试

# netctl start wlan0-ssid

2. 如果错误仍然存在,请在添加 ForceConnect 选项后重试

/etc/netctl/wlan0-ssid
...
ForceConnect=yes

保存它并尝试连接配置文件

# netctl start wlan0-ssid

dhcpcd: ipv4_addroute: 文件已存在

在某些系统中,dhcpcd 与 netctl 结合使用会导致恢复时出现超时问题,尤其是在此期间切换网络时。netctl 将报告您已成功连接,但您仍然收到超时问题。在这种情况下,旧的默认路由仍然存在,并且没有续订。避免此错误行为的解决方法是切换到 dhclient 作为默认 dhcp 客户端。有关此问题的更多信息,请参见 此处

DHCP 超时问题

如果您在通过 DHCP 请求租约时遇到超时问题,您可以将超时值设置为高于 netctl 默认的 30 秒。在 /etc/netctl/hooks//etc/netctl/interfaces/ 中创建一个文件,向其中添加 TimeoutDHCP=40 以获得 40 秒的超时,并使该文件可执行。

dhcpcd 调试

如果 dhcpcd 未能获得地址,请将 -d 选项添加到 /usr/lib/netctl/dhcp,然后以 root 身份运行 journalctl -xe 以查看调试消息,这些消息可能表明,例如,服务器提供的 IP 地址在检测到 IP 地址已被使用后被客户端拒绝。

连接超时问题

如果您遇到与 DHCP 无关的超时问题(例如在静态以太网连接上),并且在启动配置文件时遇到类似于以下的错误

# journalctl _SYSTEMD_UNIT=netctl@profile.service
Starting network profile 'profile'...
No connection found on interface 'eth0' (timeout)
Failed to bring the network up for profile 'profile'

那么您应该通过将 TimeoutUp=TimeoutCarrier= 添加到您的配置文件中来增加载波和启动超时

/etc/netctl/profile
...
TimeoutUp=300
TimeoutCarrier=300

不要忘记重新启用您的配置文件

# netctl reenable profile

netctl-auto 在恢复后出现问题

有时,当系统从挂起、休眠或混合睡眠状态恢复时,netctl-auto 无法重新连接。一个简单的解决方案是重新启动 netctl-auto 的服务。这可以使用额外的服务自动化,如下所示

/etc/systemd/system/netctl-auto-resume@.service
[Unit]
Description=restart netctl-auto on resume.
Requisite=netctl-auto@%i.service
After=sleep.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart netctl-auto@%i.service

[Install]
WantedBy=sleep.target

要为您的无线网卡 启用 此服务,例如,以 root 身份启用 netctl-auto-resume@wlan0.service。将 wlan0 更改为所需的网络接口。

如果设备在单元启动时尚未恢复运行时,这将失败。可以通过在 After 行中添加以下依赖项来修复它

/etc/systemd/system/netctl-auto-resume@.service
...
After=sleep.target sys-subsystem-net-devices-%i.device
...

netctl-auto 不会自动解锁无线网卡以使用接口

许多笔记本电脑都有一个硬件按钮(或开关)来关闭无线网卡,但是,网卡也可能被内核阻止。这可以通过 rfkill 来处理。

如果您希望 netctl-auto 自动解锁您的无线网卡以连接到特定网络,请为您的选择的无线连接设置 RFKill=++auto++ 选项,如 netctl.profile(5) 中指定的那样。

RTNETLINK answers: File exists (使用多个 NIC)

这是一个非常误导性的响应,它实际上意味着您在早期的 netctl 控制文件中分配了默认网关。当 netctl 启动第 n 个 NIC 并设置其本地路由时,它会失败,因为已经存在来自 n-1 的默认路由。

删除它,一切正常,但您不再有默认路由,因此无法访问诸如互联网之类的东西。ExecUpPost 不起作用,因为它会为每个网卡执行。

一个可能的解决方案是创建一个新服务。将 “FIRST_INTERFACE” 和 “SECOND_INTERFACE” 替换为您的接口名称,并将 “192.168.xxx.yyy” 替换为您的默认网关。

/etc/systemd/system/defaultrouter.service
[Unit]
Description="Configure default gateway"
Requires=netctl@FIRST_INTERFACE.service netctl@SECOND_INTERFACE.service
After=netctl@FIRST_INTERFACE.service netctl@SECOND_INTERFACE.service

[Service]
Type=oneshot
ExecStart=/usr/bin/ip route add default via 192.168.xxx.yyy

[Install]
WantedBy=network-online.target

Eduroam 和其他 MSCHAPv2 连接的问题

请参阅 wpa_supplicant#Eduroam 问题

使用 .include 指令的配置文件的日志警告

仍在使用 systemd 旧的 .include 指令的配置文件将产生日志警告,例如

systemd[1]: /etc/systemd/system/netctl@<profile>.service:1: .include directives are deprecated, and support for them will be removed in a future version of systemd. Please use drop-in files instead.

有关详细信息,请参阅 FS#59494

执行

netctl reenable profile

会将配置文件更新为新的 drop-in 单元文件 格式。

钩子不起作用

如果您在 /etc/netctl/hooks/ 中有多个钩子,则变量(如 ExecUpPostExecDownPre)将仅从一个文件中执行。要解决此问题,请像这样定义变量

/etc/netctl/hooks/test
ExecUpPost="some command ; "$ExecUpPost
ExecDownPre="some command ; "$ExecDownPre

这会将您的命令附加到已定义的命令中以执行。

参见