iwd
iwd (iNet wireless daemon) 是 Intel 为 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` 目录中,并用于将来的自动连接。请参阅 #Network configuration。
- 要连接到 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 提供了一个 GUI 前端,可以通过它来控制 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 Autostart 标准,则由于 AUR 包安装在 `/etc/xdg/autostart/` 中的 `iwgtk-indicator.desktop` 文件,这应该会自动发生。
或者,AUR 包提供了一个 systemd 单元文件来启动指示器守护进程。如果您的桌面环境支持 systemd 的 `graphical-session.target` 单元,那么可以通过 启用 `iwgtk.service` 用户单元来通过 systemd 自动启动 iwgtk。
网络配置
默认情况下,*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
要从密码计算预共享密钥,可以使用以下两种方法之一
- 在配置文件中以明文形式输入密码
/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 Enterprise
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,可以将选项设置为 `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
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`),它用于证明您拥有该客户端证书。
您可以提供 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
一种通过 iwd 连接 eduroam 的可能方法 在此处提供。创建以下文件,并填入必要的值
/var/lib/iwd/eduroam.8021x
[Security] EAP-Method=PEAP EAP-Identity=anonymous@university.domain EAP-PEAP-Phase2-Method=MSCHAPV2 EAP-PEAP-Phase2-Identity=username@university.domain EAP-PEAP-Phase2-Password=password [Settings] AutoConnect=true
如果这不起作用,eduroam 还提供了一个 配置助手工具 (CAT)。如果您的组织在 CAT 中有配置文件,可以通过下载 Linux 脚本并使用 Python 运行它来连接到 eduroam。如果您的组织不支持 CAT,您将必须使用管理员提供的参数手动创建配置文件(下面的表格可能对此有所帮助)。可以从生成的配置中提取必要的配置选项,包括证书和服务器域掩码。此外,一些机构正在升级到 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` 的内容、指向包含 `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`。一旦您提取了所有必要的信息并将其转换为等效的 iwd 配置,您就可以按照前面方法中所述,将其放入一个名为 `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
要在 2.0 以下版本且高于 1.10 的版本中启用它
/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
允许任何用户读取状态信息
如果您想允许任何用户读取状态信息,但不修改设置,则可以创建以下 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 将网络凭据以未加密的方式存储在系统中。自 iwd 1.25 版本以来,iwd 为使用 systemd 的系统提供了创建 加密配置文件的实验性支持。
首先,创建一个加密的凭据。以下示例使用 systemd-creds,并创建一个名为 `iwd-secret` 的加密凭据,该凭据绑定到系统的 受信任平台模块,该模块将用于创建加密配置文件
# systemd-ask-password -n | systemd-creds --tpm2-device=auto --name=iwd-secret encrypt - /etc/credstore.encrypted/iwd-secret.cred
接下来,通过为 iwd 服务创建 drop-in 文件来添加 `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。因此,如果安全启动状态或固件证书发生更改,那么在该启动会话中将无法连接到网络。
故障排除
详细的 TLS 调试
如果您在设置 MSCHAPv2 或 TTLS 时遇到问题,这可能很有用。您可以通过 drop-in 片段使用 环境变量设置以下内容
/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 interface renaming 中所述。
如果这导致问题,请尝试通过以下方式屏蔽它
# ln -s /dev/null /etc/systemd/network/80-iwd.link
AP 模式下无 DHCP
当客户端连接到 *iwd* 的 AP 模式时,可能无法通过 DHCP 接收 IP 地址。因此,有必要通过 *iwd* 启用托管接口的网络配置
/etc/iwd/main.conf
[General] EnableNetworkConfiguration=True
如果该文件不存在,则必须创建它。
Wi-Fi 因 iwd 崩溃而持续断开连接
一些用户遇到 Wi-Fi 断开连接的情况,不断重连但最终稳定并成功连接。
用户报告在他们的 日志中出现 `iwd.service` 崩溃([1])。
核心问题是存在多个冲突的服务来管理他们的网络连接。请检查您是否没有同时 启用它们来解决此问题。
加载客户端私钥时出错
要加载密钥文件,*iwd* 需要 `pkcs8_key_parser` 内核模块。在启动时,它由 systemd-modules-load.service(8) 使用 `/usr/lib/modules-load.d/pkcs8.conf` 加载,但如果 iwd 刚刚安装,则不会如此。
如果在尝试连接到 WPA Enterprise 网络时,在 日志中看到类似 `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
要解决此问题,请通过添加 drop-in 文件来扩展 `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` 以使更改生效。