网络配置/无线网络配置 - Arch Linux 中文维基

跳转到内容

# 网络配置/无线网络配置

来自 Arch Linux 中文维基
< 网络配置
翻译状态：

- 本文（或部分内容）译自 Network configuration/Wireless，最近一次同步于 2023-01-20，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

相关文章

- 网络配置
- 软AP
- Ad-hoc networking
- Internet sharing
- 无线网络绑定
- Network Debugging
- Bluetooth

网络配置的主页面是网络配置。

配置无线网络一般分两步：第一步是识别硬件、安装正确的驱动程序并进行配置，安装盘中已经包含驱动，但是通常需要额外安装；第二步是选择一种管理无线连接的方式。这篇文章涵盖了这两方面，并提供了无线管理工具的链接地址。

#iw 段落描述了如何使用 iw包 来手动管理你的网络接口/无线局域网连接。网络配置#网络管理器段落介绍了几个可以自动管理您无线网络接口的程序。这些程序中的某些会包含一个图形界面，而所有的程序都支持网络配置文件（在频繁切换网络时有用，比如使用笔记本电脑的场合）。

## 设备驱动

默认的 Arch Linux 内核是模块化的，硬件的设备驱动作为内核模块保存在硬盘上。启动时，udev 会根据硬件加载不同的驱动模块，从而允许创建网络接口。

除了相应的驱动程序之外，某些无线芯片组还需要固件。linux-firmware包 提供了很多固件，然而专有固件并不包含在内，需要另行安装。这部分指南请参考 #安装 driver/firmware。

注意：如果 udev 在启动时未加载正确的模块，只需 手动加载 即可。 如果 udev 为一台设备加载多个驱动程序，则产生的冲突可能会导致配置失败。 确保将不需要的模块加入 黑名单。

### 检查驱动状态

根据设备的连接方式是 PCI(e) 或 USB，对应地执行 `lspci -k` 或 `lsusb -v` 可以检查设备驱动是否已经加载：

    $ lspci -k

    06:00.0 Network controller: Intel Corporation WiFi Link 5100
    	Subsystem: Intel Corporation WiFi Link 5100 AGN
    	Kernel driver in use: iwlwifi
    	Kernel modules: iwlwifi

注意：如果网卡是 USB 设备，以 root 权限执行 `grep usbcore` 的输出应当类似于 `usbcore: registered new interface driver rtl8187`。

If you do not see the card at all, it may not be seated/plugged in properly in its PCI(e) slot/USB port. Try re-plugging it in.

同时也要通过 `ip link` 命令来查看无线接口是否已经创建。通常来说，设备名以字母“w”开头，例如`wlan0` 或 `wlp2s1`。确认之后，使用以下命令使设备上线：

    # ip link set <设备名> up

例如，接口设备名是 `wlan0`，此命令就是 `ip link set wlan0 up`。

注意：

- 如果你从命令中得到如下错误：`RTNETLINK answers: Operation not possible due to RF-kill` 错误，请确保设备没有被 软锁定 或 硬锁定，详情请参考 Rfkill 说明。
- 如果你从命令中得到如下错误：`SIOCSIFFLAGS: No such file or directory`， 那么大概率您的无线芯片组需要额外的固件来运行。

检查内核信息中关于已加载固件的信息：

    # dmesg | grep firmware

    [   7.148259] iwlwifi 0000:02:00.0: loaded firmware version 39.30.4.1 build 35138 op_mode iwldvm

如果没有相关的输出，那么需要在消息中查找关于您之前指定的模块的完整输出（本示例中的模块是`iwlwifi`），然后查找对应的错误信息：

    # dmesg | grep iwlwifi

    [   12.342694] iwlwifi 0000:02:00.0: irq 44 for MSI/MSI-X
    [   12.353466] iwlwifi 0000:02:00.0: loaded firmware version 39.31.5.1 build 35138 op_mode iwldvm
    [   12.430317] iwlwifi 0000:02:00.0: CONFIG_IWLWIFI_DEBUG disabled
    ...
    [   12.430341] iwlwifi 0000:02:00.0: Detected Intel(R) Corporation WiFi Link 5100 AGN, REV=0x6B

如果需要的内核模块已经加载且网络接口已经上线，您可以跳过下一节的内容。

### 安装驱动程序/固件

根据获得的信息，在下面网址查找硬件支持：

- 参阅表格 Linux 支持的无线驱动并转到特定驱动程序页面，其中包含受支持设备的列表。
- Ubuntu Wiki 维护了一个设备被内核和用户空间驱动支持状况的列表。
- Linux 无线支持页面和硬件兼容性列表(HCL)也维护了一个内核友好的设备列表。

注意有些厂商的产品名称相同，实际使用的芯片组却不同。usb-id (USB设备) 或 pci-id (PCI设备)才是唯一识别名称。

如果您在上述列表里找到了您的无线网卡，请按照驱动与固件排错中的指示操作，这一节中包含有关安装某些特定无线网卡所需的驱动程序和固件的信息。完成后，再次检查驱动程序状态。

如果您的上述列表里没有找到您的无线网卡，那么大概率您的网卡仅在windows操作系统下受支持。对于这些设备，您可以尝试使用 #ndiswrapper。

## 工具

同其他网络设备一样，无线网络接口可以通过 iproute2包 包提供的 ip 命令来管理。

管理一个无线网络连接需要一套基本的工具。可以使用一个网络管理器或直接使用以下表格中的一个：

软件 | 软件包 | WEXT | nl80211 | WEP | WPA/WPA2/WPA3 | Archiso [1]
--- | --- | --- | --- | --- | --- | ---
wireless_tools1 | wireless_tools包 | 是 | 否 | 是 | 否 | 是
iw | iw包 | 否 | 是 | 是 | 否 | 是
wpa_supplicant | wpa_supplicant包 | 是 | 是 | 否 | 是 | 是
iwd | iwd包 | 否 | 是 | 否 | 是 | 是

1. 过时，不推荐使用.
2. 一些老驱动只支持WEXT

