iwd
iwd (iNet wireless daemon,iNet 无线守护程序) 是由英特尔(Intel)为 Linux 编写的一个无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用 Linux 内核提供的功能来优化资源利用。
iwd 可以独立工作,也可以和 ConnMan、systemd-networkd 和 NetworkManager 这样更完善的网络管理器结合使用。
安装[编辑 | 编辑源代码]
也可选择安装第三方包,其提供图形化与终端用户界面:
- impala — iwd 的一个 TUI(Terminal User Interface,终端用户界面)前端。
- iwgtk — iwd 的一个图形化前端,提供指示器(托盘)图标。
使用方法[编辑 | 编辑源代码]
iwd包 软件包提供了客户端程序 iwctl
、守护程序 iwd
和 WiFi 监控工具 iwmon
。
启动/启用 iwd.service
以便可以使用 iwctl
或 iwgtk
对其进行控制。
iwctl[编辑 | 编辑源代码]
要进入交互式提示符(interactive prompt),执行:
$ iwctl
然后交互式提示符就会以 [iwd]#
前缀显示出来了。
- 在
iwctl
提示符中,可以通过Tab
键自动补全命令和设备名称。 - 要退出交互式提示,按下
Ctrl+d
发送 EOF 信号。 - 可以在不进入交互式提示符的情况下,将所有命令当作命令行参数使用。例如:
iwctl device wlan0 show
。
要列出所有可用的命令:
[iwd]# help
连接网络[编辑 | 编辑源代码]
首先,使用 rfkill 命令确认 Wi-Fi 设备未被屏蔽。
如果不知道你的网络设备名称,请列出所有 WiFi 设备:
[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
station
后按压 Tab
Tab
,将显示可用的设备,键入设备的首字母和 Tab
将自动补全。同样,输入 connect
和 Tab
Tab
以显示可用网络列表。然后,键入所选网络的首字母,后跟 Tab
,以自动补全。
如果要求输入网络密码(并且密码尚未存入任何一个 iwd 自动检查的配置文件中),将会提示用户输入。此外,连接操作可以应用成命令行参数的形式:
and it is not already stored in one of the profiles that iwd automatically checks
$ 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 连接网络[编辑 | 编辑源代码]
如果网络配置为可以通过按下一个按钮就能进行连接 (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
iwgtk[编辑 | 编辑源代码]
另外,iwgtkCNRepo 提供了一个 GUI 前端,也通过它可以控制 iwd。
不加任何参数运行 iwgtk
将启动一个 iwd 的管理窗口,它能被用于切换适配器的开关、更改操作模式、查看或链接可用的无线网络、管理已保存的网络。
托盘图标[编辑 | 编辑源代码]
要启动 iwgtk 的托盘图标请运行:
$ iwgtk -i
如果托盘中的图标没有出现,则你的系统托盘很可能不支持 StatusNotifierItem API,这种情况下你需要使用一个兼容层(例如snixembed-gitAUR)。 下面的系统托盘支持 StatusNotifierItem API,因此无需兼容层:
- KDE Plasma
- swaybar
- xfce4-panel
下面的托盘只支持 XEmbed 因此需要snixembed-gitAUR:
- AwesomeWM
- i3bar
自启动[编辑 | 编辑源代码]
每次登录桌面时自启动 iwgtk 的托盘图标是常见的用法。如果你的桌面环境支持 XDG Autostart 标准,则 iwgtk 托盘图标的自启动无需额外配置,因为 iwgtkCNRepo 将 iwgtk-indicator.desktop
文件放置在了 /etc/xdg/autostart/
。
作为上面的方法的替代, iwgtkCNRepo提供了一个用来自启动托盘进程的 systemd 单元文件.如果你的桌面环境支持 systemd 的 graphical-session.target
单元, 则 iwgtk 能在 Systemd#使用单元了 iwgtk.service
用户单元后被 systemd 自动启动。
网络配置[编辑 | 编辑源代码]
iwd 默认在 /var/lib/iwd
目录下储存网络配置。配置文件名形如 网络.类别
,其中网络是该网络的 SSID,类别是网络类别,是 .open, .psk, .8021x 之一。文件储存加密的 PreSharedKey
和可选的 cleartext Passphrase
,可以不调用 iwctl
由用户创建。该文件亦可用作隶属该网络 SSID 的其他配置。参见 iwd.network(5) 获得更详尽的设置。
WPA-PSK[编辑 | 编辑源代码]
一个连接到 WPA-PSK 或 WPA2-PSK 安全网络的最小示例文件,其 SSID "spaceship",Passphrase "test1234":
/var/lib/iwd/spaceship.psk
[Security] PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
- _
两字符之一时作为文件名。如果其包含其他字符,文件名将替代为=
字符后SSID的十六进制编码(十六进制数使用小写字母)。下列两种方法可以根据 passphrase 计算 pre-shared key:
- 在配置文件的 cleartext 输入 passphrase:
/var/lib/iwd/spaceship.psk
[Security] Passphrase=test1234
pre-shared key 会在第一次连接时自动追加到文件末尾:
/var/lib/iwd/spaceship.psk
[Security] Passphrase=test1234 PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
- 亦可使用 wpa_passphrase(自wpa_supplicant包 或 wpa-pskAUR),用 SSID 与 passphrase 计算 pre-shared key。
- 参见 wpa_supplicant#Connecting with wpa_passphrase 获得更多细节。
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。
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 密钥一样,这些证书使用公钥加密,因此永不需要向 wifi 验证服务器发送密钥,您也无需复制和重复使用密码。通常情况下,每台设备都会使用不同的证书。理论上,至少可以在不强迫你更改密码或中断其他设备的情况下撤销证书。
与其他企业级方法一样,您需要知道贵组织使用的 CA 证书(cacert.pem
),该证书可以向设备证明它连接到的目标是正确的。您还需要拥有在每次连接时上传的、代表您的客户端证书(client-cert.pem
),以及证明您拥有客户端证书的配套的私钥(client-key.pem
)。
当您收集好凭证,将这个放到您的 /var/lib/iwd/essid.8021x
文件:
{{hc|/var/lib/iwd/essid.8021x|2=
[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 # 若 client-key.pem 是加密的,提供密钥。
Eduroam[编辑 | 编辑源代码]
Eduroam 提供了一个配置助手工具 (Configuration Assistant Tool,CAT), 遗憾的是它并不支持 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
。 提取所有必要信息,并转换、使之与 iwd 配置等价后,就可以按照前面的方法将其放入名为 essid.8021x
的配置文件中。
- Eduroam 提供方可能不要求使用
EAP-Identity
,在这种情况下可以在选项字段里写上anonymous
。 - 若您的
EAP-method-ServerDomainMask
以DNS:
开始,只使用DNS:
以后的部分。
其他情况[编辑 | 编辑源代码]
更多测试范例可在上游仓库的测试案例中找到。
可选配置[编辑 | 编辑源代码]
文件 /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
设置路由指标(route metric):
/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
允许任何用户读取状态信息[编辑 | 编辑源代码]
如果想允许任何用户读取状态信息,但不允许修改设置,请按如下所示创建一个 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的加密凭据,该凭据与系统的Trusted Platform Module绑定,将用于创建加密配置文件:
# 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
最终,在 iwd 配置文件中添加 SystemdEncrypt
选项(值为该凭证),重载 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。 This probably occurs because the Linux 内核与服务启动过早且 iwd 开启在无线网卡启动前。 要解决,您可扩展单元以增加延迟:
[Service] ExecStartPre=/usr/bin/sleep 2
然后,重载 systemd 管理配置。
Wireless device is not renamed by udev[编辑 | 编辑源代码]
1.0 起,iwd 禁用了可预测的无线设备重命名。它设置了阻止 udev 重命名 wlp#s#
接口的以下 systemd 网络连接配置文件:
/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[编辑 | 编辑源代码]
当在 AP 模式下通过 DHCP连接到 iwd 时,客户端可能收不到 IP 地址。这有必要用 iwd 在管理好的接口上启用网络配置。
/etc/iwd/main.conf
[General] EnableNetworkConfiguration=True
提及文件若不存在则创建。
因 iwd 崩溃无法连接 WiFi[编辑 | 编辑源代码]
一些用户经历 WiFi 断开的情况,通过不断重连,最终使之稳定并成功连接。
用户通过 journal 报告 iwd.service
崩溃 ([1]) 。
核心问题 是多个网络连接服务冲突。要解决,请检查您是否同时启用多个服务。
客户端密钥加载错误[编辑 | 编辑源代码]
要加载密钥文件,iwd 需要 pkcs8_key_parser
内核参数。引导时,它由 systemd-modules-load.service(8) 使用 /usr/lib/modules-load.d/pkcs8.conf
加载,如果才安装 iwd,就不会出现这种情况。
当尝试连接到 WPA 企业网络时,如在 journal 有例如 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