iwd (简体中文)

From ArchWiki

翻译状态:本文是 iwd翻译。上次翻译日期:2020-08-09。如果英文版本有所更改,则您可以帮助同步翻译。

iwd (iNet wireless daemon,iNet 无线守护程序) 是由英特尔(Intel)为 Linux 编写的一个无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用 Linux 内核提供的功能来优化资源利用。[1]

iwd 可以独立工作,也可以和 ConnMansystemd-networkdNetworkManager 这样更完善的网络管理器结合使用。

安装

安装 iwd 软件包。

使用方法

iwd 软件包提供了客户端程序 iwctl、守护程序 iwd 和 WiFi 监控工具 iwmon

启动/启用 iwd.service 以便可以使用 iwctl 对其进行控制。

iwctl

要进入交互式提示符(interactive prompt),执行:

$ iwctl

然后交互式提示就会以 [iwd]# 前缀显示出来了。

提示:
  • iwctl 提示符中,可以通过 Tab 键自动补全命令和设备名称。
  • 要退出交互式提示,按下 Ctrl+d 发送 EOF 信号。
  • 可以在不进入交互式提示符的情况下,将所有命令当作命令行参数使用。例如:iwctl device wlp3s0 show

要列出所有可用的命令:

[iwd]# help

连接网络

首先,如果不知道你的网络设备名称,请列出所有 WiFi 设备:

[iwd]# device list

然后,要扫描网络,执行:

[iwd]# station device scan

再然后,就可以列出所有可用的网络:

[iwd]# station device get-networks

最后,要连接到一个网络:

[iwd]# station device connect SSID

如果要求输入网络密码,将会提示用户输入。此外,连接操作可以应用成命令行参数的形式:

$ iwctl --passphrase passphrase station device connect SSID
注意:
  • iwd 会自动将网络密码存储在 /var/lib/iwd 目录中,以后就可以使用其自动连接记住的网络。参见 #可选配置 一节。
  • 要连接 SSID 里带空格的网络,连接时请用双引号将网络名称括起来。
  • iwd 仅支持 8 到 63 位 ASCII 编码字符组成的 PSK 密码。如果没有满足要求,会出现下列错误信息:PMK generation failed. Ensure Crypto Engine is properly configured

使用 WPS/WSC 连接网络

如果网络配置为可以通过按下一个按钮就能进行连接 (Wikipedia:Wi-Fi Protected Setup,WPS,WiFi 保护配置),先检查设备是否能兼容以下配置步骤:

[iwd]# wsc list

然后,假设设备出现在了上面的列表中:

[iwd]# wsc device push-button

接着按下路由器上的按钮。如果提前按下按钮,但只要少于两分钟前,以上步骤也是可以生效的。

如果网络要求验证 PIN 码才能连接,请检查 help 命令的输出,了解如何为 wsc 命令提供正确的选项。

断开网络连接

要断开网络连接:

[iwd]# station device disconnect

显示设备和连接信息

要显示 WiFi 设备详细情况,比如 MAC 地址:

[iwd]# device device show

要显示包括 WiFi 设备的连接网络在内的连接状态:

[iwd]# station device show

管理已知网络

要列出以前连接过的网络:

[iwd]# known-networks list

要忘记已知的网络:

[iwd]# known-networks SSID forget

WPA Enterprise

EAP-PWD

为了连接到受 EAP-PWD 保护的企业(无线)访问接入点 (Access Point, AP),需要在 /var/lib/iwd 文件夹中创建一个 essid.8021x 格式的文件,并包含以下内容:

/var/lib/iwd/essid.8021x
[Security]
EAP-Method=PWD
EAP-Identity=your_enterprise_email
EAP-Password=your_password

[Settings]
AutoConnect=True

如果不想自动连接到 AP,可以将相应选项设定为 False 并手动通过 iwctl 连接网络。密码同理,如果不想让密码以明文保存,则将相应选项从文件中删去,直接连接企业 AP。

EAP-PEAP

和 EAP-PWD 一样,同样需要在同一文件夹中创建一个 essid.8021x 格式的文件。在继续编写配置文件之前,不妨了解一下自己所属组织所使用的 CA 证书。下面是一个使用 MSCHAPv2 密码认证的示例配置文件:

/var/lib/iwd/essid.8021x
[Security]
EAP-Method=PEAP
[email protected]
EAP-PEAP-CACert=/path/to/root.crt
EAP-PEAP-ServerDomainMask=radius.realm.edu
EAP-PEAP-Phase2-Method=MSCHAPV2
[email protected]
EAP-PEAP-Phase2-Password=hunter2

[Settings]
AutoConnect=true
注意: 如果打算使用 eduroam,另请参见 #Eduroam

TTLS-PAP