### iw 与 wireless_tools 的对比

下面表格给出了 `iw` 和 `wireless_tools` 命令的对比（更多示例参阅这里）。

iw 命令 | wireless_tools 命令 | 描述
--- | --- | ---
iw dev wlan0 link | iwconfig wlan0 | 获取连接状态。
iw dev wlan0 scan | iwlist wlan0 scan | 扫描可用接入点。
iw dev wlan0 set type ibss | iwconfig wlan0 mode ad-hoc | 设置操作模式为 ad-hoc。
iw dev wlan0 connect your_essid | iwconfig wlan0 essid your_essid | 连接到开放网络。
iw dev wlan0 connect your_essid 2432 | iwconfig wlan0 essid your_essid freq 2432M | 连接到开放网络的特定频道。
iw dev wlan0 connect your_essid key 0:your_key | iwconfig wlan0 essid your_essid key your_key | 用16进制密匙连接到 WEP 加密网络。
iw dev wlan0 connect your_essid key 0:your_key | iwconfig wlan0 essid your_essid key s:your_key | 用 ASCII 密匙连接到 WEP 加密网络。
iw dev wlan0 set power_save on | iwconfig wlan0 power on | 启用省电功能。

## iw

注意：

- 多数命令需要使用 root权限 执行。 使用普通用户执行某些命令,如 iw list，不会输出任何错误但并不会产生正确的输出，造成疑惑。
- 根据您硬件或加密类型的不同，某些步骤并非必要。在连接至某个接入点及获取IP地址之前，某些网卡需要首先被 激活 与/或 扫描热点。这可能需要您自己尝试。例如，WPA/WPA2 用户可能会尝试直接从步骤 连接到接入点 开始来激活无线网络。

本章节的示例会假定您的无线接口设备名称是 `interface`, 您想要连接到的WiFi接入点名称是 `your_essid`。请将这两个字段作相应替换。

### 获取接口名

提示：更多关于 iw 工具的示例，请查看 官方文档 。

获取您无线网卡的名称，运行：

    $ iw dev

接口的名称会在 "Interface" 单词后显示。比如，常见的无线网卡设备名是 `wlan0`。

### 检查连接状态

用下面的命令检查连接状态:

    $ iw dev interface link

### 获取统计数据

获取一些统计数据，比如上传下载的数据量，信号强度等：

    $ iw dev interface station dump

#### 激活接口

提示：通常不需要执行此步骤。

一些无线网卡在使用 `iw` 或 `wireless_tools`前需要先激活内核接口：

    # ip link set interface up

注意：如果出现错误 `RTNETLINK answers: Operation not possible due to RF-kill`, 请确保硬件开关已经打开。参阅 #Rfkill 说明。

如果出现错误 `RTNETLINK answers: Operation not possible due to RF-kill`, 请确保硬件开关已经打开。参阅 #Rfkill 说明。

要验证接口确实打开：

    $ ip link show interface

    3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state DOWN mode DORMANT group default qlen 1000
        link/ether 12:34:56:78:9a:bc brd ff:ff:ff:ff:ff:ff

`<BROADCAST,MULTICAST,UP,LOWER_UP>` 中的`UP` 显示接口已经打开，不要和后面的 `state DOWN` 混淆。

### 扫描接入点

查看可用的接入点：

    # iw dev interface scan | less

注意：如果显示 "Interface doesn't support scanning"，可能是忘了安装固件。有时不以 root 运行 `iwlist` 也会产生这个问题。无线网络也可能被软锁定，请运行 `rfkill list all` 进行检查。

提示：Depending on your location, you might need to set the correct regulatory domain in order to see all available networks.

需要关注的信息:

- SSID: 网络的名称.
- Signal: 用 dbm (-100 to 0) 报告的无线信号强度。数值越接近零，信号越好。观察高质量连接和低质量连接的数值差异可以了解设备的信号范围。
- Security: 没有直接报告, 检查 `capability` 开头的行，如果有 `Privacy` 信息，例如 `capability: ESS Privacy ShortSlotTime (0x0411)`, 表示网络具有某种程度的保护，
  - 如果有 `RSN` 信息，网络被 Robust Security Network(WPA2) 协议保护。
  - 如果有 `WPA` 信息，网络被 Wi-Fi Protected Access 协议保护。
  - 在 `RSN` 和 `WPA` 信息块中，可能看到如下信息：
    - Group cipher: 数值包括 TKIP, CCMP, both, others.
    - Pairwise ciphers: 数值包括 TKIP, CCMP, both, others. 可能和 Group cipher 数值不同.
    - Authentication suites: 数值包括 PSK, 802.1x, others. 家用路由器通常可以看到 PSK (i.e. 密码). 在大学中，通常会链接到需要登录名和密码的 802.1x 网络。需要知道其使用的密码管理方式(例如 EAP), 封装方法 (例如 PEAP). 详情请参考这里和这里.
  - 如果没有看到 `RSN` 或 `WPA`，但是看到了 `Privacy`, 表示使用的是 WEP.

### 运行模式

设置无线网卡的操作模式，如果连接到漫游网络，需要设置操作模式为 ibss

    # iw dev interface set type ibss

注意：有些网卡需要先关闭无线接口(`ip link set interface down`)才能修改模式。

### 连接到接入点

根据加密方式不同，需要使用密码将无线设备关联到接入点。

假设要使用的接入点 ESSID 为 `MyEssid`:

#### 无加密

    # iw dev interface connect "your_essid"

#### WEP

使用十六进制或 ASCII 密码(格式是自动识别出来的，因为 WEP 密码长度是固定的):

    # iw dev interface connect "your_essid" key 0:your_key

使用十六进制或 ASCII 密码，第三个是默认 (从0计数，共四个):

    # iw dev interface connect "your_essid" key d:2:your_key

#### 其它

- - iw 只能处理 WEP。要使用其他加密方案登录, 请查看下文中的 #认证章节。

无论您使用什么认证方法，都可以使用以下命令来确认连接是否成功：

    # iw dev interface link

