iwd
iwd (iNet wireless daemon) 是由英特尔开发的一个用于 Linux 的无线守护进程。该项目的核心目标是通过不依赖任何外部库,而是最大程度地利用 Linux 内核提供的功能来优化资源利用率。
iwd 可以独立运行,也可以与综合网络管理器配合使用,例如 ConnMan、systemd-networkd 和 NetworkManager。
安装
此外,还可以选择安装第三方图形界面或终端用户界面前端:
- impala — iwd 的终端用户界面 (TUI)。
- iwdgui — iwd 的图形界面前端。
- iwgtk — iwd 的图形界面前端及托盘图标。
- iwmenu — iwd 的菜单式界面。
- iwqt — Linux 系统的 iwd 网络小程序。
用法
iwd 软件包提供了客户端程序 iwctl、守护进程 iwd 和 Wi-Fi 监控工具 iwmon。
启动/启用 iwd.service,以便可以通过 iwctl 命令或您首选的 iwd 前端进行控制。
iwctl
要进入交互提示符,请执行:
$ iwctl
交互提示符显示为 [iwd]# 前缀。
- 在
iwctl提示符下,可以通过按Tab键自动补全命令、设备名称和 SSID。 - 要退出交互提示符,请按
Ctrl+d发送 EOF。 - 您可以将所有命令作为命令行参数使用,而无需进入交互提示符。例如:
iwctl device wlan0 show。
列出所有可用命令:
[iwd]# help
连接到网络
首先,如果您不知道无线设备名称,请列出所有 Wi-Fi 设备:
[iwd]# device list
如果设备或其对应的适配器已关闭,请将其打开:
[iwd]# device name set-property Powered on
[iwd]# adapter adapter set-property Powered on
然后,发起网络扫描(注意此命令不会有任何输出):
[iwd]# station name scan
接着,列出所有可用网络:
[iwd]# station name get-networks
最后,连接到网络:
[iwd]# station name connect SSID
如果是隐藏网络:
[iwd]# station name connect-hidden SSID
如果需要密码(且该密码尚未存储在 iwd 自动检查的配置文件中),系统将提示您输入。或者,您可以将其作为命令行参数提供:
$ iwctl --passphrase passphrase station name connect SSID
iwd会自动将网络密码存储在/var/lib/iwd目录中,并在将来自动连接时使用。参见 #网络配置。- 要连接到 SSID 中包含空格的网络,连接时应将网络名称置于双引号中。
- iwd 仅支持 8 到 63 个 ASCII 字符的 PSK 密码。如果要求未满足,将出现以下错误信息:
PMK generation failed. Ensure Crypto Engine is properly configured。
使用 WPS/WSC 连接到网络
如果您的网络配置支持通过按键连接(维基百科:Wi-Fi Protected Setup),请先检查您的网络设备是否支持此设置步骤。
[iwd]# wsc list
然后,确认设备出现在列表中后,执行:
[iwd]# wsc device push-button
并按下路由器上的按钮。如果在 2 分钟之前按下按钮,该过程同样有效。
如果网络需要验证 PIN 码才能连接,请查看 help 命令输出,了解如何为 wsc 命令提供正确选项。
断开网络连接
断开网络连接:
[iwd]# station device disconnect
显示设备和连接信息
显示 Wi-Fi 设备详情(如 MAC 地址):
[iwd]# device device show
显示连接状态,包括 Wi-Fi 设备连接的网络:
[iwd]# station device show
管理已知网络
列出之前连接过的网络:
[iwd]# known-networks list
忘记已知网络:
[iwd]# known-networks SSID forget
iwgtk
或者,iwgtkAUR 提供了图形界面前端,通过它即可控制 iwd。
运行不带任何参数的 iwgtk 将启动应用程序窗口,可用于切换适配器和设备开关、更改操作模式、查看可用网络、连接网络及管理已知网络。
托盘图标
要启动 iwgtk 的托盘图标守护进程,请运行:
$ iwgtk -i
如果托盘图标未出现,说明您的系统托盘可能缺少对 StatusNotifierItem API 的支持,此时您需要运行兼容层,如 snixembed-gitAUR。
以下系统托盘支持 StatusNotifierItem,因此无需额外配置:
- KDE Plasma
- swaybar
- lxqt-panel
- xfce4-panel
以下托盘仅支持 XEmbed,因此需要 snixembed-gitAUR:
- AwesomeWM
- i3bar
- stalonetray
自启动
iwgtk 最常见的用法是每次登录桌面时启动托盘守护进程。如果您的桌面环境支持 XDG 自启动标准,则由于 AUR 软件包已将 iwgtk-indicator.desktop 文件放置在 /etc/xdg/autostart/ 中,该进程应自动运行。
或者,AUR 软件包也提供了用于启动托盘守护进程的 systemd 单元文件。如果您的桌面环境支持 systemd 的 graphical-session.target 单元,那么可以通过启用 iwgtk.service 用户单元来通过 systemd 实现自启动。
网络配置
默认情况下,iwd 将网络配置存储在 /var/lib/iwd 目录中。配置文件命名为 network.type,其中 network 是网络 SSID,.type 是网络类型(.open、.psk 或 .8021x)。该文件用于存储加密的 PreSharedKey 以及可选的明文 Passphrase,用户无需调用 iwctl 即可手动创建。该文件也可用于与该 SSID 相关的其他配置。更多设置,请参见 iwd.network(5)。
WPA-PSK
连接到 SSID 为 "spaceship"、密码为 "test1234" 的 WPA-PSK 或 WPA2-PSK 网络的一个最小化示例文件:
/var/lib/iwd/spaceship.psk
[Security] PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
- _ 时,才将其用作文件名。如果包含其他字符,文件名将是一个 = 字符后跟 SSID 的十六进制编码(十六进制数字使用小写字母)。若要从密码计算预共享密钥,可以使用以下两种方法之一:
- 在配置文件中以明文输入密码:
/var/lib/iwd/spaceship.psk
[Security] Passphrase=test1234
- 预共享密钥将在首次连接时自动附加到文件中。
/var/lib/iwd/spaceship.psk
[Security] Passphrase=test1234 PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
- 或者,可以使用 wpa_passphrase(来自 wpa_supplicant)或 wpa-pskAUR 从 SSID 和密码中计算预共享密钥。有关详情,请参见 wpa_supplicant#Connecting with wpa_passphrase。
WPA 企业版
EAP-PWD
连接到 EAP-PWD 保护的企业接入点,需在 /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,可以将 AutoConnect 选项设置为 False,并通过 iwctl 手动连接到接入点。密码设置同理,如果您不想以明文存储密码,请省略该选项,直接连接企业 AP 即可。
AutoConnect=false。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
MsCHAPv2 密码也可以存储为加密哈希。正确的 md4 哈希计算方法如下:
$ iconv -t utf16le | openssl md4 -provider legacy
输入密码后按 Ctrl+d 插入 EOF,请勿按 Enter。生成的哈希需存储在 EAP-PEAP-Phase2-Password-Hash 键中。
TTLS-PAP
与 EAP-PWD 一样,您也需要在目录中创建一个 essid.8021x 文件。在编写配置文件之前,请确认您组织使用的 CA 证书。以下是使用 PAP 密码认证的示例配置文件:
/var/lib/iwd/essid.8021x
[Security] EAP-Method=TTLS EAP-Identity=anonymous@uni-beispiel.de EAP-TTLS-CACert=cert.pem EAP-TTLS-ServerDomainMask=*.uni-beispiel.de EAP-TTLS-Phase2-Method=Tunneled-PAP EAP-TTLS-Phase2-Identity=user EAP-TTLS-Phase2-Password=password [Settings] AutoConnect=true
EAP-TLS
EAP-TLS 使用 x509 客户端证书 进行身份验证。与 SSH 密钥类似,它们使用公钥加密技术,因此 Wi-Fi 认证服务器永远不需要发送密钥,也不需要在不同设备间复制和重用密码。通常每个设备使用不同的证书,理论上可以在不强制更改密码或干扰其他设备的情况下撤销该证书。
与其他企业版方法一样,您需要知道组织使用的 CA 证书 (cacert.pem),用于向设备证明其连接到正确位置。您还需要客户端证书 (client-cert.pem) 以及配套的私钥 (client-key.pem)。
您可以提供证书路径,也可以将它们嵌入到配置文件中。
收集好凭据后,将其填入 /var/lib/iwd/essid.8021x 文件中:
/var/lib/iwd/essid.8021x
[Security] EAP-Method=TLS EAP-TLS-CACert=/path/to/cacert.pem EAP-Identity=your_enterprise_email EAP-TLS-ClientCert=/path/to/client-cert.pem EAP-TLS-ClientKey=/path/to/client-key.pem #EAP-TLS-ClientKeyPassphrase=key-passphrase # if client-key.pem is encrypted, provide its passphrase [Settings] AutoConnect=true
eduroam
Eduroam 提供了一个 配置助手工具 (CAT)。如果您的机构在 CAT 中有配置,下载 Linux 脚本并使用 python 运行即可连接。在较新版本中,CAT 可以直接创建所需的 iwd 配置文件。使用:
python3 eduroam-linux-organisation.py --iwd_conf.
然后通过 GUI 输入凭据。配置文件将保存在当前工作目录中,您需要手动将其移至 /var/lib/iwd/ 并重启 iwd。证书保存在 ~/.config/cat_installer/ca.pem 中,但也直接包含在配置文件中。
如果您的机构版本尚不支持 iwd,可以直接从 CAT python 脚本中提取必要的配置选项,包括证书和服务器域名掩码。此外,一些机构正在升级到 EAP-TLS,并将 client-cert.pem 的生成外包给 SecureW2,这种情况下您也需要使用他们的工具来生成客户端证书。
下表包含 iwd 配置选项与 eduroam CAT 安装脚本变量的映射:
| Iwd 配置选项 | CAT 脚本变量 |
|---|---|
| essid | Config.ssids 中的一项 |
EAP-Method |
Config.eap_outer
|
EAP-Identity |
Config.anonymous_identity
|
EAP-method-CACert |
Config.CA 的内容、包含 Config.CA 的 .pem 文件绝对路径或 嵌入式证书。 |
EAP-method-ServerDomainMask |
Config.servers 中的一项 |
EAP-method-Phase2-Method |
Config.eap_inner,如果是 PAP,则改用 Tunneled-PAP |
EAP-method-Phase2-Identity |
username@Config.user_realm
|
其中 method 为 EAP-Method 的内容,应为 TLS、TTLS 或 PEAP。提取并转换后,可按照上述方法填入 essid.8021x 文件中。
- 如果 eduroam 提供商不需要
EAP-Identity,此字段可能需填入anonymous@Config.user_realm。 - 如果您的
EAP-method-ServerDomainMask以DNS:开头,请仅使用DNS:之后的部分。
其他情况
更多测试用例可以在上游仓库的 测试用例中找到。
嵌入式证书
除了包含 PEM 文件的绝对路径外,还可以直接在网络配置文件中嵌入 PEM 本身。
嵌入式 PEM 可以使用以下格式出现在设置文件的任何位置:
[@pem@my_ca_cert] ----- BEGIN CERTIFICATE ----- PEM data ----- END CERTIFICATE -----
其中 my_ca_cert 是用于在配置文件内标识证书的任意名称。
然后在需要证书路径的任何设置位置,通过为值添加 embed: 前缀来使用该嵌入式证书:
EAP-TTLS-CACert=embed:my_ca_cert
不仅限于 CA 证书。客户端证书、客户端密钥(加密或未加密)以及证书链均可包含。
有线以太网上的 WPA
对于有线以太网上的 WPA,请按上述方法创建配置,但将其放置在 /var/lib/ead 目录中。
之后 启动/启用 ead.service。
可选配置
文件 /etc/iwd/main.conf 可用于主要配置。参见 iwd.config(5)。
禁止特定网络的自动连接
创建 或 编辑 文件 /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
还可以使用 RoutePriorityOffset 设置路由度量。
/etc/iwd/main.conf
[Network] RoutePriorityOffset=300
IPv6 支持
自 1.10 版本起,iwd 支持 IPv6,但在 2.0 以下版本中默认禁用。自 2.0 版本起,默认开启。
要禁用它,请在配置文件中添加:
/etc/iwd/main.conf
[Network] EnableIPv6=false
要在 1.10 到 2.0 之间的版本中启用它:
/etc/iwd/main.conf
[Network] EnableIPv6=true
无论使用 DHCPv6 还是静态 IPv6 配置,都需要启用此设置。也可以按网络进行设置。
在网络配置中设置静态 IP 地址
向 /var/lib/iwd/network.type 文件添加以下部分,例如:
/var/lib/iwd/spaceship.psk
[IPv4] Address=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-resolved 和 resolvconf。
对于 systemd-resolved,请在 /etc/iwd/main.conf 中添加:
/etc/iwd/main.conf
[Network] NameResolvingService=systemd
对于 resolvconf:
/etc/iwd/main.conf
[Network] NameResolvingService=resolvconf
配置 MAC 地址随机化
参见 MAC 地址欺骗#iwd。
允许任何用户读取状态信息
如果您希望允许任何用户读取状态信息但不修改设置,可以创建以下 D-Bus 配置文件:
/etc/dbus-1/system.d/iwd-allow-read.conf
<!-- Allow any user to read iwd status information. Overrides some part
of /usr/share/dbus-1/system.d/iwd-dbus.conf. -->
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
<policy context="default">
<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>
加密网络配置文件
默认情况下,iwd 未加密地将网络凭据存储在系统中。自 1.25 版本起,iwd 为使用 systemd 的系统提供了加密配置文件的实验性支持。
首先,创建加密凭据。以下示例使用 systemd-creds 创建名为 iwd-secret 的加密凭据,该凭据绑定到系统的 TPM,并将用于创建加密配置文件:
# systemd-ask-password -n | systemd-creds --tpm2-device=auto --name=iwd-secret encrypt - /etc/credstore.encrypted/iwd-secret.cred
接下来,通过为 iwd 服务创建覆盖文件 (drop-in file) 来添加 LoadCredentialEncrypted 选项。
/etc/systemd/system/iwd.service.d/use-creds.conf
[Service] LoadCredentialEncrypted=iwd-secret:/etc/credstore.encrypted/iwd-secret.cred
最后,将 SystemdEncrypt 选项及其值(即命名凭据)添加到 iwd 配置文件中,重新加载 systemd 管理器,并重启 iwd 服务。
/etc/iwd/main.conf
[General] ... SystemdEncrypt=iwd-secret
- 系统上现有的任何配置文件将自动加密。至此,后续所有新生成的配置文件都将自动加密。
- 在上述示例中,加密凭据隐含绑定到 TPM PCR 7。因此,如果安全启动 (Secure Boot) 状态或固件证书发生变化,在该启动会话中将无法连接到网络。
故障排除
详细 TLS 调试
如果您在设置 MSCHAPv2 或 TTLS 时遇到困难,此功能非常有用。可以通过覆盖片段设置以下环境变量:
/etc/systemd/system/iwd.service.d/tls-debug.conf
[Service] Environment=IWD_TLS_DEBUG=TRUE
之后以 root 身份运行 journalctl -u iwd.service 检查 iwd 日志。
启动后重启 iwd.service
在某些机器上,据报告 iwd.service 必须在启动后重启才能工作。参见 FS#63912 和 帖子 251432。这可能是因为 iwd 在无线网卡通电前就启动了。
作为一种解决方法,请通过 systemctl list-units --type=device | grep wlan0 找出需要等待的单元,并相应地扩展该单元:
/etc/systemd/system/iwd.service.d/override.conf
[Unit] After=sys-XXXX-net-wlan0.device Wants=sys-XXXX-net-wlan0.device
然后重新加载 systemd 管理器配置。
如果无效,请尝试:
[Service] ExecStartPre=ip link set wlan0 up
无线设备未被 udev 重命名
自 1.0 版本起,iwd 禁用 网络接口重命名为 可预测的网络接口名称。它安装了以下 systemd.link(5) 配置文件,阻止 udev 将接口重命名为可预测、稳定的名称(例如 wlp#s#):
/usr/lib/systemd/network/80-iwd.link
[Match] Type=wlan [Link] NamePolicy=keep kernel
结果是启动后保留了无线链路名称 wlan#。这解决了 iwd 和 udev 在接口重命名上的竞争条件,详见 iwd udev 接口重命名。
如果这导致问题,请尝试通过以下方式屏蔽它:
# ln -s /dev/null /etc/systemd/network/80-iwd.link
AP 模式下没有 DHCP
当客户端连接到 AP 模式下的 iwd 时,可能无法通过 DHCP 接收 IP 地址。因此,有必要在受管接口上启用 iwd 的网络配置:
/etc/iwd/main.conf
[General] EnableNetworkConfiguration=True
如果 mentioned 文件不存在,则必须创建它。
Wi-Fi 因 iwd 崩溃不断断开连接
一些用户遇到 Wi-Fi 断开连接,不断重连但最终趋于稳定并成功连接的问题。
用户报告他们的 日志中出现 iwd.service 的崩溃([2])。
核心问题是存在多个相互冲突的服务在管理网络连接。请确保您没有同时启用它们来解决此问题。
加载客户端私钥时出错
要加载密钥文件,iwd 需要 pkcs8_key_parser 内核模块。虽然在启动时它由 systemd-modules-load.service(8) 使用 /usr/lib/modules-load.d/pkcs8.conf 加载,但如果 iwd 刚安装,则可能并非如此。
如果在尝试连接 WPA 企业版网络时,日志中出现如 Error loading client private key /path/to/key 等消息,请手动加载模块:
# modprobe pkcs8_key_parser
iwd 不断漫游
如果连接质量过差,iwd 会漫游到其他已知 AP。
这将在系统日志中显示为 wlan0: deauthenticating from xx:xx:xx:xx:xx:xx by local choice (Reason: 3=DEAUTH_LEAVING)
您可以查看连接信号强度:
iwctl station wlan0 show | grep RSSI
您可以增加阈值以允许更差的连接。RoamThreshold 默认为 -70,RoamThreshold5G 默认为 -76。
/etc/iwd/main.conf
[General] RoamThreshold=-75 RoamThreshold5G=-80
DHCP 请求中未发送主机名
请在网络的配置文件中设置 SendHostname,而不是在 /etc/iwd/main.conf 中。
/var/lib/iwd/SomeNetwork.psk
... [IPv4] SendHostname=true
/etc/resolv.conf:只读文件系统
当使用 resolvconf 作为 DNS 解析方法时,在写入 /etc/resolv.conf 时可能会遇到关于只读文件系统的报错。
$ journalctl -u iwd.service
Jun 14 14:08:12 host iwd[1170270]: event: state, old: disconnected, new: autoconnect_quick Jun 14 14:08:12 host iwd[1170270]: udev interface=wlan0 ifindex=6 Jun 14 14:08:13 host iwd[1170270]: event: connect-info, ssid: <redacted>, bss: <redacted>, signal: -63, load: 0/255 Jun 14 14:08:13 host iwd[1170270]: event: state, old: autoconnect_quick, new: connecting (auto) Jun 14 14:08:13 host iwd[1170270]: event: state, old: connecting (auto), new: connecting (netconfig) Jun 14 14:08:14 host iwd[1170315]: cp: cannot create regular file '/etc/resolv.conf.bak': Read-only file system Jun 14 14:08:14 host iwd[1170316]: /usr/lib/resolvconf/libc: line 257: /etc/resolv.conf: Read-only file system Jun 14 14:08:16 host iwd[1170366]: cp: cannot create regular file '/etc/resolv.conf.bak': Read-only file system Jun 14 14:08:16 host iwd[1170367]: /usr/lib/resolvconf/libc: line 257: /etc/resolv.conf: Read-only file system Jun 14 14:08:16 host iwd[1170270]: event: state, old: connecting (netconfig), new: connected
要解决此问题,请通过添加覆盖文件来扩展 iwd.service systemd 单元的配置:
/etc/systemd/system/iwd.service.d/50-resolvconf.conf
[Service] RuntimeDirectory=resolvconf ReadWritePaths=/etc/resolv.conf
这将允许 iwd.service 系统单元更新 /etc/resolv.conf。重启 iwd.service 使更改生效。
连接 iPhone 热点反复失败
当连接 iPhone 个人热点时,iwd 可能会反复连接并立即断开,日志中显示 connect-failed, status: 1。
$ journalctl -b -u iwd event: state, old: connected, new: disconnecting event: connect-failed, status: 1 event: state, old: connecting, new: disconnected
这可能是由于 MAC 地址随机化干扰了 iPhone 的热点认证。要解决此问题,请在 iwd 配置中设置 AddressRandomization:
/etc/iwd/main.conf
[General] AddressRandomization=once
然后重启 iwd.service。
如果问题仍然存在,请尝试设置 AddressRandomization=disabled。