和 EAP-PWD 一样,同样需要在同一文件夹中创建一个 essid.8021x 格式的文件。在继续编写配置文件之前,不妨了解一下自己所属组织所使用的 CA 证书。下面是一个使用 PAP 密码认证的示例配置文件:

/var/lib/iwd/essid.8021x
[Security]
EAP-Method=TTLS
[email protected]
EAP-TTLS-CACert=cert.pem
EAP-TTLS-ServerDomainMask=*.uni-test.de
EAP-TTLS-Phase2-Method=Tunneled-PAP
EAP-TTLS-Phase2-Identity=user
EAP-TTLS-Phase2-Password=password

[Settings]
AutoConnect=true

Eduroam

Eduroam 提供了一个 配置助手工具 (Configuration Assistant Tool,CAT), 遗憾的是它并不支持 iwd。但是,CAT 的安装程序只是一个 Python 脚本,可以通过点击下载按钮,然后选择你的大学来下载它。可以很轻易地提取出必要的配置选项,包括证书和服务域掩码。

下列的表格包含了 iwd 配置选项到 Eduroam CAT 安装脚本变量的映射关系:

Iwd 配置选项 CAT 脚本变量
文件名 某个 Config.ssids 文件
EAP-Method Config.eap_outer
EAP-Identity Config.email
EAP-PEAP-CACert Config.CA
EAP-PEAP-ServerDomainMask one of Config.servers
EAP-PEAP-Phase2-Method Config.eap_inner
EAP-PEAP-Phase2-Identity username@Config.user_realm
注意: Eduroam 提供方可能不要求使用 EAP-Identity,在这种情况下可以在选项字段里写上 anonymous

其他情况

更多测试范例可在上游仓库的 测试案例中找到

可选配置

文件 /etc/iwd/main.conf 用于存储主要配置。参见 iwd.config(5)

默认情况下,iwd 将网络配置存储在 /var/lib/iwd 目录中。配置文件名格式为 network.type,其中 network 指网络的 SSID,而 type 指的是网络类型(即 "open"、"wep"、"psk" 和 "8021x" 四种类型的其中一种)。这个文件用于存储加密的 PreSharedKey(预共享密钥)和明文的 Passphrase(网络密码),用户可自行创建,而无需调用 iwctl。它还可以用于存储与该网络 SSID 相关的其他配置。有关更多设置,请参阅 iwd.network(5)

下面是一个最精简的示例文件,演示了如何连接到一个 SSID 为 "spaceship" 和密码为 "test1234" 的 WPA2/PSK 安全网络:

/var/lib/iwd/spaceship.psk
[Security]
PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295

PreSharedKey(预共享密钥)可以使用 wpa_passphrase (来源于 wpa_supplicant) 或 wpa-pskAUR 从 SSID 和 WiFi 密码计算得出:

$ wpa_passphrase spaceship test1234
network={
        ssid="spaceship"
        #psk="test1234"
        psk=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
}
注意:
  • 如果 SSID 中包含空格或其他特殊字符,必须要用引号括起来,Shell 才能正确将其传递给 wpa_passphrase
  • 当且仅当网络的 SSID 包含字母数字字符或 - _ 两者之一时,才用作文件名。如果其中包含任何其他字符,则会被改为一个 =-字符,后跟十六进制编码文本的形式。

禁用特定网络的自动连接

创建或编辑 /var/lib/iwd/network.type 文件。在其中添加如下部分:

/var/lib/iwd/spaceship.psk (for example)
[Settings]
AutoConnect=false

禁用定期扫描可用网络

默认情况下,当 iwd 处于未连接状态时,它会定期扫描可用网络。要禁用定期扫描(以便总是手动扫描网络),创建或编辑 /etc/iwd/main.conf 文件并添加以下部分:

/etc/iwd/main.conf
[Scan]
DisablePeriodicScan=true

启用内置网络配置

自 0.19 版本起,iwd 可使用内置的 DHCP 客户端或静态配置来分配(多个)IP 地址并设置路由。它是 独立 DHCP 客户端 不错的替代品。

要激活 iwd 的网络配置功能,创建或编辑 /etc/iwd/main.conf 并添加以下部分:

/etc/iwd/main.conf
[General]
EnableNetworkConfiguration=true

还可以用 route_priority_offset 设置路由指标(route metric):

/etc/iwd/main.conf
[General]
route_priority_offset=300

在网络配置中设定静态 IP 地址

将下列部分添加到 /var/lib/iwd/network.type 文件中。例如可以这样写:

/var/lib/iwd/spaceship.psk
[IPv4]
ip=192.168.1.10
netmask=255.255.255.0
gateway=192.168.1.1
broadcast=192.168.1.255
dns=192.168.1.1

选择 DNS 管理器

目前,iwd 支持两种 DNS 管理器 —— systemd-resolvedresolvconf