## 认证

### WPA2 个人模式

WPA2 个人（模式）, 又名 WPA2-PSK, 是一种 受保护Wi-Fi访问（Wi-Fi存取保护）的模式。

您可以通过 wpa_supplicant 或 iwd 来连接, 或者直接使用网络管理器. 如果您只进行了认证，那么要获取功能齐全的连接，您仍然需要进行手动连接或使用 DHCP 客户端。

### WPA2 企业模式

WPA2 企业模式也是一种 受保护Wi-Fi访问（Wi-Fi存取保护）的模式，提供了比 WPA2 个人版更好的安全性和密钥管理，并支持其他的企业型功能，例如 VLAN 和 NAP。然而，与个人模式不同，此种加密需要额外的 RADIUS 认证服务器来处理用户的认证。个人模式不需要除无线路由器/接入点以外的设备，对所有用户也只要求一个密码或密码短语。

企业模式允许用户使用用户名和密码或者数字证书来登录 Wi-Fi。因为每个用户都拥有一个动态唯一的加密密码，因此企业模式可以防止通过无限网络的用户探听，并提高加密强度。

本章节描述如何使用网络管理器来连接到使用 WPA2 企业模式的无线接入点。

查看软件接入点#RADIUS 来获取关于设置接入点自身的相关信息。

注意：企业级加密模式需要更复杂的客户端配置，个人模式则只需要在出现提示时输入密码。客户端可能需要安装服务器的 签名证书(CA certificate)，如果使用 EAP-TLS, 则另需要为每个用户安装证书，再手动配置无线安全和 802.1X 认证设置。

协议间的对照可以参照此表格。

警告：您可以让客户端在使用WPA2企业级时不检查服务器的授权证书。然而，您在任何情况下都该尽最大努力来配置证书，因为如果不验证接入点，连接可能遭受中间人攻击。虽然连接握手可能是加密的，但最常见的密码传输配置会将密码用明文或易于破解的MS-CHAPv2协议协议进行传输。因此，客户端可能会将密码发送到代理连接的恶意接入点。

#### MS-CHAPv2

有时，除了原配的 ppp包 (Point-to-Point Protocol) 之外，要求 MSCHAPv2 type-2 with PEAP 的 WPA2 企业级接入点有时会需求 pptpclient包。netctl包 似乎能在缺少 ppp-mppe 的情况下开箱即用。虽然其他认证实现方式通常都并不可用，由于其高度脆弱的特性，用户在任何情况下都不被鼓励使用 MSCHAPv2。

#### eduroam

eduroam 是一项面向科研，高等教育与继续教育领域人员的国际漫游服务。

注意：* 在应用本章节列出的任何配置之前，首先向您的机构确认连接的详细信息。示例配置不保证任何安全性或者匹配任何安全需求。

- 存储未加密的连接配置文件时，建议用 root 用户运行以下命令以限制 root 帐户对此文件的的读取访问权限: `chmod 600 配置文件`

提示：针对 NetworkManager 的配置可以用 eduroam 配置助手工具 来生成。 此工具需要安装 python包 与 dbus-python包 。

#### 手动/自动配置

- wpa_supplicant 可以直接通过其配置文件或使用其 CLI/GUI 前端进行配置，并与 DHCP 客户端结合使用。 请参阅`/usr/share/doc/wpa_supplicant/wpa_supplicant.conf` 中的示例来结合您的详细连接信息。
- iwd#WPA Enterprise
- NetworkManager 可以使用 nmcli 或 graphical front ends 来创建 WPA2 企业级配置文件。nmtui 不支持此功能 (NetworkManager issue 376), 但可以使用现有配置。
- ConnMan 需要在连接至网络之前配置一个单独的配置文件。详情请参阅 connman-service.config(5) 和 ConnMan#连接到 eduroam (802.1X)。
- netctl 可以通过填写配置中的`WPAConfigSection=` 字段来支持 wpa_supplicant 配置文件。详情请参阅 netctl.profile(5)。

  注意：特殊引用规则适用: 参考 netctl.profile(5) § SPECIAL QUOTING RULES.
  提示：自定义证书可通过在 `WPAConfigSection` 中添加字段 `'ca_cert="/path/to/special/certificate.cer"'` 来配置。

### WPA3 个人

WPA3 Personal, 又名 WPA3-SAE, 是一种 受保护Wi-Fi访问（Wi-Fi存取保护）的模式。

wpa_supplicant 及 iwd 都支持 WPA3 个人认证模式。

### WPA3 企业模式

WPA3 企业模式 是一种 受保护Wi-Fi访问（Wi-Fi存取保护）的模式。

wpa_supplicant (自版本起 2:2.10-8) 支持 WPA3 企业模式。 参见 FS#65314。

## 提示和技巧

### 遵循监管区域要求

监管区域用于配置无线驱动，确保对无线硬件的使用符合由 FCC、ETSI 及其他组织制定的当地法规。监管区域使用ISO 3166-1二位字母国家代码。例如，美国的监管区域代码是“US”，中国则是“CN”，等等。

监管区域影响无线信道的可用性。在2.4GHz波段，美国允许使用1-11信道，日本是1-14，世界上多数其它地区则是1-13。在5GHz波段，允许使用信道的规则要复杂得多。这两种情况的更详细信息见这一WLAN信道列表。

监管区域也影响对来自无线设备的等效各向同性辐射功率（EIRP）所作的限制。这衍生自发射功率（tx power）并以dBm/mBm（1dBm=100mBm）或mW（对数尺度）衡量。在2.4GHz波段，美国和加拿大最大限制30dBm，欧洲大部分是20dBm，世界上其他地区则是20dB-30dBm。在5GHz波段，最大值通常更低。更详细的信息请参考 wireless-regdb（EIRP dBm 值在每行第二对括号里）。

错误设置监管区域可能会有用——例如，在其他信道拥挤时可以使用未用信道，或者提升发射功率以扩大传输范围。然而不推荐这种做法，因为可能会违反当地法规以及造成与其他无线电设备的干扰。

