iwd (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

翻译状态:本文是 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
EAP-Identity=anonymous@realm.edu
EAP-PEAP-CACert=/path/to/root.crt
EAP-PEAP-ServerDomainMask=radius.realm.edu
EAP-PEAP-Phase2-Method=MSCHAPV2
EAP-PEAP-Phase2-Identity=johndoe@realm.edu
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
EAP-Identity=anonymous@uni-test.de
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/iwd@.service
[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

另请参阅