iwd
iwd (iNet wireless daemon) 是由 Intel 编写的 Linux 无线守护进程。该项目的核心目标是通过不依赖任何外部库,而是最大限度地利用 Linux 内核提供的功能来优化资源利用率。
iwd 可以独立工作,也可以与全面的网络管理器(如 ConnMan、systemd-networkd 和 NetworkManager)结合使用。
安装
可选地,可以安装第三方图形和终端用户界面前端
- impala — iwd 的 TUI(终端用户界面)。
- iwdgui — iwd 的图形前端。
- iwgtk — iwd 的图形前端和一个指示器(托盘)图标。
- iwmenu — iwd 的菜单驱动界面。
用法
iwd 软件包提供了客户端程序 iwctl
、守护进程 iwd
和 Wi-Fi 监控工具 iwmon
。
启动/启用 iwd.service
,以便可以通过 iwctl
命令或 iwgtk
进行控制。
iwctl
要获取交互式提示符,请执行
$ iwctl
然后将显示交互式提示符,前缀为 [iwd]#
。
- 在
iwctl
提示符下,您可以通过按Tab
键自动完成命令和设备名称。 - 要退出交互式提示符,请按
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
station
和 Tab
Tab
,将显示可用设备,键入设备的首字母和 Tab
进行完成。同样的方式,键入 connect
和 Tab
Tab
以显示可用网络列表。然后,键入所选网络的第一个字母,后跟 Tab
以完成命令。如果需要密码短语(并且尚未存储在 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 提供了一个 GUI 前端,可以通过它控制 iwd。
运行不带任何参数的 iwgtk
会启动应用程序窗口,该窗口可用于切换适配器和设备的开/关、更改其操作模式、查看可用网络、连接到可用网络以及管理已知网络。
指示器图标
要启动 iwgtk 的指示器(托盘)图标守护进程,请运行
$ iwgtk -i
如果指示器图标未出现,则您的系统托盘很可能缺少对 StatusNotifierItem API 的支持,在这种情况下,您需要运行兼容性层,例如 snixembed-gitAUR。
以下系统托盘支持 StatusNotifierItem,因此可以开箱即用
- KDE Plasma
- swaybar
- 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
- _
之一时,才使用网络 SSID 作为文件名。如果它包含任何其他字符,则名称将变为 =
字符,后跟 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#使用 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,您可以将选项设置为 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-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
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),该工具 支持 iwd。如果您的组织在 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 的内容,.pem 文件的绝对路径,其中包含 Config.CA 或嵌入式证书。 |
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 证书。客户端证书、客户端密钥(加密或未加密)和证书链都可以包含在内。
可选配置
文件 /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。
将以下部分添加到 /etc/iwd/main.conf
以用于 systemd-resolved
/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 服务创建放置文件,添加 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 时遇到问题,这可能会很有用。您可以通过放置代码段设置以下环境变量
/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 和 thread 251432。这可能是因为 Linux 内核和服务启动得太早,并且 iwd 在无线网卡通电之前启动。作为一种解决方法,扩展单元以添加延迟
[Service] ExecStartPre=/usr/bin/sleep 2
然后重新加载 systemd 管理器配置。
无线设备未被 udev 重命名
自 1.0 版本起,iwd 禁用无线设备的可预测重命名。它安装了以下 systemd 网络链接配置文件,该文件阻止 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
如果提到的文件尚不存在,则必须创建它。
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 企业版网络时,日志中显示诸如 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