要配置监管区域，安装 crda包[损坏的链接：replaced by wireless-regdb包] 并重启（以重新加载 `cfg80211` 模块及所有相关驱动）。检查启动日志以确认 `cfg80211` 正在调用CRDA：

    # dmesg | grep cfg80211

以下命令可将当前监管区域设为美国：

    # iw reg set US

用以下命令查询：

    $ iw reg get

注意：

- 你的设备国家代码可能为“00”，它是包含了通用设置的“世界监管区域”。如果无法解除此设置，则CRDA可能配置有误。
- 根据 CRDA 的 README，从内核版本4.15开始就不再需要它，因为内核会自动从固件加载监管数据库。然而也有说法称这一加载操作需要特定的内核设置。

然而设置监管区域可能不会改变您的设置。有些设备在固件/EEPROM中设置了一个监管区域，为设备规定了限制，这意味着通过软件设置监管区域只能增加限制而不能减少。例如，一个 CN（中国）设备可以用软件设置为 US（美国）监管区域，但由于中国的 EIRP 最大值为20dBm，设备将无法以美国的最大值30dBm进行发射。

例如，查看一个 Atheros 设备的固件中是否设置了监管区域：

    # dmesg | grep ath:

对于其他芯片组，搜索“EEPROM”、“regdomain”或设备驱动的名字可能会有用。

要查看监管区域更改是否成功，以及查询可用信道数和允许发射功率：

    $ iw list | grep -A 15 Frequencies:

监管区域的持久设置可以通过编辑 `/etc/conf.d/wireless-regdom` 并解除相应区域的注释实现。 `wpa_supplicant` 也可以在 `/etc/wpa_supplicant/wpa_supplicant.conf` 中的 `country=` 行应用监管区域。

也可以通过添加模块参数（如 `options cfg80211 ieee80211_regdom=EU`），配置 cfg80211 内核模块，从而使用指定的监管区域。然而这是一种老旧的监管实现。

更多信息请阅读 wireless.kernel.org 监管文档。

### Rfkill 说明

许多笔记本都有一个硬件按钮或开关用于关闭无线网卡，然而无线网卡也可以通过内核来屏蔽。这一任务可由 rfkill 处理。显示当前状态：

    $ rfkill

    ID TYPE      DEVICE      SOFT      HARD
     0 bluetooth hci0   unblocked unblocked
     1 wlan      phy0   unblocked unblocked

如果网卡处于硬件屏蔽（hard-blocked）状态，请使用硬件按钮或开关来开启它。 如果无线网卡并没有被硬件屏蔽但处于软件屏蔽（soft-blocked），请使用以下命令：

    # rfkill unblock wifi

注意：按下硬件按钮可能会让无线网卡从硬件屏蔽，软件未屏蔽状态变为硬件未屏蔽，软件屏蔽状态。 可以通过调整 `rfkill` 内核模块的一些选项改变这一现象。

切换无线网卡的硬件按钮是厂商专用的内核模块处理的，经常是 WMI 模块。特别是非常新的硬件型号，可能还没有得到最新稳定内核的完全支持。这种情况下，在内核 bug 跟踪系统搜索信息，并将型号报告给对应厂商内核模块的维护者（如果还没有报告的话）经常会有帮助。

参见 https://askubuntu.com/questions/62166/siocsifflags-operation-not-possible-due-to-rf-kill 。u

### 节能

见电源管理#网络接口。

## 排错

这个单元包含一般性的错误排除提示, 目的并非是排除与设备或固件驱动有关的错误。 对于驱动与固件上的问题, 请看 #驱动与固件排错.

### 临时上网

如果您的网络设备出了问题但需要网络访问，例如， 下载一些软件或向社区寻求帮助， 您可以利用安卓的内置功能来通过USB端口共享网络。 详见 Android Tethering#USB tethering。

### 观察日志文件

分析系统日志文件是排错的良好切入点。在进行操作（如尝试连接到无线网络）的同时，打开第二个终端/控制台窗口并用以下命令监看内核消息：

    # dmesg -w

这样，您就不需要手动一行一行的浏览这些消息了。

当您使用网络管理器时，同样的，可以用 systemd 提供的日志命令：

    # journalctl -f

通常来说，无线网络错误都伴随着具有特定理由代码（reason code）的取消验证（deauthentication）。例如：

    wlan0: deauthenticating from XX:XX:XX:XX:XX:XX by local choice (reason=3)

对照原因代码表可能会给出解决问题的第一个提示。

### 获取IP地址失败

本文或本章节的事实准确性存在争议。

原因： The dhcpcd包 vs dhclient包 is mostly FUD.（在 Talk:网络配置/无线网络配置 中讨论）

本文或本节内容已经过时。

原因： iwconfig 被弃用了, 详见 #iw and wireless tools comparison. (在Talk:网络配置/无线网络配置讨论)

- 如果用 dhcpcd包 客户端获取ip地址反复多次均失败, 尝试安装并使用 dhclient包 。不要忘记在连接管理器中选择 dhclient 作为首选DHCP客户端

- 如果你使用有线接口可以获得IP地址而无线接口不能， 尝试禁用无线网卡的省电功能(指定 `off` 而非 `on`).

- 如果由于等待网络连接而导致超时错误，可能要将特定网卡设备的信道模式改为自动: `auto`

    # iwconfig wlan0 channel auto

在将wifi信道更改为自动之前，请确保无线接口已关闭。成功地更改后，再次打开无线接口并继续。

### IP地址有效但无法接解析主机名

如果你正在使用公共无线网络，可能会有认证门户, 确保在浏览器查询认证页面时使用HTTP 而不是HTTPS, 因为有些认证门户会重定向到HTTP. 如果不是这个导致的问题, 检查你是否可以解析域名, 可能有必要使用通过DHCP方式得到的DNS服务器。

### 设置 RTS 和静态帧分段阈值

