我这套组合拳真正用起来,是在一台连桌面环境都没装的旧笔记本上。当时系统只有一个终端,没有 NetworkManager,没有 nmtui,WiFi 死活连不上,最后就是靠 iw、wpa_supplicant、dhcpcd 这三个命令一步步敲出来的。后来在无桌面服务器、树莓派和一些精简嵌入式系统上,我也一直沿用这套方案。
这个组合的道理其实不复杂:iw 负责扫描和查看无线网卡,wpa_supplicant 负责处理 WPA/WPA2 这类加密认证,dhcpcd 负责拿到 IP 地址。三个工具各干一摊活,拼起来就是一条完整的 WiFi 连接链路。适合谁看?如果你用的是带桌面的发行版,日常有 NetworkManager 兜底,可能用不上;但凡是遇到下面几种情况,这套手动流程就是救命稻草:
- 系统没有图形界面,也没有网络管理服务;
- 桌面环境或者 NetworkManager 抽风,无线网卡不受管控;
- 你在维护一台远程服务器,需要临时接无线网做调试;
- 你自己在搭一个极简系统,想搞清楚 WiFi 连接到底分了哪几步。
这篇文章就按实际操作顺序来讲,从检查网卡开始,到扫描、认证、拿 IP,再到常见问题和排障思路。每一步会解释为什么这么做,而不只是丢命令让你抄。
1. 动手前的环境检查
很多人一上来就执行 wpa_supplicant,结果半天没反应,最后发现网卡压根没被系统识别。这一步不做,后面全是白费功夫。
1.1 确认无线网卡是否被识别
先把网卡找出来。不同接口的网卡,查看方式略有不同:
- USB 无线网卡用
lsusb; - PCIe 接口(笔记本内置网卡基本都是)用
lspci | grep -i network; - 不管什么接口,统一用
ip link看内核有没有注册出无线网卡接口。
在终端里执行:
ip link正常会看到类似下面的输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 2: enp3s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000 3: wlp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000wlp2s0这种以 w 开头、带无线驱动的命名,就是无线网卡接口。有些系统里也会显示成wlan0或者wlp3s0,命名规则取决于 udev 的配置,不用纠结名字,认准无线网卡就行。
如果ip link里压根没有 w 开头的接口,不要继续往下走了,先解决驱动问题。用dmesg | grep -i wireless或dmesg | grep -i firmware看内核日志,大概率是驱动模块没加载或者固件缺失。常见网卡芯片对应关系可以参考下表:
| 网卡芯片/品牌 | 常见驱动模块 | 说明 |
|---|---|---|
| Intel 系列(如 AX200/AC8265) | iwlwifi | 需要额外的 .ucode 固件文件 |
| Atheros/Qualcomm | ath9k_htc / ath10k_core | 部分旧芯片免固件 |
| Realtek RTL8821CE/RTL8852BE | rtw88/rtw89 | 内核版本较新才自带 |
| Broadcom BCM43xx | brcmfmac / b43 | 固件问题较常见 |
确认驱动加载情况可以用:
lspci -k看网卡那一行下面有没有Kernel driver in use。如果显示Kernel modules: xxx但没有 driver in use,说明模块没自动加载。另外可以顺手确认一下 cfg80211 和 mac80211 这两个无线子系统模块在不在:
lsmod | grep -E "cfg80211|mac80211"还要检查固件目录,比如 Intel 网卡的固件在/lib/firmware/下,找不到对应 .ucode 文件的话网卡是起不来的。固件缺失时dmesg里通常会有类似Direct firmware load for iwlwifi-cc-a0-66.ucode failed的报错,解决办法就是装上对应发行版的linux-firmware包,或者手动把 .ucode 文件拷到/lib/firmware/目录。
补充一句:有些网卡(尤其是 Realtek 新款)在内核里支持很差,就算固件齐全也可能频繁断流。如果遇到这种情况,优先考虑换一张内核支持好的 Intel 或 Atheros 网卡,别在一棵树上耗死。
1.2 处理 RF Kill 软件开关
网卡识别到了,但接口状态是 DOWN,这时候就要检查是不是被射频开关屏蔽了。
笔记本通常有硬件级别的无线开关(部分机型是 Fn 组合键),也有软件层面的 rfkill 锁。Linux 下用 rfkill 工具统一管理:
rfkill list输出看起来是这样:
0: phy0: Wireless LAN Soft blocked: no Hard blocked: yesHard blocked: yes说明是物理开关被关掉了,这种状态下软件怎么折腾都没用,得先打开笔记本的无线开关或按 Fn 快捷键。Soft blocked: yes则是软件层面锁住,执行:
rfkill unblock wifi解除锁定后,再用ip link set wlan0 up把网卡拉起来。
曾经在一台老 ThinkPad 上遇到过很诡异的情况:rfkill list显示 soft blocked 和 hard blocked 都是 no,但网卡就是无法 UP,最后发现是 BIOS 里 Wireless LAN 被 disable 了。所以笔记本用户排查到这一步还不行的话,进 BIOS 看一眼无线开关有没有被关掉。
1.3 确认 wpa_supplicant 和 dhcpcd 已安装
有些精简系统没有预装这两个工具。依次确认:
which wpa_supplicant which wpa_passphrase which dhcpcd如果提示找不到,用对应发行版的包管理器安装。Arch 系执行pacman -S wpa_supplicant dhcpcd,Debian/Ubuntu 系执行apt install wpasupplicant dhcpcd5,CentOS/RHEL 系用yum install wpa_supplicant dhcpcd。
这里有一个小细节:wpa_supplicant和wpa_passphrase通常来自同一个包,但有些精简镜像可能只装了前者没装后者。后面我们会用到wpa_passphrase来生成配置,缺了它就得多写几行配置。
2. iw 命令:扫描与无线网卡管理
环境确认没问题后,下一步就是用 iw 看看周围有哪些 WiFi 可以连。
2.1 为什么用 iw 而不是 iwconfig
有些老教程会让你用iwconfig,这工具属于 Wireless Extensions(wext)这套旧接口,而现代内核的无线子系统已经全面转向 nl80211/cfg80211 新架构。新驱动基本只支持 nl80211,iwconfig在这些新驱动上要么不能用,要么信息不完整。
iw就是针对 nl80211 的新一代命令行工具,功能更全,输出更结构化,排查问题也方便。如果你看到某些教程里还在用 iwconfig,大概率是很多年前的文章了。
用iw dev看一下无线设备列表:
iw dev输出示例:
phy#0 Interface wlp2s0 ifindex 3 wdev 0x1 addr 3c:58:c2:xx:xx:xx type managedtype managed表示网卡当前工作在站点模式(也就是作为普通客户端连路由器)。如果显示的是type AP或type monitor,说明网卡不在正常的客户端模式,需要切换:
sudo iw dev wlan0 set type managed2.2 扫描周边 WiFi 网络
扫描是个比较吃时间的操作,大概会花 2 到 5 秒,执行:
sudo iw dev wlan0 scan这条命令的原始输出非常长,包含每一个 AP 的 BSSID、SSID、信号强度、信道、支持的加密方式等。实际使用一般过滤一下:
sudo iw dev wlan0 scan | grep -E "^\s*SSID:|signal:|freq:"输出类似:
SSID: MyHomeWiFi signal: -42.00 dBm freq: 2437 SSID: Office_Guest signal: -61.00 dBm freq: 5260这里解读一下几个关键字段:
signal是信号强度,单位 dBm。数值越接近 0,信号越强。一般认为 -50 dBm 以上非常好,-70 dBm 以下就比较差了,连接可能不稳定。freq对应信道。2437 MHz 是 2.4GHz 频段的 6 信道,5260 MHz 是 5GHz 频段的 52 信道。5GHz 干扰少、速率高,但穿墙能力差,2.4GHz 覆盖好但干扰多。- SSID 为空的那一行通常是隐藏 SSID 的网络,这种网络手动连接需要额外配置,后面会提一句。
还想看加密方式的话,把 grep 再加一个 RSN 关键字:
sudo iw dev wlan0 scan | grep -E "SSID:|RSN|WPA"我一般会把完整扫描结果存到文件里慢慢看:
sudo iw dev wlan0 scan > /tmp/wifi_scan.txt然后对着文件分析各个网络的加密方式和信号强度,比在终端里滚动看舒服得多。
2.3 iw 连接开放网络的限制
iw本身可以直接连接没有加密的 WiFi:
sudo iw dev wlan0 connect "FreeWiFi"这条命令执行完如果没报错,基本就关联上了,然后手动跑 dhcpcd 拿 IP。
但注意:iw只能连接开放网络!它不负责 WPA/WPA2/WPA3 的认证握手。加密网络用iw connect会直接报错或者连上了也无法完成认证。所以实际场景中,只要目标 WiFi 有密码,就必须上 wpa_supplicant,iw在这里更多是充当扫描和状态查看的角色。
说到隐藏 SSID 的网络,如果要用iw连,得加一个参数:
sudo iw dev wlan0 connect "HiddenSSID" hidden不过从个人经验来看,直接在 wpa_supplicant 配置里加scan_ssid=1会更稳定,后面会讲到。
3. wpa_supplicant:无线认证的核心
wpa_supplicant 是整个流程里最复杂、也最容易出问题的一环。它负责和路由器完成 WPA/WPA2/WPA3 的认证握手,认证通过了,无线链路才算真正建立。
3.1 用 wpa_passphrase 生成配置文件
连接加密 WiFi 的常规做法是写一个配置文件,告诉 wpa_supplicant 要连哪个 SSID、用什么密码。
手写配置容易出错,好在系统提供了一个工具:wpa_passphrase。用法非常直接:
wpa_passphrase "MyHomeWiFi" "你的密码" > /etc/wpa_supplicant.conf生成的文件内容大概是:
network={ ssid="MyHomeWiFi" psk=6c5c8d1f5f9f0a3b6d9e1c56e5f2dd7c6a4f57631c72f01d54e249b0bcfcef4d }注意看,配置文件里保存的不是明文密码,而是通过 PBKDF2 算法计算出的 256 位预共享密钥(PSK)。这样即使配置文件被别人看到,也不会直接泄露密码原文。当然,如果你要连接的 WiFi 用的是 WPA2-AES 这种加密方式,这种配置方式完全没有问题。
把密码直接写在命令行里有个小隐患:会留在 shell 历史记录里。如果你比较在意,可以用下面这种方式:
wpa_passphrase "MyHomeWiFi" < /tmp/pass.txt > /etc/wpa_supplicant.conf把密码先写进一个临时文件,通过重定向读入。用完记得删掉临时文件。
生成配置后,最好检查一下文件内容是否完整,然后把权限收紧:
chmod 600 /etc/wpa_supplicant.conf虽然 PSK 不是明文,但也没必要让其他用户读到这个文件。
企业的 802.1X 认证网络(一般出现在公司和校园网)不能这样生成,得手写配置,用到key_mgmt=WPA-EAP和eap=参数,这是另一个话题。家用路由器基本都是 WPA/WPA2 个人模式,用wpa_passphrase生成的配置就能通吃。
3.2 前台启动 wpa_supplicant
配置文件准备好之后,先以前台模式启动 wpa_supplicant,这样能在终端里实时观察认证过程:
sudo wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf参数说明:
-D nl80211指定驱动类型。绝大多数现代无线网卡都用 nl80211。如果遇到很老的网卡或者连接失败,可以试试-D wext。-i wlan0指定无线网卡接口,这里要换成你自己的接口名。-c指定配置文件路径。
执行之后,终端会滚动输出日志。如果看到下面这行,说明认证成功:
wlp2s0: CTRL-EVENT-CONNECTED - Connection to 3c:58:c2:xx:xx:xx completed [id=0 id_str=]在这之前会看到一系列Trying to associate with ...、Associated with ...、WPA: Key negotiation completed等日志。整个过程通常在几秒内完成。
如果停留在Trying to associate with ...反复重试,或者报Authentication failed,后面第 6 节会讲怎么排查。
确认没问题后,按Ctrl+C停掉前台进程,再用后台模式重新启动:
sudo wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf-B就是 fork 到后台运行。
经验之谈:第一次调试时一定用前台模式跑,看到 CONNECTED 日志再转后台。直接上后台模式,万一认证失败,日志刷过去了你还要重新查,浪费时间。
3.3 使用 systemd 管理 wpa_supplicant 服务
如果用的发行版带 systemd,更规范的做法是通过服务来管理。
有些发行版自带wpa_supplicant@服务模板,可以直接启用:
sudo systemctl enable wpa_supplicant@wlan0 sudo systemctl start wpa_supplicant@wlan0如果没有这个模板,自己写一个服务单元文件放到/etc/systemd/system/wpa_supplicant@.service:
[Unit] Description=WPA supplicant for %I After=network.target [Service] ExecStart=/usr/sbin/wpa_supplicant -D nl80211 -i %I -c /etc/wpa_supplicant.conf Restart=on-failure [Install] WantedBy=multi-user.target配置完成后同样执行systemctl enable --now wpa_supplicant@wlan0。
用 systemd 管理的好处是开机自启、崩溃自动重启、日志统一走 journald。排查问题的时候直接:
journalctl -u wpa_supplicant@wlan0 -f日志输出来得干干净净,比自己在后台 nohup 一个进程体验好太多。
4. dhcpcd:获取 IP 地址
wpa_supplicant 完成了无线认证,链路层已经通了,但这时候网卡还没有 IP 地址,没法上网。接下来交给 dhcpcd。
4.1 一条命令拿到 IP
dhcpcd 的好处是配置少,默认情况下一条命令就能完成 DHCP 请求:
sudo dhcpcd wlan0执行之后,dhcpcd 会向路由器发送 DHCP 请求,拿到 IP 地址、子网掩码、网关和 DNS 服务器。看到类似下面的输出就说明成功了:
wlan0: soliciting a DHCP lease wlan0: offered 192.168.1.104 from 192.168.1.1 wlan0: leased 192.168.1.104 for 86400 seconds验证一下:
ip addr show wlan0会看到inet 192.168.1.104/24之类的地址。
如果之前已经获取过 IP,想重新获取,先停掉再拉起:
sudo dhcpcd -k wlan0 sudo dhcpcd wlan0有些系统里也会用到dhclient,它是 ISC 出的老牌 DHCP 客户端,作用和 dhcpcd 类似,但配置方式不太一样。现在主流发行版默认装的是 dhcpcd 或者 systemd-networkd 内置的 DHCP 客户端,我用 dhcpcd 比较多,因为它在无线场景下对网络切换的响应比较快。如果你手头只有 dhclient,执行sudo dhclient wlan0效果是一样的,不用纠结用哪个。
4.2 静态 IP 的配置方法
有些场景下不想依赖 DHCP 动态分配。比如我要给一台无桌面服务器固定一个内网地址,方便 SSH 直连;或者树莓派上跑了个小服务,地址频繁变化会很难受。
dhcpcd 的静态 IP 配置写在/etc/dhcpcd.conf里:
interface wlan0 static ip_address=192.168.1.100/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 223.5.5.5配置完成重启 dhcpcd:
sudo systemctl restart dhcpcd或者直接:
sudo dhcpcd -k wlan0 && sudo dhcpcd wlan0再ip addr show wlan0应该能看到配置好的静态 IP。
关于 DNS,尽量在配置里明确写几个稳定的 DNS 服务器,别完全依赖路由器下发的地址。很多人遇到"能 ping 通 IP 但打不开网页",通常就是 DNS 配置出了问题。
注意一个坑:静态 IP 地址一定要选在路由器 DHCP 地址池范围之外,否则路由器可能把同一个地址分给其他设备,造成 IP 冲突。最简单的做法是去路由器后台看 DHCP 地址池范围,然后选一个池外地址,或者在路由器后台做 IP 与 MAC 绑定的 DHCP 保留。
4.3 检查路由和 DNS
拿完 IP,例行检查三件事:
# 1. 默认路由是否生效 ip route show # 2. 能否 ping 通网关 ping -c 4 192.168.1.1 # 3. 能否 ping 通公网 IP(绕过 DNS) ping -c 4 8.8.8.8ip route里应该有类似这条:
default via 192.168.1.1 dev wlan0能 ping 通网关说明链路没问题,能 ping 通 8.8.8.8 说明出口没问题。这时候如果域名还解析不了,就用resolvectl status或者直接看/etc/resolv.conf检查 DNS。
dhcpcd 会自动维护/etc/resolv.conf,但这几年 systemd-resolved 的普及让这个文件变成了一个指向符号链接:
/etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf这种情况下手动改/etc/resolv.conf是没用的。用resolvectl status查看当前生效的 DNS,然后针对 systemd-resolved 做配置,或者干脆把 dhcpcd 的 DNS 写进/etc/dhcpcd.conf,让 dhcpcd 在下发地址时一并配置。
5. 串起来:完整操作流程与持久化
单独的命令都会用了,现在把它们串成一条完整的操作路径。这个流程我自己实际跑了很多遍,可以照抄。
5.1 一次完整的手动连接流程
假设网卡是 wlan0,要连接的 WiFi 是 MyHomeWiFi,按顺序执行:
# 1. 确认网卡存在并启用 ip link set wlan0 up # 2. 扫描周围 WiFi,确认目标信号和加密方式 sudo iw dev wlan0 scan | grep -E "SSID:|signal:|freq:|RSN" # 3. 生成 wpa_supplicant 配置 wpa_passphrase "MyHomeWiFi" "你的密码" | sudo tee /etc/wpa_supplicant.conf sudo chmod 600 /etc/wpa_supplicant.conf # 4. 前台启动 wpa_supplicant 并观察日志(确认 CONNECTED 后再用 -B) sudo wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf # 5. 另一个终端,获取 IP sudo dhcpcd wlan0 # 6. 验证 ip addr show wlan0 ip route show ping -c 4 192.168.1.1 ping -c 4 8.8.8.8第 4 步如果用了前台模式,当前终端会被日志刷屏。没关系,另开一个终端执行第 5 步,因为无线认证已经完成,DHCP 不受终端影响。
这套流程跑通之后,如果只是想临时用一下,不用做任何持久化配置,关机重启网卡会自动释放并断开。但如果你希望开机自动连上 WiFi,继续往下看。
5.2 和 NetworkManager 共存时怎么处理
如果系统里同时存在 NetworkManager(很多桌面发行版默认就是它),手动起的 wpa_supplicant 会被 NM 接管甚至打断。因为 NetworkManager 默认把系统里所有网卡都标记为"受管"状态,它会主动去控制网卡,跟 wpa_supplicant 抢设备。
两个办法选一个:
方法一,临时把网卡设为不受管:
sudo nmcli dev set wlan0 managed no这时 NetworkManager 就不再管 wlan0,可以手动操作了。但重启之后这个设置会失效,需要注意。
方法二,彻底禁用 NetworkManager:
sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager适合确定自己要走手动路线、不需要 NM 的场景。
如果只是想在当前会话里临时手动连一下,推荐方法一。如果是做服务器长期维护,建议直接把 NetworkManager 禁用掉,省得两个网络管理工具之间互相打架,到时候排查问题的复杂度会翻倍。
有个细节:即使nmcli dev set wlan0 managed no之后,NetworkManager 仍然可能通过 D-Bus 干扰 wpa_supplicant,因为在它启动时已经生成了一个 wpa_supplicant 实例。最稳妥的办法是:如果系统里存在 NetworkManager,且你不需要它,直接禁用它,然后用自己的 systemd 服务拉 wpa_supplicant。
5.3 开机自动连接的方案
无桌面环境的极简系统上,目前最稳的组合是 wpa_supplicant + systemd-networkd 或者 wpa_supplicant + dhcpcd 服务。
先启用 wpa_supplicant 服务:
sudo systemctl enable wpa_supplicant@wlan0 sudo systemctl start wpa_supplicant@wlan0再配置 dhcpcd 开机自启并连接 wlan0:
sudo systemctl enable dhcpcd如果是 systemd-networkd 方案,写一个/etc/systemd/network/wlan0.network:
[Match] Name=wlan0 [Network] DHCP=yes再启用 systemd-networkd 服务:
sudo systemctl enable systemd-networkd sudo systemctl start systemd-networkd两个方案选一个就行,我一般倾向于 dhcpcd,因为它对无线网络切换的依赖更少,而且配置简单。systemd-networkd 也很稳定,但它在无线网卡还没 up 时可能会等待较长时间,需要额外配置。
如果系统没有 systemd 也不怕,用最原始的/etc/rc.local,在里面加上延时等待然后拉起 wpa_supplicant 和 dhcpcd:
#!/bin/sh sleep 10 /usr/sbin/wpa_supplicant -B -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf /usr/sbin/dhcpcd wlan0 exit 0写 rc.local 时sleep 10不是随便加的,因为开机瞬间网卡可能还没被内核完全注册,wpa_supplicant 直接启动会因为找不到接口而失败。加几秒延时能显著提高成功率,亲测有效。
6. 常见问题与排查心得
命令本身不复杂,但实际环境千奇百怪。整理几个高频问题,按症状从现象到原理给一个速查表。
6.1 问题速查表
| 现象 | 常见原因 | 排查与解决 |
|---|---|---|
| iw dev 看不到无线接口 | 驱动未加载 / 固件缺失 / BIOS 禁用了无线 | 查dmesg,安装 linux-firmware,检查 BIOS 设置 |
| rfkill list 显示 blocked | 硬件开关没开或软锁未解 | rfkill unblock wifi,检查笔记本物理开关 |
| 扫描不到任何 WiFi | rfkill 屏蔽 / 网卡模式不对 / 无线被禁用 | rfkill list,iw dev set wlan0 type managed |
| 连接认证失败,日志里出现多次 Authentication failed | 密码错误 / 路由器加密方式与配置不匹配 | 重新用 wpa_passphrase 生成配置,确认路由器加密方式 |
| wpa_supplicant 显示 CONNECTED 但没 IP | dhcpcd 没跑 / 路由器 DHCP 故障 | 手动执行dhcpcd wlan0,看日志 |
| 能 ping 通 IP 打不开网页 | DNS 配置被覆盖或错误 | 检查/etc/resolv.conf,手动指定 DNS |
| 频繁断线重连 | 信号弱 / 电源管理开启 | 检查信号强度,关闭无线电源管理 |
| 之前能连现在连不上 | 路由器重启改了加密方式 / 信道变更 | 重新扫描确认,重新生成配置 |
6.2 我踩过的几个有代表性的坑
第一个坑是手动模式下重复启动 wpa_supplicant。有一段时间我写了个脚本,发现 WiFi 断了就自动拉起 wpa_supplicant,结果系统里同时跑了两三个实例,网卡被反复重置,连不上还疯狂刷日志。后来才知道 wpa_supplicant 同一网卡最多只能有一个实例。现在写脚本都会先pkill wpa_supplicant,再启动新的,宁可慢一点也不要打架。
第二个坑是 Intel 网卡的电源管理。笔记本上跑 Linux,WiFi 用一段时间之后 ping 延迟飙到几百毫秒甚至经常断流,一开始以为是路由器问题,换了好几个固件都没用。后来发现是无线网卡的 power save 功能在搞鬼。可以关掉:
sudo iw dev wlan0 set power_save off在/etc/NetworkManager/conf.d/或者 systemd 服务里加这行,能根治日常使用中的延迟和断流问题。
第三个坑是路由器和网卡之间 WPA3 兼容性的问题。家里换了支持 WPA3 的路由器后,一台老笔记本一直连不上,wpa_supplicant 日志里频繁出现WPA: Failed to initialize WPA。原因是老网卡驱动不支持 SAE 握手。解决办法要么把路由器加密方式改成 WPA2/WPA3 混合模式,要么换一块支持 WPA3 的网卡,没有第三条路。排查这种问题时,先确认网卡硬件能力,再去查配置,避免无效折腾。
第四个坑是 DNS 被 systemd-resolved 劫持。我曾在 Ubuntu 服务器上手动配好了/etc/resolv.conf,结果重启后又变回去了。后来才发现/etc/resolv.conf是指向 systemd-resolved 的符号链接。这种情况下要么停掉 systemd-resolved,要么通过resolvectl配置 DNS。看文件头是个好习惯,开头写着# This file is managed by systemd-resolved就说明得换一条路走。
6.3 快速诊断思路
最后分享一个三层定位法:网卡层、链路层、网络层。
网卡层只看三样:ip link有没有接口、rfkill list有没有被锁、dmesg有没有驱动报错。这三条基本能确定网卡硬件层面是否就绪。
链路层看 wpa_supplicant 日志。前台模式跑一次,看到CTRL-EVENT-CONNECTED就是关联成功,反复Trying to associate就是认证阶段卡住了,重点检查密码、加密方式、路由器兼容性。
网络层看 IP 和路由。ip addr有没有拿到地址,ip route有没有默认路由,ping网关通不通。没 IP 就看 dhcpcd,有 IP 不能上网就看 DNS。
按照这个顺序排查,90% 的问题都能在几分钟内定位。别一上来就怀疑配置写错,先把日志读一遍。
这套手动流程现在依然是我在 Linux 环境里连 WiFi 的首选方案,因为它每一步都是可见的,哪里出问题日志直接告诉你,不像图形工具那样把细节全都藏起来。如果你也想彻底搞懂系统网络栈是怎么工作的,强烈建议在一台闲置机器上完整跑一遍,收益远比记住几条命令大。