iwd
iwd (iNet wireless daemon,iNet 无线守护程序) 是由英特尔(Intel)为 Linux 编写的一个无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用 Linux 内核提供的功能来优化资源利用。
iwd 可以独立工作,也可以和 ConnMan、systemd-networkd 和 NetworkManager 这样更完善的网络管理器结合使用。
安装[编辑 | 编辑源代码]
使用方法[编辑 | 编辑源代码]
iwd包 软件包提供了客户端程序 iwctl
、守护程序 iwd
和 WiFi 监控工具 iwmon
。
iwgtkCNRepo 提供 iwd 的 GUI 前端和托盘图标。
启动/启用 iwd.service
以便可以使用 iwctl
或 iwgtk
对其进行控制。
iwctl[编辑 | 编辑源代码]
要进入交互式提示符(interactive prompt),执行:
$ iwctl
然后交互式提示符就会以 [iwd]#
前缀显示出来了。
- 在
iwctl
提示符中,可以通过Tab
键自动补全命令和设备名称。 - 要退出交互式提示,按下
Ctrl+d
发送 EOF 信号。 - 可以在不进入交互式提示符的情况下,将所有命令当作命令行参数使用。例如:
iwctl device wlan0 show
。
要列出所有可用的命令:
[iwd]# help
连接网络[编辑 | 编辑源代码]
首先,如果不知道你的网络设备名称,请列出所有 WiFi 设备:
[iwd]# device list
如果设备或其相应的适配器已关闭,请将其打开。
[iwd]# device device set-property Powered on
[iwd]# adapter adapter set-property Powered on
然后,要开始扫描网络(注意:这个命令不会输出任何内容),执行:
[iwd]# station device scan
再然后,就可以列出所有可用的网络:
[iwd]# station device get-networks
最后,要连接到一个网络:
[iwd]# station device connect SSID
station
后按压 Tab
Tab
,将显示可用的设备,键入设备的首字母和 Tab
将自动补全。同样,输入 connect
和 Tab
Tab
以显示可用网络列表。然后,键入所选网络的首字母,后跟 Tab
,以自动补全。
如果要求输入网络密码,将会提示用户输入。此外,连接操作可以应用成命令行参数的形式:
$ 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
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。
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
Eduroam[编辑 | 编辑源代码]
Eduroam 提供了一个 配置助手工具 (Configuration Assistant Tool,CAT), 遗憾的是它并不支持 iwd。但是,CAT 的安装程序只是一个 Python 脚本,可以通过点击下载按钮,然后选择你的大学来下载它。可以很轻易地提取出必要的配置选项,包括证书和服务域掩码。
下列的表格包含了 iwd 配置选项到 Eduroam CAT 安装脚本变量的映射关系:
Iwd 配置选项 | CAT 脚本变量 |
---|---|
文件名 | 某个 Config.ssids 文件
|
EAP-Method |
Config.eap_outer
|
EAP-Identity |
Config.anonymous_identity
|
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
。 - If your
EAP-PEAP-ServerDomainMask
starts withDNS:
, use only the part afterDNS:
.
其他情况[编辑 | 编辑源代码]
更多测试范例可在上游仓库的 测试案例中找到。
可选配置[编辑 | 编辑源代码]
文件 /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>
故障排除[编辑 | 编辑源代码]
详细 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