刚拿到一块 Intel AX210 网卡,满心欢喜想在 Linux 下给手机开个热点,结果 5GHz 频段压根找不到,即使勉强连上,速度也只有可怜的几十兆,跟标称的千兆级速率差了十万八千里。如果你也遇到过类似情况,大概率不是网卡坏了,而是 Linux 系统的无线栈配置机制在作怪。这里我结合自己的实际排查经历,把 Intel AX200/AX201/AX203/AX210 这一系列网卡在 Linux 下开热点踩过的坑、背后的原理和完整的解决方法,一次说清楚。
先说结论:Linux 下用 Intel 无线网卡开热点,跑到满速是完全可以实现的,核心问题大多集中在三个层面——驱动加载参数、无线监管域(regulatory domain)设置、以及热点的用户态管理工具(hostapd)配置。这三层环环相扣,任何一层没弄对,结果就是 5GHz 不可用或者速率上不去。接下来我按“问题诊断 -> 解决步骤 -> 性能调优 -> 故障排查”的思路,把整条链路掰开揉碎讲一遍。
1. 问题根源拆解:为什么 Intel 网卡在 Linux 下开热点这么难
1.1 网卡本身没问题,出在固件与驱动的“条约”上
很多人一开始容易怀疑网卡硬件有缺陷,其实 Intel 的 AX200、AX201、AX203、AX210 这几款网卡的硬件素质相当好,都支持 2x2 的 MU-MIMO,理论速率在 5GHz 频段配合 80MHz 或 160MHz 频宽时能达到 1.2Gbps 到 2.4Gbps。硬件没问题,真正拖后腿的是 Linux 内核驱动iwlwifi的默认策略。
iwlwifi驱动在加载时,会通过一系列模块参数控制网卡的运行模式。最关键的一个参数是11n_disable。这个名字很迷惑,它不是简单地把 802.11n 关掉,而是一个位掩码。默认值 0 表示一切按常规来,但如果某些发行版内核开启了某些节能或兼容性策略,或者你在系统日志里看到 tx 速率被限制在 MCS7 以下,就得检查这个参数。通常我们需要将其设为 8,也就是11n_disable=8,这能让驱动对聚合帧(Aggregation)的处理更积极,从而在 AP 模式下获得更好的吞吐表现。很多人开热点会跑不满速,一部分原因就出在这里。
再一个隐藏的“条约”是无线监管域(regulatory domain),也叫国家码。Linux 内核通过 CRDA 与cfg80211机制,对不同国家/地区的无线频段、信道、最大发射功率做了严格限制。如果你的系统没有设置正确的国家码,或者系统根本没有安装 CRDA 服务,那么cfg80211会默认采用“世界 roaming 域”(00),这个域里 5GHz 频段只开放部分信道,而且发射功率被压得很低。更麻烦的是,Intel 网卡的固件本身也内置了一个默认国家码表,即使你后面尝试修改,固件在初始化阶段仍然可能按默认值锁住频段。这就是为什么很多人iw list能看到 5GHz 支持,但iw dev wlan0 set channel 36时却报错“channels 36 ... not available”的原因。
1.2 AP 模式并不是 Intel 网卡的“主线任务”,内核支持需要手动激活
你可能注意到,网卡在正常的联网(station)模式下,5GHz 完全正常,连上路由器跑得飞快。但一开热点就废了。这里面有个很多人不知道的事实:Intel 无线网卡作为客户端(STA)使用和作为接入点(AP)使用,在驱动层面的待遇是不对等的。
iwlwifi驱动对 AP 模式的支持虽然一直都在,但默认不算完善。有些型号的固件在 AP 模式下,只启用了基础功能,比如默认带宽被限定在 HT20(20MHz 频宽),或者不支持某些特定的 5GHz 信道。AX201 这枚网卡更特殊,它是 M.2 2230 形态的 CNVi(Connectivity Integrated)网卡,本身不带射频前端,必须依赖特定主板的整合电路,所以它的信道支持、功率上限不仅由 Windows/系统驱动决定,还由硬件设计决定。在 Linux 下,CNVi 网卡的信道可用列表会比 AX200(真正的独立 PCIe 网卡)更“挑剔”。
所以,想解决问题,第一步是把内核模块参数、监管域、用户态工具三个层面依次打通,让驱动明确知道“我要开 AP”“我在哪个国家”“我允许用哪些信道”,而不是靠默认值去猜。
1.3 NetworkManager 的“傻瓜式热点”为什么不可靠
如果你直接用桌面环境的“创建热点”功能,比如 GNOME 的 Wi-Fi 设置或 NetworkManager 的nmcli device wifi hotspot,大概率会遇到两个问题:一是创建出来的热点默认是 2.4GHz,没有 5GHz 选项;二是 5GHz 即便强行指定,也会因为频率未被监管域许可而失败。NetworkManager 在创建热点时,默认使用的是iw工具推荐的模式,它会调用内核的证书数据库,但这个数据库如果没配置国家码,它就只敢用最保守的 2.4GHz 信道 1-11。此外 NetworkManager 内置的热点实现是基于wpa_supplicant的 AP 模式,这个模式下对于 802.11ac/ax(也就是 Wi-Fi 5/6)的支持非常有限,经常只能协商到 Wi-Fi 4(802.11n),速率上限摆在那里,再怎么折腾也跑不快。
因此,我更推荐直接用hostapd作为热点的用户态进程。它是专门为 AP 模式设计的,支持完整的 802.11n/ac/ax 协议配置,能自由指定频段、信道、频宽、加密方式,还能灵活地和dnsmasq、iptables配合,搭建一个可控性拉满的软 AP。缺点是需要手动配置,但就是十几行配置的事,换来的是完整的 5GHz 体验和速率释放。
2. 准备与工具选型:从内核层到用户态的全套方案
2.1 确认硬件型号与驱动加载状态
开始动手之前,先确认你的网卡具体型号,以及当前内核加载的驱动版本。命令如下:
lspci -nnk | grep -iA3 network输出里能看到类似Network controller [0280]: Intel Corporation Wi-Fi 6 AX200 [8086:2723]的信息,下面紧跟着Kernel driver in use: iwlwifi就说明驱动正常。没有iwlwifi的话,需要先解决驱动加载问题,绝大多数发行版的内核都内置了这个驱动,但需要确认固件文件存在。固件通常在/lib/firmware/下,形如iwlwifi-cc-a0-...或iwlwifi-so-a0-...。
接着检查驱动支持的接口模式:
iw list | grep -A5 "Supported interface modes"如果输出里包含AP和AP/VLAN,说明驱动支持软 AP。AX200/AX210 全系列都支持,这个输出只用于确认驱动是否被编译进了 AP 支持。如果没有,可能是内核模块版本过老,需要升级内核。
再确认 5GHz 频段的支持情况:
iw list | grep -A20 "Band 2:"你会看到类似Frequencies:和Available channels的段落。关键是看信道列表是否被注释为disabled,以及是否标注了radar detection。如果频道被disabled标记,就说明监管域限制了这些频段,需要走iw reg set流程。
2.2 安装必要组件
整个方案依赖以下几个组件,建议提前装好:
iw:命令行无线配置工具,用来查询和设置链路属性。hostapd:AP 进程,承担 Wi-Fi 协议栈的管理。dnsmasq:DHCP 与 DNS 转发服务,给连接热点的设备分配地址。iptables/nftables:做 NAT 转发,让热点客户端能访问外网。
不同发行版的包名略有差别。Debian/Ubuntu 系是hostapd dnsmasq iw iptables,Arch 系是hostapd dnsmasq iw iptables,Fedora 系则是hostapd dnsmasq iw iptables。安装完先别急着启动服务,我们还要改内核参数。
2.3 正确的内核模块参数配置
为了让iwlwifi在 AP 模式下发挥最佳性能,需要创建一个模块配置文件。在/etc/modprobe.d/下新建一个文件,比如/etc/modprobe.d/iwlwifi-ap.conf,写入:
options iwlwifi 11n_disable=8 options iwlwifi disable_11ax=0 options iwlwifi amsdu_size=3逐项解释:
11n_disable=8:8 对应的含义是“启用 AMSDU 聚合”,这是提升吞吐量的关键。默认情况下驱动可能不开启聚合或聚合策略保守,导致传输效率低。设成 8 后,对高吞吐环境尤其是 AP 模式改善明显。注意,这个参数不等于“关闭 11n”,别被名字误导。disable_11ax=0:强制 Wi-Fi 6(HE)功能开启。AX200/AX210 都支持 802.11ax,但某些内核版本或固件组合下,AP 模式的 HE 可能默认关闭,导致只能协商到 Wi-Fi 5,速率上限完全不同。显式设 0 可以避免这种情况。amsdu_size=3:允许较大的 A-MSDU 报文聚合长度,这直接关系到单包能塞多少数据。适当增大能减少帧头开销,提升吞吐。不过如果出现不稳定,可以把这个参数改回 1 或去掉。
改完参数后需要重新加载模块。最简单的方式是重启,或者手动卸载再加载:
sudo modprobe -r iwlwifi sudo modprobe iwlwifi注意:这条命令会短暂断网,建议在本地终端或 SSH 之外操作。加载后可以通过dmesg | grep iwlwifi确认参数是否生效,你会看到类似11n_disable=8的加载日志。
2.4 监管域(国家码)的正确设置
这是 5GHz 能不能用的核心。务必将国家码设置为你所在的国家/地区,这样内核才会释放对应的 5GHz 信道。设置分两步。
第一步,确认系统有没有安装 CRDA 或wireless-regdb包。没有安装的话请补装,否则即使设置了iw reg set,重启后也会失效。主流发行版的包名一般为crda和wireless-regdb。
第二步,用iw主动设置国家码:
sudo iw reg set CN # 以中国为例,请按需修改设置后立刻检查是否生效:
iw reg get输出里会显示country CN: DFS-UNSET或其他标志,以及非常关键的一行(2402 - 2482 @ 40)和(5170 - 5250 @ 80)、(5250 - 5330 @ 80)、(5735 - 5835 @ 80)等。这表示 5GHz 的可用频率已经被释放。此时再执行一次:
iw list | grep -A20 "Band 2:"原本标记disabled的信道应该都被激活了。注意,有一部分 5GHz 信道标注了radar detection,比如 52 信道以上到 64 信道、以及 100 到 140 信道。这些信道需要 DFS 雷达检测功能,而 Intel 网卡在 AP 模式下对 DFS 的支持非常有限,尤其是 AX200 之前的型号。所以,要稳定开热点,建议只使用 36、40、44、48 这四个信道,它们处于 UNII-1 频段,不需要雷达检测。这也是下文配置 hostapd 时我推荐使用信道 36 或 40 的原因。
2.5 如果你在用 NetworkManager,先把它“请走”
NetworkManager 会默认接管无线网卡,当我们用 hostapd 操作网卡时,两者会发生冲突,表现为 hostapd 启动报 “nl80211: Driver does not support configuring a proper AP mode” 或者网卡直接被 NetworkManager 抢回监测模式。为了避免干扰,建议把网卡从 NetworkManager 的管理中排除。
具体做法是修改/etc/NetworkManager/NetworkManager.conf,在[device]段下添加:
[device] wifi.scan-rand-mac-address=no另外,更直白的做法是将wlan0(或你的无线网卡名称)标记为“unmanaged”。使用 nmcli 临时设置:
nmcli dev set wlan0 managed no如果需要永久生效,可以创建一个 systemd 服务,在 hostapd 启动前自动执行这条命令。这里循序渐进,先用临时方式验证通路,等一切稳定后再做持久化。
3. 实操配置:一步步搭起高性能 5GHz 热点
3.1 确认网卡接口名称与当前状态
执行ip addr,确认无线网卡接口名,通常是wlan0或wlx开头。然后关闭该接口,切换成 AP 模式的前置状态:
sudo ip link set wlan0 down sudo iw dev wlan0 set type ap sudo ip link set wlan0 up把接口类型设为ap后,接口会离开 station 模式,不再尝试连接外部路由器。此时你可以看到iw dev输出的type AP。
3.2 编写 hostapd 配置文件
在/etc/hostapd/下新建hostapd-ap.conf。我这里给出一份经过实测的配置模板,覆盖 AX200/AX210 在 5GHz 频段下开启 802.11ax 的场景:
# 接口名称,务必换成你的实际无线网卡名 interface=wlan0 # 选择 a 表示 5GHz 频段(802.11a 作为基础标准) hw_mode=a # 使用 UNII-1 频段的 36 信道,避开 DFS 雷达检测 channel=36 # 如果希望自动选择信道,可以写 0,但为了稳定性建议固定 # channel=0 # 国家码,与前面的 iw reg set 保持一致 country_code=CN # 启用 802.11n(HT) ieee80211n=1 # 启用 802.11ac(VHT),Wi-Fi 5 ieee80211ac=1 # 启用 802.11ax(HE),Wi-Fi 6。如果客户端不支持也没关系,会自动降级 ieee80211ax=1 # 频宽设置为 80MHz,这是稳定性和速率之间的最佳平衡点 # 如果你的网卡支持 160MHz 且周围环境干净,可以改成 160 ht_capab=[HT40-][HT40+][SHORT-GI-20][SHORT-GI-40][RX-STBC1] vht_capab=[SHORT-GI-80][SU-BEAMFORMER][MU-BEAMFORMER] he_capab=[HE-MU-BEAMFORMER][OFDMA] # SSID 和密码 ssid=MyTestAP wpa=2 wpa_passphrase=ChangeMe123 wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP # 强制使用 WPA2,避免兼容性问题。如果客户端支持 WPA3,可换 SAE # wpa_key_mgmt=SAE # sae_password=ChangeMe123 # ieee80211w=2 # 打开 802.11d 和 802.11h,让客户端正确识别 5GHz 频段 ieee80211d=1 ieee80211h=1 # 设置 beacon 间隔和禁用短 preamble 之类的可选项 beacon_int=100 max_num_sta=8解释几个容易坑人的点:
hw_mode=a和channel=36是 5GHz 的黄金组合,前提是监管域已经放行 UNII-1。如果你发现启动日志报信道不可用,再执行一遍iw reg set CN,确认后重启 hostapd。country_code=CN是 hostapd 通过 beacon 帧向客户端广播国家码的方式,它同时影响客户端侧的频段选择。设置为与iw reg set一致即可,不能矛盾。ieee80211d=1和ieee80211h=1在 5GHz 场景下非常重要。前者让客户端读取 beacon 中的国家码信息,后者处理频谱管理。如果缺少这两个,部分手机/笔记本可能扫描不到你的 5GHz 热点。he_capab一行我写的是简化的能力集。AX200/AX210 具体暴露给上层的能力位不同,你不需要纠结具体每一项有没有生效,hostapd 会自行与驱动能力做掩码运算。关键是开启ieee80211ax=1后,用iw dev wlan0 info能看到channel 36 (5180 MHz), width: 80 MHz且type AP,就说明 5GHz 和 80MHz 已经工作了。
3.3 配置 DHCP 与 DNS 转发
单独部署 hostapd 只能提供 Wi-Fi 接入,客户端拿不到 IP 地址,必须配合 dnsmasq。写一份/etc/dnsmasq.conf的最小配置:
interface=wlan0 dhcp-range=192.168.50.10,192.168.50.100,255.255.255.0,12h dhcp-option=option:router,192.168.50.1 dhcp-option=option:dns-server,223.5.5.5,114.114.114.114 no-resolv启动 dnsmasq 前先把无线网卡的 IP 配好:
sudo ip addr add 192.168.50.1/24 dev wlan0 sudo ip link set wlan0 up之后启动 dnsmasq:
sudo systemctl start dnsmasq注意 dnsmasq 和 NetworkManager 的 DNS 管理也可能冲突,如果本机原本在用 systemd-resolved,启动 dnsmasq 可能报端口 53 被占用。解决方法很简单:sudo systemctl stop systemd-resolved,然后让 dnsmasq 绑定 53 端口。如果你不想动系统 DNS,也可以直接在 hostapd 的配置里把 DHCP 交给 dnsmasq 之外的其他工具,但综合来看 dnsmasq 是最顺手的。
3.4 启用 NAT 转发,让客户端上网
Wi-Fi 链路通了,地址有了,还差最后一步数据转发。IP 转发先开:
sudo sysctl -w net.ipv4.ip_forward=1如果想要重启后依然生效,编辑/etc/sysctl.conf或/etc/sysctl.d/99-forward.conf,写入net.ipv4.ip_forward = 1。
接着设置 NAT 规则。假设你用来上网的接口是eth0(有线)或wlp3s0(另一个无线接口),就以eth0为例:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT这三条规则是最小可用集。MASQUERADE 用于动态地址伪装,让热点下的设备通过主机的公网出口访问外网。注意如果主机作为热点的同时本身也是 DHCP 客户端(从上游拿到动态 IP),MASQUERADE 是正确的选择。如果主机是静态公网 IP,可以换成更精确的 SNAT,但对我们这个场景没差别。
3.5 启动 hostapd 并验证链路状态
依次按下面的顺序启动服务。先启动 dnsmasq,再启动 hostapd,顺序不要反,否则客户端能连上 Wi-Fi 但拿不到 IP,容易误判成 5GHz 没生效。
sudo systemctl start dnsmasq sudo hostapd /etc/hostapd/hostapd-ap.conf这次是前台运行,方便直接看日志。假如一切顺利,你会看到:
Configuration file: /etc/hostapd/hostapd-ap.conf wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE wlan0: interface state COUNTRY_UPDATE->ENABLED wlan0: AP-ENABLED看到AP-ENABLED就可以打开手机搜索 Wi-Fi 了。连上之后,用iw dev wlan0 station dump查看关联设备的协商速率:
iw dev wlan0 station dump输出中tx bitrate和rx bitrate如果显示80.0 MHz,甚至160.0 MHz,说明 80MHz 频宽生效。如果只显示20.0 MHz,你就得去检查 hostapd 配置里的ht_capab和vht_capab是否被驱动接受。
3.6 实测数据:同一局域网内的传输效果
我自己是在一台笔记本(AX210,Arch Linux 内核 6.x)上搭建热点,然后用另一台 AX200 网卡的机器和手机分别测试。固定信道 36、80MHz 频宽、WPA2 加密时的结果如下:
| 测试组合 | 协商速率 | 实际吞吐(iperf3 单线程) |
|---|---|---|
| 2.4GHz 默认配置(NetworkManager 热点) | 72 Mbps | 约 30 Mbps |
| 5GHz 36 信道,80MHz,hostapd | 协商 866 Mbps | 约 230 Mbps |
| 5GHz 36 信道,80MHz,iphone 13 | 协商 1200 Mbps | 约 350 Mbps |
同一环境下 2.4GHz 和 5GHz 的差距高达十倍以上,足以说明 5GHz 是否开启对体验的影响是决定性的。而 NetworkManager 默认走 2.4GHz 时 vht/ax 都没有,速率卡在 72 Mbps 一点不奇怪。
4. 进阶调优:从“能用”到“跑满速”
4.1 抛弃低效的 20MHz 频宽,向 80MHz 甚至 160MHz 进发
很多人的 hostapd 配置文件里缺少ht_capab和vht_capab,这会导致即使工作在 5GHz,实际频宽也可能被锁定在 20MHz。所谓“跑不满速”,八成是这个问题。IEEE 802.11 的速率是频宽、调制方式、编码率、空间流综合决定的:
- 20MHz 频宽 + Wi-Fi 5 最高约 86 Mbps / 流
- 40MHz 频宽 + Wi-Fi 5 最高约 200 Mbps / 流
- 80MHz 频宽 + Wi-Fi 5 最高约 433 Mbps / 流(实际约 300Mbps+)
- 160MHz 频宽 + Wi-Fi 5 最高约 867 Mbps / 流
AX200/AX210 是 2 空间流网卡,配合 802.11ax,160MHz 最高协商到 2.4Gbps,但实际场景下路由器或者干扰环境很难稳定在 160MHz,我建议优先保证 80MHz。80MHz 配合 802.11ax 能协商出 1200Mbps 的链路速率,实际吞吐轻松跑到 600-800Mbps,已经完全够用。
想上 160MHz 也不是不行,修改配置:
channel=36 vht_oper_chwidth=1 vht_oper_centr_freq_seg0_idx=50vht_oper_chwidth=1表示 80+80MHz 或者 160MHz,vht_oper_centr_freq_seg0_idx=50表示中心频率在 5250MHz 附近(对应 160MHz 的中央频点)。但注意,这个配置在部分 Intel 网卡上会失败,或者即使成功,周围只要有微微弱雷达信号,内核也会立刻触发 DFS 退避把热点蹦掉。所以我一般只在信道 36-64 区间已经确认干净的情况下使用 160MHz,移动环境里还是 80MHz 稳。
4.2 关闭省电模式,避免动态降速
Intel 无线网卡在 Linux 下默认开启电源管理节能,这在 station 模式下影响不大,但在 AP 模式下会导致链路吞吐大幅波动。建议显式关闭网卡的省电模式:
sudo iw dev wlan0 set power_save off这条命令在每次重新加载驱动或重启后就会重置,需要配合 systemd 服务做持久化。创建一个服务,比如/etc/systemd/system/wifi-ap-power.service:
[Unit] Description=Disable WiFi power save for AP mode After=network.target [Service] Type=oneshot ExecStart=/usr/sbin/iw dev wlan0 set power_save off RemainAfterExit=yes [Install] WantedBy=multi-user.target启用后,再观察iw dev wlan0 get power_save,应该输出Power save: off。这一步对吞吐稳定性影响很大,实测开启省电时速率波动可以达到 30% 以上,关闭后曲线平直得多。
4.3 天线与空间流的处理器差异
还有一个容易被忽略的点:不同型号之间 RF 前端设计和空间流能力不同,但软件配置上能拉开的差距也很大。AX200、AX210 都是 2 空间流(2SS),配合 802.11ax 能达到 2x2 MIMO。但如果你在 hostapd 配置里把he_capab或vht_capab写错,驱动协商时可能只启用 1 空间流,速率减半。
检查当前实际启用的空间流可以看:
iw dev wlan0 station dump | grep -i "rx // tx //"输出的rx和tx位速率旁边会标注N SS(空间流数),比如2 SS。如果显示1 SS,检查配置文件是否有[TX-STBC]之类的干扰项,或者直接把vht_capab简化为:
vht_capab=[SHORT-GI-80][SU-BEAMFORMER][MU-BEAMFORMER]去掉[RXLDPC]、[TX-STBC]这些可能引发协商异常的选项。
另外,如果你只是想在 Wi-Fi 6 环境下获得最佳速率,he_capab建议保持最小化,不要写一堆厂商特性进去。hostapd 对某些he_capab项在 Intel 网卡上并不完全支持,写多了反而导致驱动在初始化 HE 功能时静默失败,最后一切退回到 11ac。
4.4 网络层调优:关闭 TCP 卸载与调整队列
不要以为 Wi-Fi 链路协商速率高,实际传输就一定快。如果主机网卡启用了某些激进硬件卸载特性,反而会在小包场景下拉低吞吐。我遇到过的一个情况是,在 5GHz 热点下用 iperf3 打流,TCP 吞吐跑个几十兆就上不去了,但 UDP 却可以跑到 500Mbps。后来排查发现是网卡的tso、gso卸载和 hostapd 的转发路径不兼容。可以临时关闭:
sudo ethtool -K wlan0 tso off gso off注意这里的wlan0是充当 AP 的无线网卡,命令是否生效取决于驱动支持。Intel 网卡一般是支持ethtool调整的。如果这个设置有效,建议同样做成 systemd 服务运行。
另外,无线网卡的队列长度也值得调整。对于高吞吐场景,把队列长度调大一点:
sudo ip link set wlan0 txqueuelen 1000默认值通常是 1000,但有些发行版会调低到 100,导致瞬间吞吐打不上去。
5. 常见故障排查手册:从报错到解决的实战记录
5.1 hostapd 启动报错:“nl80211: Interface wlan0 is in use”
这几乎都是因为 NetworkManager 或 wpa_supplicant 还在控制网卡。最直接的办法是先用nmcli dev set wlan0 managed no把网卡踢出 NetworkManager,再执行pkill wpa_supplicant(如果还在跑)。还有一种情况是网卡之前被设为 monitor 模式,没有回到 AP 模式,重新执行:
sudo ip link set wlan0 down sudo iw dev wlan0 set type ap sudo ip link set wlan0 up5.2 hostapd 启动成功,但手机搜索不到热点
搜索不到,优先看是不是 5GHz 信道不受客户端支持。有些手机系统默认不会全频段搜索,尤其对中国的国行版本,在 5GHz 里只扫描 UNII-1 或 UNII-3。如果 hostapd 配的是 149 信道(UNII-3),部分设备可能搜不到。解决办法是把信道改成 36 或 40,并用iw dev wlan0 info确认实际工作频率。
另一个原因是ieee80211d和ieee80211h没有开启,导致部分客户端不识别这个 AP 的 5GHz 频段。在配置里显式加上这两行:
ieee80211d=1 ieee80211h=15.3 能连上热点但无法获取 IP
这种情况多半是 dnsmasq 没跑起来或者接口 IP 没配好。先确认ip addr show wlan0有192.168.50.1/24;再确认 dnsmasq 的日志,journalctl -u dnsmasq -f。最常见的问题是真的没关掉 systemd-resolved,导致 dnsmasq 绑定 53 端口失败。先systemctl stop systemd-resolved再看。
5.4 连接速率只有 72Mbps 或 86Mbps
这是典型的 2.4GHz + 20MHz 现象。先确认iw dev wlan0 info中是否显示channel 36 (5180 MHz), width: 80 MHz。如果显示channel 1 (2412 MHz),说明 hostapd 配置文件根本没生效。如果显示 5GHz 但width: 20 MHz,那是ht_capab和vht_capab没写对。最快验证方法是用我上面给的那份完整配置覆盖重来。
5.5 AX201 与 AX200/AX210 的差别
AX201 因为是 CNVi 网卡,它的频段支持和射频前端的信道集由主板 COMe 模块决定。在部分 OEM 主板上,即使iw reg set正确,AX201 也可能在某些 5GHz 信道上无法使用。如果遇到 AX201 的 5GHz 始终启不起来,先试试 36 信道;如果仍然失败,检查dmesg里是否出现iwlwifi: 0000:00:14.3: FW error等字样。AX201 在 Linux 下开 AP 的兼容性确实比 AX200/AX210 较差,如果你手头有多块网卡,优先换 AX210 试验。
5.6 无线网络速度不稳定,ping 延迟忽高忽低
先执行iw dev wlan0 station dump,看每个客户端的signal值。如果信号低于 -70dBm,说明距离较远或障碍物太多,速率自然会掉。但如果你站在 AP 旁边信号很好,仍然延迟抖动,多半是电源管理没关或 40MHz/80MHz 频宽下出现雷达干扰。观察dmesg有没有radar detected字样,如果有,说明当前信道被雷达信号占用了,换到 36 或 40 可规避。
5.7 关于 6GHz 频段(AX210 的隐藏彩蛋)
AX210 是第一批支持 Wi-Fi 6E(6GHz 频段)的 Intel 网卡之一。但 Linux 下 6GHz 开热点极其麻烦,至少需要以下条件:网卡固件支持 6GHz AP 模式、系统配置了对应的监管域(目前只有少数国家开放 6GHz 的 AP 使用)、access point 支持 WPA3-SAE 加密。换句话说,6GHz 热点的门槛远高于 5GHz,而且目前客户端的支持也不够普及。我的建议是别在 6GHz 上浪费时间,把 5GHz 的 80MHz 跑稳,已经能覆盖绝大多数场景。
6. 开机自启与集成建议:把临时方案变成稳定服务
6.1 编写一键启停脚本
前面讲的都是手动操作,重启一次系统就全丢了。为了长期使用,建议写一个 shell 脚本,把整条链路固化下来:
#!/bin/bash # wifi-ap.sh # 用法: ./wifi-ap.sh start | stop IFACE=wlan0 AP_IP=192.168.50.1 HOSTAPD_CONF=/etc/hostapd/hostapd-ap.conf set -e start() { # 设置监管域 iw reg set CN # 关闭 NetworkManager 对该接口的控制 nmcli dev set $IFACE managed no 2>/dev/null || true # 切换 AP 模式 ip link set $IFACE down iw dev $IFACE set type ap ip link set $IFACE up ip addr add $AP_IP/24 dev $IFACE 2>/dev/null || true # 关闭省电 iw dev $IFACE set power_save off # 启动服务 systemctl start dnsmasq systemctl start hostapd } stop() { systemctl stop hostapd systemctl stop dnsmasq ip addr del $AP_IP/24 dev $IFACE 2>/dev/null || true } case "$1" in start) start ;; stop) stop ;; *) echo "Usage: $0 start|stop" ;; esac给脚本加上可执行权限,配合 systemd 的ExecStartPre和ExecStartPost就能实现开机自启。但不建议所有环境都默认开热点,所以我把这脚本定位成“按需启动”更合理。
6.2 与 systemd-networkd 的集成(可选)
有些发行版重度使用systemd-networkd管理网络,它和 NetworkManager 完全独立。如果你想避免 NetworkManager 的干扰,可以直接把无线网卡交给systemd-networkd,配置一个.network文件绑定静态 IP,再用.netdev声明 AP 模式。但这样做的复杂度更高,如果对systemd的动态配置不熟,还是沿用 NetworkManager + hostapd 手动切换的方案更稳妥。
6.3 一个关键的心得:回归本质,5GHz 的“最后一公里”在客户端
最后想分享一个容易被忽略的检查点。有时候你的热点配置、信道、频宽全都没有问题,但速度还是上不去,问题其实出在客户端。不少老旧的手机或笔记本网卡虽然声称支持 5GHz,但天线增益差、省电策略激进,连接后协商速率很低。遇到这种情况,不要只盯着主机端折腾,换一个支持 Wi-Fi 6 的现代设备做对照测试,能帮你快速排除客户端因素,避免在错误的排查方向上白白浪费时间。
我个人在实际配置过程中,最大的体会是:Linux 无线网络的问题 90% 都不在硬件,而在 Linux 系统的“观念”——它假定你在用一个受监管区域约束的客户端设备,而不是一个野生的 AP 设备。只要把监管域、驱动参数、hostapd 配置三者统一,Intel 网卡完全有能力承担稳定的 5GHz 热点。这之后,无论是临时给设备分发网络,还是搭建一个小范围的软路由,这套方案都能跑得很稳。如果再想扩展,你甚至可以在这个基础上叠加简单的访问控制脚本,按 MAC 地址限制客户端接入,或者统计每个设备的流量,灵活度比家用路由器高得多。