iwd (简体中文)
iwd (iNet wireless daemon,iNet 无线守护程序) 是由英特尔(Intel)为 Linux 编写的一个无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用 Linux 内核提供的功能来优化资源利用。[1]
iwd 可以独立工作,也可以和 ConnMan、systemd-networkd 和 NetworkManager 这样更完善的网络管理器结合使用。
安装
使用方法
iwd 软件包提供了客户端程序 iwctl
、守护程序 iwd
和 WiFi 监控工具 iwmon
。
启动/启用 iwd.service
以便可以使用 iwctl
对其进行控制。
iwctl
要进入交互式提示符(interactive prompt),执行:
$ iwctl
然后交互式提示就会以 [iwd]#
前缀显示出来了。
- 在
iwctl
提示符中,可以通过Tab
键自动补全命令和设备名称。 - 要退出交互式提示,按下
Ctrl+d
发送 EOF 信号。 - 可以在不进入交互式提示符的情况下,将所有命令当作命令行参数使用。例如:
iwctl device wlp3s0 show
。
要列出所有可用的命令:
[iwd]# help
连接网络
首先,如果不知道你的网络设备名称,请列出所有 WiFi 设备:
[iwd]# device list
然后,要扫描网络,执行:
[iwd]# station device scan
再然后,就可以列出所有可用的网络:
[iwd]# station device get-networks
最后,要连接到一个网络:
[iwd]# station device connect SSID
如果要求输入网络密码,将会提示用户输入。此外,连接操作可以应用成命令行参数的形式:
$ 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
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
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.email
|
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
|
EAP-Identity
,在这种情况下可以在选项字段里写上 anonymous
。其他情况
更多测试范例可在上游仓库的 测试案例中找到。
可选配置
文件 /etc/iwd/main.conf
用于存储主要配置。参见 iwd.config(5)。
默认情况下,iwd
将网络配置存储在 /var/lib/iwd
目录中。配置文件名格式为 network.type
,其中 network 指网络的 SSID,而 type 指的是网络类型(即 "open"、"wep"、"psk" 和 "8021x" 四种类型的其中一种)。这个文件用于存储加密的 PreSharedKey
(预共享密钥)和明文的 Passphrase
(网络密码),用户可自行创建,而无需调用 iwctl
。它还可以用于存储与该网络 SSID 相关的其他配置。有关更多设置,请参阅 iwd.network(5)。
下面是一个最精简的示例文件,演示了如何连接到一个 SSID 为 "spaceship" 和密码为 "test1234" 的 WPA2/PSK 安全网络:
/var/lib/iwd/spaceship.psk
[Security] PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
PreSharedKey(预共享密钥)可以使用 wpa_passphrase (来源于 wpa_supplicant) 或 wpa-pskAUR 从 SSID 和 WiFi 密码计算得出:
$ wpa_passphrase spaceship test1234
network={ ssid="spaceship" #psk="test1234" psk=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295 }
- 如果 SSID 中包含空格或其他特殊字符,必须要用引号括起来,Shell 才能正确将其传递给 wpa_passphrase。
- 当且仅当网络的 SSID 包含字母数字字符或
- _
两者之一时,才用作文件名。如果其中包含任何其他字符,则会被改为一个=
-字符,后跟十六进制编码文本的形式。
禁用特定网络的自动连接
创建或编辑 /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
还可以用 route_priority_offset
设置路由指标(route metric):
/etc/iwd/main.conf
[General] route_priority_offset=300
在网络配置中设定静态 IP 地址
将下列部分添加到 /var/lib/iwd/network.type
文件中。例如可以这样写:
/var/lib/iwd/spaceship.psk
[IPv4] ip=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
拒绝控制台(本地)用户修改设置
默认情况下 iwd
D-Bus 接口允许 任何 控制台用户连接到 iwd
守护程序并修改配置,即使该用户不是 root 用户。
如果不想让控制台用户修改设置,但允许读取状态信息,请按如下所示创建一个 D-Bus 配置。
/etc/dbus-1/system.d/iwd-strict.conf
<!-- prevent local users from changing iwd settings, but allow reading status information. overrides some part of /usr/share/dbus-1/system.d/iwd-dbus.conf. --> <!-- This configuration file specifies the required security policies for iNet Wireless Daemon to work. --> <!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <policy at_console="true"> <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
之后通过 journalctl -u iwd.service
命令检查 iwd 日志。
重启后出现连接问题
较低的熵池可能会导致连接问题,特别是在重启之后。请参阅 随机数生成 获取如何增大熵池的建议。
由于设备不可用,systemd 单元启动失败
一些用户曾报告说,iwd 提供的 systemd 单元没有等待无线设备可用(就开始启动了)[2]。不幸的是,如果在 udev 重命名完成前 iwd 就启动了,网络设备会被拦截并且导致重命名失败。因此,单元启动失败[3]。这个问题可通过在 /etc/iwd/main.conf
中添加以下选项来解决,通过强制 iwd 进入传统模式(legacy mode),从而不重命名新检测到的设备:
/etc/iwd/main.conf
[General] use_default_interface=true
也可以选择通过创建一个带有以下内容的 systemd 单元,将 iwd(服务)绑定到指定设备上。截至 0.21 版本,已经观察到这不会阻止 iwd 在稍后重命名无线设备,因此必须使用 iwd 的传统模式:
/etc/systemd/system/iwd@.service
[Unit] Description=Wireless service on %I BindsTo=sys-subsystem-net-devices-%i.device After=sys-subsystem-net-devices-%i.device [Service] Type=dbus BusName=net.connman.iwd ExecStart=/usr/lib/iwd/iwd --interface %i LimitNPROC=1 Restart=on-failure
然后,禁用 iwd.service
并为指定设备 device 启用 iwd@device.service
单元。
此外,还可以通过创建如下 附加配置文件,为 iwd 设定适当的依赖,使其在 systemd/udevd 之后运行:[4]
/etc/systemd/system/iwd.service.d/override.conf
[Unit] After=systemd-udevd.service
如果使用了 systemd-networkd,因为 systemd-udevd/networkd 两者都能相对较好地一起工作,且两者都有参与,所以可以在这两者之后启动 iwd,是合理的:
/etc/systemd/system/iwd.service.d/override.conf
[Unit] After=systemd-udevd.service systemd-networkd.service
参见 FS#61367。
无线设备没有被 udev 重命名
iwd 升级到 1.0 版本后引入了 systemd 网络链路配置文件:
/usr/lib/systemd/network/80-iwd.link
[Match] Type=wlan [Link] NamePolicy=keep kernel
这可以防止 udev 将接口重命名为 wlp#s#
。因此,无线链路名称在系统启动后会被保留。
如果这会导致问题,请尝试用以下方法屏蔽它:
# ln -s /dev/null /etc/systemd/network/80-iwd.link