无线网卡默认禁用了 RTS 和 分段机制 。这两种方法都以牺牲带宽来换取吞吐量 (i.e. 以速度为代价提高可靠性)。在由于无线干扰和有多个相邻接入点，从而导致连接超时或失败的环境中，这两个设置非常有用。

数据包分段通过将超过阈值的包分割，从而提高吞吐量。最大值（2346）实际上禁用了分段，因为没有任何包可以超过这个值，最小值（256）最大化了吞吐量，但带宽成本很会大。

    # iw phy0 set frag 512

RTS 通过在与接入点传输超过RTS阈值的分组之前来进行握手，从而提高吞吐量。最大值（2347）实际上禁用了RTS，没有分组可以超过这个值。最小值（0）意味着所有分组都启用RTS，但这很极端。

    # iw phy0 set rts 500

注意：`phy0` 是用`iw phy` 命令 列举出的无线网卡的名称

### 随时可能断开连接

#### Cause #1

如果你在日志里看到：`wlan0: deauthenticating from MAC by local choice (reason=3)` 并且 Wi-Fi 断开连接, 很可能是你的无线网卡的电源节能设置太激进。尝试禁用无线网卡的省电功能。

如果你的网卡不支持 启用/禁用 节能模式, 看看 BIOS 的电源管理选项。 比如，在 联想 W520 的BIOS中禁用PCI-Express电源管理就解决了这个问题。

#### Cause #2

如果你经常断连，并且在日志看到如下信息：

`ieee80211 phy0: wlan0: No probe response from AP xx:xx:xx:xx:xx:xx after 500ms, disconnecting`

在你路由器设置面板里把频道带宽改成 `20MHz` 。

#### Cause #3

有些笔记本有硬件 rfkill 开关（如Thinkpad X200系列），因为磨损或有问题，开关（或与主板的连接）可能会随时间的推移而变松，不小心触摸开关或移动电脑时就可能出现断连。这问题没有软件解决方案，除非开关是电子式的，BIOS提供了禁用开关的选项。如果开关是机械式的（大部分机型都是），就有很多解决方案，其中大多数都是要禁用开关：在主板/无线网卡上的接触点进行焊接，用胶水封堵或阻挡，使用螺丝来拧紧开关，或者直接拆除开关。

#### Cause #4

导致随时断连或完全无法连接的其他原因，比如路由器质量差，配置不完整，其他无线设备干扰，或信号质量差。

为了排错, 首先要靠近路由器，并且在不需要身份验证的情况下进行连接

如果有效，那重新启用 WPA/WPA2 ，但是选择固定/有限的路由器配置，比如：

- 如果路由器比你用的无线设备客户端老的多，把路由器设置为单一无线模式进行测试。
- 禁用混合验证模式 ，(e.g. 只启用 WPA2 with AES, o如果是老路由器，则是TKIP)
- 使用固定频道而不是自动频道 (因为附近的路由器可能老旧而且存在干扰)
- 禁用 WPS
- 把路由器的 5 GHz 频道切换为 non-DFS (Dynamic Frequency Selection) 频道. 在这种频道的连接突然被丢弃或者切换，这是因为附近天气雷达的干扰。
- 只使用2.4 GHz ，而不是自动在 5 GHz 和2.4 GHz 切换。 (后者吞吐量低，但是远距离连接更稳定)
- 禁用 `40MHz` 频道带宽 (吞吐量低，但冲突更少) ，用`cfg80211.cfg80211_disable_40mhz_24ghz=1`
- 如果路由器有 Qos功能, 检查设置的完整性。(e.g. Wi-Fi 多媒体 (WMM) 是 QoS 流控制中可选的功能， 损坏的路由器固件可能会表明他已经存在，即使没有启用这个功能)

#### Cause #5

对于一些无线网卡适配器 (e.g. Qualcomm Atheros AR9485), 随时断连可能会伴随一个 DMA 报错：

    # journalctl -xb

    ath: phy0: DMA failed to stop in 10 ms AR_CR=0x00000024 AR_DIAG_SW=0x02000020 DMADBG_7=0x0000a400
    wlp1s0: authenticate with 56:e7:ee:7b:55:bc
    wlp1s0: send auth to 56:e7:ee:7b:55:bc (try 1/3)
    wlp1s0: send auth to 56:e7:ee:7b:55:bc (try 2/3)
    wlp1s0: send auth to 56:e7:ee:7b:55:bc (try 3/3)
    wlp1s0: authentication with 56:e7:ee:7b:55:bc timed out

可行的方案是禁用 Intel IOMMU driver (DMA), 把`intel_iommu=off` 加入 kernel parameters [2].

注意：Intel IOMMU 驱动对于一些高级虚拟机功能是必需的，如PCI直通。

#### Cause #6

如果你用的是带 `iwlwifi` 或 `iwlmvm` 的设备进行无线连接，使用电池电源的时候，无线网卡似乎消失了，（可能是重启或从休眠中恢复后），可以通过 iwlmvm 里的节能模式设置修复。

创建 `/etc/modprobe.d/iwlmvm.conf` ，再添加以下行：

    /etc/modprobe.d/iwlmvm.conf

    options iwlmvm power_scheme=1

`power_scheme` 为 1 表明把 iwlmvm 设置为总是活跃。可选项如下：

值 | 描述
--- | ---
1 | 总是活跃
2 | 平衡
3 | 节能

这个修复方法是在 [3]被找到的。

#### Cause #7

若设备长期不使用 (e.g. 文件服务器), 可能会因为节能模式导致无法连接，节能模式会阻止流量传入和建立连接。尝试为接口禁用节能模式:

    # iw dev interface set power_save off

可以创建udev规则，让开机时自动执行它。参阅 Power management#Network interfaces.

#### Cause #8

如果你连接 Mesh 网络时 (e.g., WiFi6) ，会偶尔中断连接，并且你看到了如下日志信息：

    # journalctl -b

    kernel: wlan0: disconnect from AP aa:bb:cc:dd:ee:ff for new auth to 11:22:33:44:55:66

你遇到的是漫游问题，可采取以下措施：

