Wi Fi网络学习记录(2):Linux无线网络STA模式配置

成元 2026-01-07 { 教程, 笔记 } [ Linux, Wi-Fi ]

简介

第二篇Wi-Fi学习记录,本篇介绍了如何利用常见的网络工具配置无线网络,连接上网络进行🏄活动。

观前需知

① 本文演示设备安装的系统为 Ubuntu Server,具体如下。

~$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 24.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.3 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

② 代码块中的 ...... 表示省略,避免显示无用信息。
③ 代码快中的 ~$ 为shell命令行提示符,表示后面的是shell命令
④ 可以用 man 命令或者访问 Arch Linux 中文维基 等方式查询感到疑惑的内容。

废键盘的操作方式💥⌨

所谓的“废键盘”指的是不利用任何管理工具,手动执行每一步配置操作。

添加无线网卡接口并打开

① 首先可以执行 iw list 查看网卡的可用接口组合,如下:

~$ iw list
Wiphy phy0
    ......
	valid interface combinations:
		 * #{ managed } <= 2, #{ P2P-device } <= 1, #{ P2P-client, P2P-GO } <= 1,
		   total <= 3, #channels <= 2
		 * #{ managed } <= 1, #{ AP } <= 1, #{ P2P-client } <= 1, #{ P2P-device } <= 1,
		   total <= 4, #channels <= 1
    ......

可以看到我的网卡phy0有两个组合,其中组合一支持同时运行两个managed接口(managed模式可以理解为STA模式,与AP模式对应),这正好方便我们演示如何配置。

② 执行 sudo iw phy phy0 interface add wlan1 type managed 来创建一个 managed 模式的新接口。我们可以执行 iw dev来查看,如下:

~$ iw dev
phy#0
	Interface wlan1
		ifindex 4
		wdev 0x3
		addr 2e:cf:67:8f:fb:3b
		type managed
		channel 36 (5180 MHz), width: 80 MHz, center1: 5210 MHz
		txpower 31.00 dBm
    ......

可以看到新接口被成功的创建了。

③ 执行 sudo ip link set wlan1 up 打开(所谓的"上行")新建的接口

让网卡接口连接到接入点(AP)

网卡创建好了之后,就要开始链路层的连接了,对于无线网络来说,最常见的就是STA连接AP了。

① 创建AP
这一步很容易完成,一般来说使用手机开启热点即可做到。可以使用 iw dev wlan1 scan 来测试接口是否能扫描到热点,如下:

# 这里我创建了一个 SSID 为 HELLOWORLD 的热点
~$ iw dev wlan1 scan | grep 'HELLOWORLD'
	SSID: HELLOWORLD

这里我让刚才创建的wlan1接口进行扫描,看它是否能找到我刚才创建的热点。

② 获取PSK,获取配置文件
想必大家的热点都设置了密码对吧?为了能够成功连接,我们需要使用密码进行验证操作。
本文创建的热点采用WPA2,因为树莓派自带的网卡似乎对WPA3支持的不太好
我们可以使用 wpa_passphrase 来获取PSK,并重定向到配置文件,如下:

# 这里可以直接给出 ssid 与 passphrase
# 也可以只给出 ssid,然后在标准输入流中写入 passphrase
# 后者被认为更安全
~$ wpa_passphrase HELLOWORLD THISISMYPASSWORD > hello_world.config
~$ cat hello_world.config
network={
	ssid="HELLOWORLD"
	#psk="THISISMYPASSWORD"
	psk=30de7b35dd21ef152bf48de9731c46f516daed2079b8a2011609d160d1f4e157
}

③ 利用配置文件连接AP wpa_supplicant 是一个 WPA Supplicant(接入客户端) 组件的实现。
这里要使用 wpa_supplicant 工具进行认证与连接。如下:

# -B , 表示后台运行程序,如果想要前台观察Log等信息,可以不加此选项
# -i , 指定无线网络接口,这里为前几步创建的接口 wlan1
# -c , 指定配置文件,这里直接使用刚才利用 wpa_passphrase 创建的配置文件
~$ sudo wpa_supplicant -B -i wlan1 -c hello_world.config

此时如果参数正确,网络接口就会顺利的连接上AP,链路层的连接就完毕了。
不过此时我们查询新接口的的一些信息,便会发现一些严重的问题,如下:

~$ ip addr show dev wlan1
4: wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 2e:cf:67:8f:fb:3b brd ff:ff:ff:ff:ff:ff
    inet6 fe80::2ccf:67ff:fe8f:fb3b/64 scope link 
       valid_lft forever preferred_lft forever
