iwd

来自 Arch Linux 中文维基

iwd (iNet wireless daemon,iNet 无线守护程序) 是由英特尔(Intel)为 Linux 编写的一个无线网络守护程序。该项目的核心目标是不依赖任何外部库,而是最大程度地利用 Linux 内核提供的功能来优化资源利用。

iwd 可以独立工作,也可以和 ConnMansystemd-networkdNetworkManager 这样更完善的网络管理器结合使用。

注意: 当通过 NetworkManager 使用 iwd 时,除非 NetworkManager 的文章中另有说明,否则请不要按照本页上的说明操作。

安装[编辑 | 编辑源代码]

安装 iwd 软件包。

也可选择安装第三方包,其提供图形化与终端用户界面:

  • impala — iwd 的一个 TUI(Terminal User Interface,终端用户界面)前端。
https://github.com/pythops/impala || impala
  • iwgtk — iwd 的一个图形化前端,提供指示器(托盘)图标。
https://github.com/J-Lentz/iwgtk || iwgtkAUR

使用方法[编辑 | 编辑源代码]

iwd 软件包提供了客户端程序 iwctl、守护程序 iwd 和 WiFi 监控工具 iwmon

启动/启用 iwd.service 以便可以使用 iwctliwgtk 对其进行控制。

注意: 仅允许root、networkwheel 用户组 的成员与 iwd 交互。为了使用 iwctliwgtk,您需要 将您的用户添加到其中一个组.

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
注意: * 对于通过 DHCP 的 IP 和 DNS 自动配置,您需要 手动启用 内置 DHCP 客户端,或配置一个 独立 DHCP 客户端
提示:用户界面支持自动补全,输入 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 托盘图标的自启动无需额外配置,因为 iwgtkCNRepoiwgtk-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) 获得更详尽的设置。

注意: 在字符串值中,包括身份和密码,特定字符被反斜杠转义。开头的空格,\n,\r 以及反斜杠必须转义表达。参见 iwd.network(5)

WPA-PSK[编辑 | 编辑源代码]

一个连接到 WPA-PSK 或 WPA2-PSK 安全网络的最小示例文件,其 SSID "spaceship",Passphrase "test1234":

/var/lib/iwd/spaceship.psk
[Security]
PreSharedKey=aafb192ce2da24d8c7805c956136f45dd612103f086034c402ed266355297295
注意: 网络的 SSID 仅当其仅包含字母,数字或 - _ 两字符之一时作为文件名。如果其包含其他字符,文件名将替代为=字符后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 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。

注意: 无法更改不同 SSID 的优先级,您可能需要设置 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 值。

注意: 如果打算使用 eduroam,另请参见 #Eduroam

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

  1. 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

其中 methodEAP-Method 的内容,应为 TLSTTLSPEAP。 提取所有必要信息,并转换、使之与 iwd 配置等价后,就可以按照前面的方法将其放入名为 essid.8021x 的配置文件中。

注意:
  • Eduroam 提供方可能不要求使用 EAP-Identity,在这种情况下可以在选项字段里写上 anonymous
  • 若您的 EAP-method-ServerDomainMaskDNS:开始,只使用 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-resolvedresolvconf

要使用 systemd-resolved,将下列部分添加到 /etc/iwd/main.conf 中:

/etc/iwd/main.conf
[Network]
NameResolvingService=systemd

而对于 resolvconf,添加的为:

/etc/iwd/main.conf
[Network]
NameResolvingService=resolvconf
注意: 若未指定,默认使用 systemd-resolved,并推荐其用于systemd.

允许任何用户读取状态信息[编辑 | 编辑源代码]

如果想允许任何用户读取状态信息,但不允许修改设置,请按如下所示创建一个 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>

加密网络配置文件[编辑 | 编辑源代码]

这篇文章的某些内容需要扩充。

原因: 加密网络配置文件在某些配置文件中可能无效。 (在 Talk:Iwd 中讨论)

默认情况下,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#63912thread 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# 在引导后保留。 这使得 iwdudev 间存在接口重命名的竞争,如 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

另请参阅[编辑 | 编辑源代码]