要使用 systemd-resolved,将下列部分添加到 /etc/iwd/main.conf 中:

/etc/iwd/main.conf
[Network]
NameResolvingService=systemd

而对于 resolvconf,添加的为:

/etc/iwd/main.conf
[Network]
NameResolvingService=resolvconf

拒绝控制台(本地)用户修改设置

默认情况下 iwd D-Bus 接口允许 任何 控制台用户连接到 iwd 守护程序并修改配置,即使该用户不是 root 用户。

如果不想让控制台用户修改设置,但允许读取状态信息,请按如下所示创建一个 D-Bus 配置。

/etc/dbus-1/system.d/iwd-strict.conf
<!-- prevent local users from changing iwd settings, but allow
     reading status information. overrides some part of
     /usr/share/dbus-1/system.d/iwd-dbus.conf. -->

<!-- This configuration file specifies the required security policies
     for iNet Wireless Daemon to work. -->

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>

  <policy at_console="true">
    <deny send_destination="net.connman.iwd"/>
    <allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.Properties" send_member="GetAll" />
    <allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.Properties" send_member="Get" />
    <allow send_destination="net.connman.iwd" send_interface="org.freedesktop.DBus.ObjectManager" send_member="GetManagedObjects" />
    <allow send_destination="net.connman.iwd" send_interface="net.connman.iwd.Device" send_member="RegisterSignalLevelAgent" />
    <allow send_destination="net.connman.iwd" send_interface="net.connman.iwd.Device" send_member="UnregisterSignalLevelAgent" />
  </policy>

</busconfig>
提示: 移除上面的<allow> 行可连同拒绝读取状态信息。

故障排除

详细 TLS 调试

如果在配置 MSCHAPv2 或 TTLS 时遇到困难,这会很有用。可以通过一个 附加配置片段 来设定以下环境变量

/etc/systemd/system/iwd.service.d/tls-debug.conf
[Service]
Environment=IWD_TLS_DEBUG=TRUE

之后通过 journalctl -u iwd.service 命令检查 iwd 日志。

重启后出现连接问题

较低的熵池可能会导致连接问题,特别是在重启之后。请参阅 随机数生成 获取如何增大熵池的建议。

由于设备不可用,systemd 单元启动失败

一些用户曾报告说,iwd 提供的 systemd 单元没有等待无线设备可用(就开始启动了)[2]。不幸的是,如果在 udev 重命名完成前 iwd 就启动了,网络设备会被拦截并且导致重命名失败。因此,单元启动失败[3]。这个问题可通过在 /etc/iwd/main.conf 中添加以下选项来解决,通过强制 iwd 进入传统模式(legacy mode),从而不重命名新检测到的设备:

/etc/iwd/main.conf
[General]
use_default_interface=true

也可以选择通过创建一个带有以下内容的 systemd 单元,将 iwd(服务)绑定到指定设备上。截至 0.21 版本,已经观察到这不会阻止 iwd 在稍后重命名无线设备,因此必须使用 iwd 的传统模式:

/etc/systemd/system/[email protected]
[Unit]
Description=Wireless service on %I
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=dbus
BusName=net.connman.iwd
ExecStart=/usr/lib/iwd/iwd --interface %i
LimitNPROC=1
Restart=on-failure

然后,禁用 iwd.service 并为指定设备 device 启用 iwd@device.service 单元。

此外,还可以通过创建如下 附加配置文件,为 iwd 设定适当的依赖,使其在 systemd/udevd 之后运行:[4]

Tango-inaccurate.pngThe factual accuracy of this article or section is disputed.Tango-inaccurate.png

Reason: Is "After=network-pre.target" needed? If so, is "After=systemd-udevd" even needed? This solution does not seem to work for all cases. See [5] and systemd.special(7). (Discuss in Talk:Iwd (简体中文))
/etc/systemd/system/iwd.service.d/override.conf
[Unit]
After=systemd-udevd.service

如果使用了 systemd-networkd,因为 systemd-udevd/networkd 两者都能相对较好地一起工作,且两者都有参与,所以可以在这两者之后启动 iwd,是合理的:

/etc/systemd/system/iwd.service.d/override.conf
[Unit]
After=systemd-udevd.service systemd-networkd.service

参见 FS#61367

无线设备没有被 udev 重命名

iwd 升级到 1.0 版本后引入了 systemd 网络链路配置文件:

/usr/lib/systemd/network/80-iwd.link
[Match]
Type=wlan

[Link]
NamePolicy=keep kernel

这可以防止 udev 将接口重命名为 wlp#s#。因此,无线链路名称在系统启动后会被保留。

如果这会导致问题,请尝试用以下方法屏蔽它:

# ln -s /dev/null /etc/systemd/network/80-iwd.link

另请参阅