- 如果不需要漫游，在 NetworkManager中锁定BSSID (如上面的 `aa:bb:cc:dd:ee:ff` ) (参阅 NetworkManager#Regular network disconnects, latency and lost packets (WiFi)).
- 在 Wpa_supplicant#Roaming 中调整 `bgscan`

C

#### Cause #9

如果你使用Intel WiFi 7 BE200网卡，并且WiFi在启动时完全正常，但暂停/恢复后，找不到任何网络。

问题可能在于，在新版 Linux 内核中，驱动程序或设备本身会声明其具备将设备设置为低功耗 D3cold 睡眠状态的功能，而这种状态本身存在问题。 解决方案是指示 udev 配置该卡，使其不使用该状态。

    $ /etc/udev/rules.d/99-disable-d3cold-be200.rules

    $ ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", ATTR{device}=="0x272b", ATTR{d3cold_allowed}="0"

### Wi-Fi 由于错误的信道设置而变得不可见

若电脑 Wi-Fi 信道不符合用户所处国家之规定，部分Wi-Fi即使处于信号覆盖范围内，也可能因信道默认不被允许而不可见。参阅 #Respecting the regulatory domain.

## 驱动与固件排错

这一部分包含了关于特定芯片组安装内核模块与固件的方法与规范，不同于一般的方法。

参阅内核模块了解通用的模块操作方法。

### Ralink

#### rt2x00

Ralink 芯片组的统一驱动，代替了 `rt2500`、`rt61`、`rt73` 等。Linux 内核从 2.6.24

    开始包含此驱动，但是有些设备可能需要额外固件。可以使用标准 wpa_supplicant包 和 iwconfig 工具配置。

有些芯片组需要固件文件，可以安装软件包 linux-firmware包。

参见: Using the new rt2x00 beta driver。

- 从内核 3.0 开始，rt2x00 也包含了这些驱动程序：

`rt2800pci`、`rt2800usb`。 `rt2860sta` 被主分支驱动 `rt2800pci` 替代，`rt2870sta` 被 `rt2800usb` 替代。

- 通过 `iwpriv` 可以配置很多参数，文档在 Ralink 源代码包中。

#### rt3090

对于使用 rt3090 芯片组的设备, 应该使用的驱动是`rt2800pci` ; 然而， 它并没有非常好的适配这个芯片组 (例如：有时候网速甚至不能到 2Mb/s).

#### rt3290

rt3290 芯片组是由内核模块 `rt2800pci` 识别的。一些用户遇到这些问题，他们选择恢复到打了补丁的 Ralink 驱动，这样效果更好。

#### rt3573

2012年新出的芯片组，需要 Ralink 的闭源驱动，有不同的厂商使用他们，参阅 Belkin N750 示例。

#### mt7612u

2014年新发布的芯片组，以新的商用名称联发科发布。这是一款 AC1200 或 AC1300 级别的芯片组。制造商提供了 Linux 驱动程序在支持页面。从内核 5.5 版本开始，该芯片组应该已被包含的 `mt76` 驱动所支持。

### Realtek

参见 [4][失效链接 2022-11-10] 查看 Realtek 芯片组和规范列表

#### rtl8192cu

这个驱动已经被包含在内核里了, 但很多用户报告指出即使扫描到了 wifi 也无法连接。

8192cu-dkmsAUR 包含了很多补丁；如果内核里的驱动并没有很好的起效果可以尝试这个。

#### rtl8723ae/rtl8723be

`rtl8723ae` 和 `rtl8723be` 模块已经被包含在 Linux 内核主线。

一些用户使用此网卡时可能会遇到省电方面的问题. 这表现为可能偶尔断开连接，但高级网络管理器无法识别 (netctl、NetworkManager)。以 root 身份执行 `dmesg -w` 可以验证这个错误 ，或以 root 身份执行 `journalctl -f` 查找与 powersave 和`rtl8723ae`/`rtl8723be`

    模块相关的输出. 如果你遇到了这个问题，使用 fwlps=0 内核选项，这样可以防止无线网卡自动休眠或停止连接。参阅内核模块#配置模块参数。

如果你信号很差，可能你只有一个物理天线连接了，并且天线的自动选择损坏了。可以用 `ant_sel=1` 或 `ant_sel=2` 内核选项强制选择天线[5]。

#### rtl88xxau

Realtek 芯片组 rtl8811au、rtl8812au、rtl8814au 和 rtl8821au 被设计为用于各种 USB 适配器，范围从 AC600 到 AC1900。有几个包提供对应的内核驱动，需要 DKMS 和内核头文件：

C | P | N
--- | --- | ---
rtl8811au、rtl8812au、rtl8821au | rtl88xxau-aircrack-dkms-gitAUR | Aircrack-ng 给 8811au、8812au、8821au 提供了监控模式和注入支持。
rtl8812au | rtl8812au-dkms-gitAUR | Realtek 最新官方驱动版本，仅适用于 rtl8812au。
rtl8811au、rtl8821au | rtl8821au-dkms-gitAUR | 用于 rtl8821au 的新一代驱动版本
rtl8814au | rtl8814au-dkms-gitAUR | rtl8813au 可能也适用

#### rtl8811cu/rtl8821cu

rtl8821cu-dkms-gitAUR 提供了一个内核模块给 Realtek 8811cu 和 8821cu 芯片组。

需要 DKMS, 确保安装了内核头文件。

如果安装并加载了 `8821cu` 模块，无线接口还是没有显示，需要手动指定 `rtw_RFE_type` 选项[6][7]。试试例如 `echo "options 8821cu rtw_RFE_type=0x26" | sudo tee /etc/modprobe.d/8821cu.conf`，其他值可能也可以，比如 1 或 2 等等。详见内核模块#配置模块参数

#### rtl8821ce

rtl8821ce-dkms-gitAUR 为华硕 X543UA 中的 Realtek 8821ce 芯片组提供了一个内核模块。

它需要 DKMS，所以应确保已安装内核头文件。

注意：有报告[8]提出，在 Linux 内核版本 ≥ 5.9 中由 Realtek 提供的 `rtl8821ce` 无线模块是破损的，会导致连接弱，应该优先使用上面的 AUR 版本。详见在 github 上的讨论，使用 `lspci -k` 检查是否在用默认的 (`rtw88_8821ce`)模块。如果是，把它加入黑名单。

#### rtl8822bu

rtl88x2bu-dkms-gitAUR 给 Edimax EW7822ULC USB3、Asus AC53 Nano USB 802.11ac 和 TP-Link Archer T3U adapter 的 Realtek 8822bu 芯片组提供了内核模块。

确保安装了 DKMS 和内核头文件。

#### rtl8xxxu

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

原因：应说明有关主线模块和内核版本的具体问题。 (在 Talk:网络配置/无线网络配置 中讨论)

可以通过安装 linux-firmware包 来获得 `rtl8xxxu` 的固件。

`rtl8xxxu` 驱动程序已在主线内核中。但是 linux-libre 内核不包含。

`rtl8xxxu` 主线内核模块的问题可通过编译特定芯片组的第三方模块来解决。源代码可在 GitHub 存储库中找到。 某些驱动程序可能已存在于在 AUR 中，例如 rtl8723bu-dkms-gitAUR。

提示：如果您的 USB 无线适配器基于 `RTL8188GU` 或 `RTL8192FU` 芯片，您可能需要安装 usb_modeswitch包 以将其切换至 Wifi 模式。

#### RTW88

一份 RTW88 内核模块补丁集最近被发到内核邮件列表中，有望被添加进内核主线。

如果正确配置和编译的话，上游内核以及带有补丁集的内核将会支持大部分 RTW88 芯片设备。linux-zen包 和 linux-zen-gitAUR 均包含了这些补丁，其中已打包的版本已经内置了该模块。

驱动支持型号有：882BE、8822BU、8822CE、8822CU、8723DE、8723DU、8821CE 与 8821CU。

### Atheros

MadWifi 开发团队维护了三个模块：

- `madwifi` 是最老的驱动，Arch 内核 从 2.6.39.1 开始已经不再包含。
- `ath5k` 将逐步替代 `ath_pci`，有些芯片组使用效果很好，但有些还不能很好工作(后面有说明)
- `ath9k` 是新的官方驱动，适用于新 Atheros 硬件。

还有一些驱动适用于其他的 Atheros 设备. 详见 Linux Wireless 文档。

#### ath5k

参考:

- https://wireless.wiki.kernel.org/en/users/drivers/ath5k
- http://wiki.debian.org/ath5k

若网页有时加载缓慢或设备无法获取 ip 地址，尝试从硬件加密切换为软件加密，使用 `nohwcrypt=1` 内核选项加载 `ath5k` 模块。详见内核模块#配置模块参数

有些笔记本的 LED 指示灯有问题，可以：

    echo none > "/sys/class/leds/ath5k-phy0::tx/trigger"
    echo none > "/sys/class/leds/ath5k-phy0::rx/trigger"

#### ath9k

外部文档资源:

- https://wireless.wiki.kernel.org/en/users/drivers/ath9k
- https://wiki.debian.org/ath9k

截至 Linux 3.15.1，一些用户可能会遇到网络带宽下降的问题，这种情况可以为 `ath9k` 模块设置 `nohwcrypt=1` 的内核选项。 详见内核模块#配置模块参数.

注意：使用命令 `lsmod` 查看正在使用的模块，如果名称不同（例如 `ath9k_htc`），请更改 `ath9k`。

##### 节能/省电模式

虽然 Linux 无线工具表明对于比 AR9280 更新的 Atheros ath9k 单芯片设备已经启用了动态电源节能功能，虽然 Linux Wireless 指出比 AR9280 更新的 Atheros ath9k 单芯片设备已启用动态节能功能，但一些设备仍 (例如 AR9285) powertop包 被指出省电被禁用，这种情况需手动开启。

一些设备 (例如 AR9285)，启用省电功能可能会有如下报错：

    # iw dev wlan0 set power_save on

    command failed: Operation not supported (-95)

解决方法：为 `ath9k` 模块设置 `ps_enable=1` 内核选项，详见内核模块#配置模块参数.

### Intel

#### iwlegacy

iwlegacy 是 Intel 3945 和 4965 网卡的无线驱动。linux-firmware包 已经包含此驱动。

udev 会自动加载驱动，否则要手动加载 `iwl3945` 或 `iwl4965`。详见内核模块。

如果连不上网或者连接很弱，尝试启用 802.11n：

    /etc/modprobe.d/iwl4965.conf

    options iwl4965 11n_disable=1

若启动过程中一直失败，且你正在使用 Nouveau 驱动, 尝试启用早期 KMS 避免冲突 [9]。

#### iwlwifi

iwlwifi 是适用于 Intel 当前网卡的无线驱动，例如 5100AGN、5300AGN、和 5350AGN。查看所有受支持的文件列表。该固件已包含在 linux-firmware包 里。linux-firmware-iwlwifi-gitAUR 可能包含更新的驱动。

若联网存在问题或连接很弱，尝试启用 802.11n，也可能需要启用软件加密：

    /etc/modprobe.d/iwlwifi.conf

    options iwlwifi 11n_disable=1 swcrypto=1

在 802.11n 模式下网络上行速度很慢，比如只有 20Mbps，尝试启用 TX AMPDU：

    /etc/modprobe.d/iwlwifi.conf

    options iwlwifi 11n_disable=8

若上行速度很慢，可以禁用无线网卡的省电模式。

如果你有 802.11ax (WiFi 6) 接入点并且也有连接不稳定等问题，可参阅 Intel Article 54799。

注意：用 `11n_disable=0` 参数将会阻止 802.11ac，只能使用较慢的协议，（5GHz 频段用 802.11a，2.4 GHz 频段用802.11b/g）。

##### 蓝牙共存

若无法连接蓝牙耳机或无法保持良好的数据接受速度，请禁用蓝牙共存，参考 [10]：

    /etc/modprobe.d/iwlwifi.conf

    options iwlwifi bt_coex_active=0

注意：从内核版本 5.8 起, 对于由 `iwlmvm` 内核模块处理的硬件， `bt_coex_active` 和 `sw_crypto` 模块选项已被禁用，但对于由 `iwldvm` 模块处理的老硬件，这些选项依旧起作用。

##### 固件问题

你可能会遇到驱动程序输出堆栈跟踪与报错，这会导致有点卡顿。

    # dmesg

    Microcode SW error detected.  Restarting 0x2000000.

你也可能遇到其他各种各样的问题（例如连接 5GHz 频段时的问题，随时断连，恢复后无法连接）。

要想确认是否是固件的原因，请降级 linux-firmware包 包。

如果确定是固件的问题, 移除有 bug 的固件文件以确保可以加载旧版本固件 (要更新 linux-firmware包 包，因为它不仅仅提供 Intel 无线网卡的固件更新):

    # for i in {64..73} ; do mv /usr/lib/firmware/iwlwifi-ty-a0-gf-a0-$i.ucode.xz /usr/lib/firmware/iwlwifi-ty-a0-gf-a0-$i.ucode.xz.bak ; done

为了避免每次更新后都需要手动重复这些步骤, 可以在 `pacman.conf` 里用 `NoExtract` 数组搭配通配符以此禁止它们的安装。详见 pacman#在安装时跳过文件。

##### 从 Windows 重启后无法检测到 WiFi 适配器

如果从 Windows 重启到 Linux 后，检测不到 WiFi 适配器，可能是由于 Windows 默认启用的快速启动功能。尝试禁用快速启动。iwlwifi 内核驱动维基页面有关于此问题的条目。

##### 禁用 LED 闪烁

注意：适用于 `iwlegacy` 和 `iwlwifi` 驱动

默认设置中 LED 闪烁是开启的，有些人不喜欢，可以用 systemd-tmpfiles 禁止闪烁：

    /etc/tmpfiles.d/phy0-led.conf

    w /sys/class/leds/phy0-led/trigger - - - - phy0radio

运行 `systemd-tmpfiles --create phy0-led.conf` 使更改生效，或重启

查看此 LED 所有可选的触发值：

    # cat /sys/class/leds/phy0-led/trigger

提示：如果你没有 `/sys/class/leds/phy0-led`，尝试使用 `led_mode="1"` 模块参数。它应当同时适用于 `iwlwifi` 和 `iwlegacy` 驱动。

    # cat /sys/class/leds/phy0-led/trigger

### Broadcom

参见博通无线网卡。

### 其他驱动/设备

#### Tenda w322u

该型号 Tenda 卡 可被视为 `rt2870sta` 设备。参阅 #rt2x00。

#### orinoco

这应当是内核的一部分，是已经被安装的。

部分 Orinoco 芯片组属于 Hermes 二代系列。应使用 `wlags49_h2_cs` 驱动而非 `orinoco_cs` 以获得WPA 支持。 使用此驱动前需先把 `orinoco_cs` 加入黑名单。

#### prism54

`p54` 已经包含在内核中，不过必须从此网站下载适合你网卡的驱动并且把它安装进`/usr/lib/firmware` 目录。

过时的 `prism54` 和新内核模块 `p54pci` 或 `p54usb` 同时装入造成冲突，使用 `lsmod | grep prism54` 查看是否装入了过时模块，如果是，那么就屏蔽 `prism54` 并根据上面方法修改固件名称。

#### zd1211rw

zd1211rw 是 ZyDAS ZD1211 802.11b/g USB WLAN 芯片的驱动，最近的版本的内核已经包括了。有被支持的设备列表。需要安装固件zd1211-firmwareAUR。

#### hostap_cs

Host AP 是一个 Linux 驱动程序，对于基于 Intersil 的 Prism2/2.5/3 芯片组的无线局域网卡。该驱动程序包含在 Linux 内核中。

注意：确保把 `orinico_cs` 驱动程序加入黑名单。

#### ACX100/111

警告：适用于这些设备的驱动 已损坏且并不适用于更新的内核版本。

软件包: `tiacx`、`tiacx-firmware` (已被官方仓库 和 AUR 移除)。

详见官方维基。

### ndiswrapper

Ndiswrapper并不是一个真正的驱动,但是如果你无法找到适合你的无线网卡驱动, 它就派上用场了.有的时候, 它是非常有用的.为了使用Ndiswrapper, 你需要 Windows 驱动中的 *.inf 文件(*.sys 文件应该和 *.info 在同一个目录中)。如果你需要从 `*.exe` 文件解压缩，你可以使用 cabextract包。

警告：确保使用合适架构(也就是 32/64 位)的驱动。

下面是安装 ndiswrapper 的几个步骤:

1. 安装 ndiswrapper-dkms包 2. 安装驱动到 `/etc/ndiswrapper/*`

    ndiswrapper -i filename.inf

3. 列出所有的安装的驱动

    ndiswrapper -l

4. 配置文件写到 `/etc/modprobe.d/ndiswrapper.conf`

    ndiswrapper -m
    depmod -a

然后依照内核模块一文设置启动时加载这个模块。

    modprobe ndiswrapper
    iwconfig

如果正常的话, 你应该可以看到wlan0接口了。如果有问题的话, 你可以阅读： Ndiswrapper installation wiki[失效链接 2020-08-04 ⓘ]. ndiswrapper howto 和 ndiswrapper FAQ.

## 参见

- Linux Wireless 项目
- Aircrack-ng 驱动程序安装指南
- Wireless Device Database Wiki (由于原维基站点已关闭，该分叉站点由 wi-cat.ru 托管。目前有两个不太完整的版本： TechInfoDepot、deviwiki)

分类：​

- 调用重复模板参数的页面
- 无线网络
- 包含损坏的软件包链接的页面
- 使用“模板:过时”标记的页面或章节
- 包含失效链接的页面

隐藏分类：​

- 使用“模板:准确性”标记的页面或章节

网络配置/无线网络配置
添加话题