# iwd (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

相关文章

- 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