# 新的接口似乎没有IPv4地址

~$ resolvectl status wlan1
Link 4 (wlan1)
    Current Scopes: none
         Protocols: -DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
# 似乎也没有配置任何 DNS 服务器

# 如果强行使用新接口,会产生警告,并且无法正常访问
~$ ping -I wlan1 baidu.com
ping: Warning: source address might be selected on device other than: wlan1

原来链路层的连接完毕了不意味着新接口就能成功上网了,此时还需要DHCP服务(本文不演示静态配置)。

获取DHCP服务

我们可以通过**DHCP客户端工具(dhcpcd)**自动地获取IPv4地址与DNS服务器,如下:

~$ sudo dhcpcd -b wlan1
dhcpcd-10.0.6 starting

~$ ip address show dev wlan1
4: wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 2e:cf:67:8f:fb:3b brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.41/24 brd 192.168.10.255 scope global dynamic noprefixroute wlan1
       valid_lft 3589sec preferred_lft 3139sec
    inet6 fe80::2ccf:67ff:fe8f:fb3b/64 scope link 
       valid_lft forever preferred_lft forever

~$ resolvectl status wlan1
Link 4 (wlan1)
    Current Scopes: DNS
         Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
       DNS Servers: 192.168.10.237

# 现在可以正常的访问网络了
~$ ping -c 1 -I wlan1 baidu.com
PING baidu.com (110.242.74.102) from 192.168.10.41 wlan1: 56(84) bytes of data.
64 bytes from 110.242.74.102: icmp_seq=1 ttl=48 time=74.9 ms

--- baidu.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 74.912/74.912/74.912/0.000 ms

一些自动配置工具

可以看到手动输入一个个指令十分的麻烦,我们可以使用一些工具来自动配置。

systemd-networkd

一般安装在Ubuntu Server等纯命令行环境下(桌面环境下一般是 NetworkManager,本文不涉及)。
systemd-networkd 是 systemd 的配套组件,配置完后可以自动检测链路层是否建立连接,
检测到连接其会自动的配置DHCP等功能,要使用它必须在一些特定的文件夹下编写 systemd.network 单元,
这里在 /etc/systemd/network/ 目录下新建 10-wlan1.network 单元文件。

# 单元文件名格式为: 数字-文件名.network
# 数字越小优先级越高,文件后缀应该为 network
~$ cat /etc/systemd/network/10-wlan1.network 
[Match]
Name=wlan1

[Network]
DHCP=ipv4
LinkLocalAddressing=ipv6

[DHCP]
RouteMetric=600
UseMTU=true

之后重启设备或者执行 sudo systemctl restart systemd-networkd 来刷新服务。
如果没有 DHCP服务 请等待一会儿,新配置一般比较慢

systemd

既然提到了 systemd-networkd ,那么 systemd 也不能落下。
systemd 是当今最流行的初始化与进程管理系统实现,ubuntu、debian等系统都默认使用它。
我们将使用 systemd.service 单元,实现开机自动创建新的接口,然后自动连接对应的AP。
这里将在 /etc/systemd/system/ 目录下创建两个单元,分别用于打开新接口和使用wpa_supplicant进行连接。

~$ cat /etc/systemd/system/wlan-sta.service 
[Unit]
Description=Create some managed(sta) interface

[Service]
Type=oneshot
ExecStart=/usr/sbin/iw phy phy0 interface add wlan1 type managed
ExecStartPost=/usr/sbin/ip link set dev wlan1 up
ExecStop=/usr/sbin/ip link set wlan1 down
ExecStop=/usr/sbin/iw dev wlan1 del
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

~$ cat /etc/systemd/system/wpa-wlan1.service 
[Unit]
Description=WPA supplicant for wlan1
Requires=wlan-sta.service
After=wlan-sta.service

[Service]
Type=simple
# 这里 /path/to/hello_world.config 修改为你设置上对应的路径
# 这里为了演示,模糊化了路径
ExecStart=/sbin/wpa_supplicant -c /path/to/hello_world.config -i wlan1
ExecReload=/sbin/wpa_cli -i wlan1 reconfigure

[Install]
WantedBy=multi-user.target

然后设置它们开机自启动。

sudo systemctl enable wlan-sta.service 
sudo systemctl enable wpa-wlan1.service 

之后我们每次启动电脑,便会自动查创建wlan1接口,并按照hello_world.config连接AP。
如果你同时使用了 systemd-networkd ,链路层连接成功后会自动获取DHCP等服务。

待更新

等待更新中……