iwd (简体中文) - ArchWiki

Jump to content

# iwd (简体中文)

From ArchWiki

相关文章

- Network configuration
- Wireless network configuration
- WPA supplicant

翻译状态：本文是 iwd 的翻译。上次翻译日期：2020-08-09。如果英文版本有所更改，则您可以帮助同步翻译。

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

iwd 可以独立工作，也可以和 ConnMan、systemd-networkd 和 NetworkManager 这样更完善的网络管理器结合使用。

## 安装

安装 iwd 软件包。

## 使用方法

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

注意： 如果打算使用 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

### 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`

注意： Eduroam 提供方可能不要求使用 `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>

提示： 移除上面的<allow> 行可连同拒绝读取状态信息。

## 故障排除

### 详细 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]

The factual accuracy of this article or section is disputed.

Reason: Is "After=network-pre.target" needed? If so, is "After=systemd-udevd" even needed? This solution does not seem to work for all cases. See [5] and systemd.special(7). (Discuss in Talk:Iwd (简体中文))

    /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

## 另请参阅

- 开始使用 iwd（英文）
- 网络配置设置（英文）
- WPA Enterprise 的更多示例（英文）
- Arch Linux 论坛上的 IWD 帖子（英文）

Categories:

- Wireless networking (简体中文)
- Network configuration (简体中文)

Hidden category:

- Pages or sections flagged with Template:Accuracy