由于之前买的中兴路由器没有办法完全关掉 DHCP 服务器,所以如果 x86 重启,它就会启动自己的 DHCP 服务器,自作主张为客户端分配另一个网段(192.168.5.x)的 IP ;即使 x86 重启之后 DHCP 服务器重新上线,由于 DHCP lease 的刷新时间还没到,客户端们不会询问新的 IP ;而中兴自己则在上游 DHCP 恢复之后抛下客户端们不管了、自己以 10.x.x.x 的 IP 重新回到下级路由的位置,直接导致网烂掉。
为了改善体验,在网上冲浪一番之后决定让中兴退休,x86 把这活也揽过来(真正的 All-in-One )。于是需要挑选能够做 AP 的无线网卡,并且对 x86 上的 Archlinux 进行配置来完成这个任务。
硬件
兼职路由器,很多极客前辈们都是用的 openwrt 。恩山论坛的这个帖子是我的起点: [openwrt(x86)] 2024-4-18—官方源码—史上最全驱动—支持无线AP模式—openwrt x86-64 23.05.3版 。
根据帖主的建议,第一张卡我没有买高通的,只是买了一个便宜大份的 MT7921E。需要注意的是, QCA9882 、 MT7921 等都是芯片,整个网卡还需要其他电路才能成型;MT7921E 我的是 AzureWave 的 AW-XB468NF ; QCA9882 则是拆机件 COMPEX 的 WLE600VX 7AA。由于 AW-XB468NF 设计之初是为了做客户端的,所以做 AP 有各种各样的问题,特别是PS5会断连,所以在使用了一段时间之后我买了2张 WLE600VX 7AA 分别发射 2.4GHz 和 5GHz 。两个卡的区别简单总结如下:
支持的特性
AW-XB468NF(MT7921)
WLE600VX 7AA(QCA9882)
WiFi协议
最高 802.11ax
最高 802.11ac wave 1
频宽
80mhz(理论上支持160,没试过)
80mhz
DFS/ACS
不支持
支持
最高握手速率(5)
1201 Mbps
867 Mbps
最高握手速率(2.4)
574 Mbps
600 Mbps
通道
2T2R
2T2R
双频双待(DBDC)
不支持
不支持
接口
NGFF M.2
Mini PCIe
对于小白来说这些参数都很陌生,毕竟无线电也是一个很大的学科。根据这段时间的摸索,有以下的一些经验 之谈:
两个卡都不支持DBDC,意味着一张卡只能发射 2.4 GHz 或者 5 GHz 其中之一,不能同时发射两个频段。像普通的路由器能够同时发射两个频段的,都是有两个甚至更多的芯片才能做到的;如果真能买到这样的网卡的话,通常会表现为内置两个 radio ,在系统里也会显示成两个 dev
2T2R 代表着网卡上有两个天线接口,所以转接板需要买至少有两根天线的;比如 WLE900VX 是3T3R 的,就是有三个接口,就需要买三天线的转接板了
DFS 是很重要的,因为没有 DFS 的 MT7921 会无法扫描附近的军事、气象雷达占用了哪些频段,直接导致 5GHz 的低位频段被禁用;没有 DFS 也就同时不会有 ACS,虽然手动指定频道也不麻烦,但是毕竟能自动就自动
WLE600VX 的 Mini PCIe 转接主板的全尺寸 PCIe 接口那是真的难买;相比之下 NGFF M.2 就随便一搜一堆
软件
(前置准备 - 配置网桥、网卡设备名)
无论是 MT7621 还是 QCA9882,现在的 Linux 内核都有内置驱动,即插即用。
为了不重复劳动,所以需要把所有的 Lan 网卡都接入一个虚拟网桥(bridge),然后在这个 bridge 上运行 DHCP 服务器、提供其他服务。这部分我们用 systemd-networkd 搞定,在/etc/systemd/network/
里面搞几个文件:
1 2 3 4 5 [NetDev] Name =br0Kind =bridge
1 2 3 4 5 6 7 8 9 [Match] Name =br0[Network] Address =10.0 .0.1 /16 IPMasquerade =ipv4
配置好这些文件之后,再去/etc/udev/rules.d/
写个文件固定一下无线网卡们的名字,按照 MAC 地址命名为 netwlan0、netwlan1等名字方便记忆(address后面那一串就是mac地址,用ip a
来确认自己的网卡的mac替换进去):
1 2 3 # 10-network.rules SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="04:f0:21:aa:bb:cc", NAME="netwlan1" SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="04:f0:21:xx:yy:zz", NAME="netwlan2"
搞定之后重启,这样才能让udev规则生效。
(前置准备 - 安装、配置dnsmasq)
DHCP服务器部分,我们用 dnsmasq 来负责。关键的配置文件如下:
1 2 3 4 5 6 7 interface =br0bind-interfaces dhcp-range =10.0 .0.2 ,10.0 .0.200 ,255.255 .0.0 ,12 hdhcp-option =6 ,10.0 .0.1
此外还需要改一下 dnsmasq 的 systemd 服务文件,使用systemctl edit dnsmasq
,填入如下内容:
1 2 3 [Service] ExecStartPre =timeout 60 s bash -c 'until ip a s dev br0; do sleep 1; done'
(安装、配置 hostapd)
安装了之后,首先也是对 hostapd 的 systemd 服务文件进行更改;由于我们有好几个网卡,所以用的是 hostapd@.service 而不是 hostapd.service。使用 systemctl edit 'hostapd@.service'
,注意命令中的单引号,是为了防止shell理解错误:
1 2 3 4 [Unit] After =sys-subsystem-net-devices-br0.device
然后用 ip a
确定一下无线网卡的名字们,前面的 udev 规则正确的话现在就应该是 netwlan+数字 这样的名字了。接下来需要解决的问题是:谁是谁?特别是两张卡的 feature 很相似时,就会导致很难用iw list
来区分。其实很简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 $ ip a 3: netwlan2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000 link /ether 04:f0:21:xx:yy:zz brd ff:ff:ff:ff:ff:ff altname wlp4s0 4: netwlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000 link /ether 04:f0:21:aa:bb:cc brd ff:ff:ff:ff:ff:ff altname wlp5s0 $ iw netwlan1 info Interface netwlan1 ifindex 4 wdev 0x100000001 addr 04:f0:21:aa:bb:cc wiphy 1 $ iw netwlan2 info Interface netwlan2 ifindex 3 wdev 0x1 addr 04:f0:21:xx:yy:zz wiphy 0
iw命令的输出里面 addr 跟 ip命令的 link/ether
后面的是对应的,但是我们更关注的是 iw命令输出的 wiphy
,根据这个数字就能够确认 netwlan1和2 分别对应 iw list
的输出里面的哪个设备了;而 hostapd 配置文件里面的 ht_capab
和 vht_capab
正是根据 iw list
输出的 feature 列表进行配置的。
hostapd 的配置文件包含了非常详尽的解释,接下来的这个示例配置基于 WLE600VX 7AA 这个硬件进行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 interface =netwlan1bridge =br0driver =nl80211logger_syslog =0 logger_syslog_level =2 logger_stdout =-1 logger_stdout_level =2 ctrl_interface =/run/hostapdctrl_interface_group =0 ssid =<WiFi名字>utf8_ssid =1 country_code =CNcountry3 =0 x49ieee80211d =1 ieee80211h =1 ieee80211w =1 hw_mode =achannel =149 op_class =128 max_num_sta =128 preamble =1 macaddr_acl =0 deny_mac_file =/etc/hostapd/hostapd.denywmm_enabled =1 uapsd_advertisement_enabled =1 ieee80211n =1 ht_capab =[LDPC][HT40+][HT40-][SHORT-GI-20 ][SHORT-GI-40 ][TX-STBC][RX-STBC1][MAX-AMSDU-7935 ][DSSS_CCK-40 ]ieee80211ac =1 vht_capab =[RXLDPC][SHORT-GI-80 ][TX-STBC-2 BY1][RX-ANTENNA-PATTERN][TX-ANTENNA-PATTERN][RX-STBC-1 ][MAX-MPDU-11454 ][MAX-A-MPDU-LEN-EXP3]vht_oper_chwidth =1 vht_oper_centr_freq_seg0_idx =155 wpa =2 wpa_passphrase =<WPA2的密码>wpa_key_mgmt =WPA-PSK SAEwpa_pairwise =CCMPsae_password =<WPA3的密码>
channel、op_class、vht_oper_centr_freq_seg0_idx这几个都需要参照IEEE的手册的E-4表格,这里节选一部分:
op_class
频道起点频率(GHz)
频道宽度(MHz)
频道组
频道中心频率index
81
2.407
25
1,2,3,4,5,6,7,8,9,10,11,12,13
-
83
2.407
40
1,2,3,4,5,6,7,8,9
-
84
2.407
40
5,6,7,8,9,10,11,12,13
-
115
5
20
36,40,44,48
-
116
5
40
36,44
-
117
5
40
40,48
-
124
5
20
149,153,157,161
-
126
5
40
149,157,165
-
127
5
40
153,161,169
-
128
5
80
-
42,58,106,122,138,155
所以对于国内的 5GHz 频段来说,channel设置成149,op_class设置成128,vht_oper_centr_freq_seg0_idx设置成155,就是唯一可用的80mhz频宽频道了。而 2.4GHz 的配置文件如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 interface =netwlan2bridge =br0driver =nl80211logger_syslog =0 logger_syslog_level =2 logger_stdout =-1 logger_stdout_level =2 ctrl_interface =/run/hostapdctrl_interface_group =0 ssid =<WiFi名字>utf8_ssid =1 country_code =CNcountry3 =0 x49ieee80211d =1 ieee80211h =1 ieee80211w =1 hw_mode =gchannel =0 op_class =84 chanlist =5 -11 max_num_sta =128 preamble =1 macaddr_acl =0 deny_mac_file =/etc/hostapd/hostapd.denywmm_enabled =1 uapsd_advertisement_enabled =1 ieee80211n =1 ht_capab =[LDPC][HT40+][HT40-][SHORT-GI-20 ][SHORT-GI-40 ][TX-STBC][RX-STBC1][MAX-AMSDU-7935 ][DSSS_CCK-40 ]wpa =2 wpa_passphrase =<WPA2的密码>wpa_key_mgmt =WPA-PSK SAEwpa_pairwise =CCMPsae_password =<WPA3的密码>
假设配置文件控制 netwlan1 的保存成 /etc/hostapd/netwlan1.conf
,netwlan2 的则是 /etc/hostapd/netwlan2.conf
,那么执行以下命令启动 hostapd 以及 dnsmasq :
1 2 3 systemctl enable --now hostapd@wlan1 hostapd@wlan2 systemctl enable --now dnsmasq
附上iw list
输出的该网卡信息:
iw
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 Wiphy phy1 wiphy index: 1 max # scan SSIDs: 16 max scan IEs length: 195 bytes max # sched scan SSIDs: 0 max # match sets: 0 Retry short limit: 7 Retry long limit: 4 Coverage class: 0 (up to 0m) Device supports RSN-IBSS. Device supports AP-side u-APSD. Supported Ciphers: * WEP40 (00-0f-ac:1) * WEP104 (00-0f-ac:5) * TKIP (00-0f-ac:2) * CCMP-128 (00-0f-ac:4) * CMAC (00-0f-ac:6) * CMAC-256 (00-0f-ac:13) * GMAC-128 (00-0f-ac:11) * GMAC-256 (00-0f-ac:12) Available Antennas: TX 0x3 RX 0x3 Configured Antennas: TX 0x3 RX 0x3 Supported interface modes: * managed * AP * AP/VLAN * monitor * mesh point Band 1: Capabilities: 0x19ef RX LDPC HT20/HT40 SM Power Save disabled RX HT20 SGI RX HT40 SGI TX STBC RX STBC 1-stream Max AMSDU length: 7935 bytes DSSS/CCK HT40 Maximum RX AMPDU length 65535 bytes (exponent: 0x003) Minimum RX AMPDU time spacing: 8 usec (0x06) HT TX/RX MCS rate indexes supported: 0-15 Bitrates (non-HT): * 1.0 Mbps * 2.0 Mbps (short preamble supported) * 5.5 Mbps (short preamble supported) * 11.0 Mbps (short preamble supported) * 6.0 Mbps * 9.0 Mbps * 12.0 Mbps * 18.0 Mbps * 24.0 Mbps * 36.0 Mbps * 48.0 Mbps * 54.0 Mbps Frequencies: * 2412.0 MHz [1] (30.0 dBm) * 2417.0 MHz [2] (30.0 dBm) * 2422.0 MHz [3] (30.0 dBm) * 2427.0 MHz [4] (30.0 dBm) * 2432.0 MHz [5] (30.0 dBm) * 2437.0 MHz [6] (30.0 dBm) * 2442.0 MHz [7] (30.0 dBm) * 2447.0 MHz [8] (30.0 dBm) * 2452.0 MHz [9] (30.0 dBm) * 2457.0 MHz [10] (30.0 dBm) * 2462.0 MHz [11] (30.0 dBm) * 2467.0 MHz [12] (disabled) * 2472.0 MHz [13] (disabled) * 2484.0 MHz [14] (disabled) Band 2: Capabilities: 0x19ef RX LDPC HT20/HT40 SM Power Save disabled RX HT20 SGI RX HT40 SGI TX STBC RX STBC 1-stream Max AMSDU length: 7935 bytes DSSS/CCK HT40 Maximum RX AMPDU length 65535 bytes (exponent: 0x003) Minimum RX AMPDU time spacing: 8 usec (0x06) HT TX/RX MCS rate indexes supported: 0-15 VHT Capabilities (0x338001b2): Max MPDU length: 11454 Supported Channel Width: neither 160 nor 80+80 RX LDPC short GI (80 MHz) TX STBC RX antenna pattern consistency TX antenna pattern consistency VHT RX MCS set: 1 streams: MCS 0-9 2 streams: MCS 0-9 3 streams: not supported 4 streams: not supported 5 streams: not supported 6 streams: not supported 7 streams: not supported 8 streams: not supported VHT RX highest supported: 0 Mbps VHT TX MCS set: 1 streams: MCS 0-9 2 streams: MCS 0-9 3 streams: not supported 4 streams: not supported 5 streams: not supported 6 streams: not supported 7 streams: not supported 8 streams: not supported VHT TX highest supported: 0 Mbps VHT extended NSS: not supported Bitrates (non-HT): * 6.0 Mbps * 9.0 Mbps * 12.0 Mbps * 18.0 Mbps * 24.0 Mbps * 36.0 Mbps * 48.0 Mbps * 54.0 Mbps Frequencies: * 5180.0 MHz [36] (23.0 dBm) * 5200.0 MHz [40] (23.0 dBm) * 5220.0 MHz [44] (23.0 dBm) * 5240.0 MHz [48] (23.0 dBm) * 5260.0 MHz [52] (24.0 dBm) (no IR, radar detection) * 5280.0 MHz [56] (24.0 dBm) (no IR, radar detection) * 5300.0 MHz [60] (24.0 dBm) (no IR, radar detection) * 5320.0 MHz [64] (24.0 dBm) (no IR, radar detection) * 5500.0 MHz [100] (24.0 dBm) (no IR, radar detection) * 5520.0 MHz [104] (24.0 dBm) (no IR, radar detection) * 5540.0 MHz [108] (24.0 dBm) (no IR, radar detection) * 5560.0 MHz [112] (24.0 dBm) (no IR, radar detection) * 5580.0 MHz [116] (24.0 dBm) (no IR, radar detection) * 5600.0 MHz [120] (24.0 dBm) (no IR, radar detection) * 5620.0 MHz [124] (24.0 dBm) (no IR, radar detection) * 5640.0 MHz [128] (24.0 dBm) (no IR, radar detection) * 5660.0 MHz [132] (24.0 dBm) (no IR, radar detection) * 5680.0 MHz [136] (24.0 dBm) (no IR, radar detection) * 5700.0 MHz [140] (24.0 dBm) (no IR, radar detection) * 5720.0 MHz [144] (24.0 dBm) (radar detection) * 5745.0 MHz [149] (30.0 dBm) * 5765.0 MHz [153] (30.0 dBm) * 5785.0 MHz [157] (30.0 dBm) * 5805.0 MHz [161] (30.0 dBm) * 5825.0 MHz [165] (30.0 dBm) * 5845.0 MHz [169] (27.0 dBm) (no IR) * 5865.0 MHz [173] (27.0 dBm) (no IR) Supported commands: * new_interface * set_interface * new_key * start_ap * new_station * new_mpath * set_mesh_config * set_bss * authenticate * associate * deauthenticate * disassociate * join_ibss * join_mesh * remain_on_channel * set_tx_bitrate_mask * frame * frame_wait_cancel * set_wiphy_netns * set_channel * probe_client * set_noack_map * register_beacons * start_p2p_device * set_mcast_rate * connect * disconnect * channel_switch * set_qos_map * set_multicast_to_unicast software interface modes (can always be added): * AP/VLAN * monitor valid interface combinations: * #{ AP, mesh point } <= 8, #{ managed } <= 1, total <= 8, #channels <= 1, STA/AP BI must match HT Capability overrides: * MCS: ff ff ff ff ff ff ff ff ff ff * maximum A-MSDU length * supported channel width * short GI for 40 MHz * max A-MPDU length exponent * min MPDU start spacing Device supports TX status socket option. Device supports HT-IBSS. Device supports SAE with AUTHENTICATE command Device supports scan flush. Device supports AP scan. Device supports per-vif TX power setting Driver supports full state transitions for AP/GO clients Driver supports a userspace MPM Driver/device bandwidth changes during BSS lifetime (AP/GO mode) Device supports static SMPS Device supports configuring vdev MAC-addr on create. max # scan plans: 1 max scan plan interval: -1 max scan plan iterations: 0 Supported TX frame types: * IBSS: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * managed: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * AP/VLAN: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * mesh point: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * P2P-client: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * P2P-GO: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * P2P-device: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 Supported RX frame types: * IBSS: 0x40 0xb0 0xc0 0xd0 * managed: 0x40 0xb0 0xd0 * AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * AP/VLAN: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * mesh point: 0xb0 0xc0 0xd0 * P2P-client: 0x40 0xd0 * P2P-GO: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * P2P-device: 0x40 0xd0 Maximum associated stations in AP mode: 128 Supported extended features: * [ VHT_IBSS ]: VHT-IBSS * [ RRM ]: RRM * [ SET_SCAN_DWELL ]: scan dwell setting * [ FILS_STA ]: STA FILS (Fast Initial Link Setup) * [ CQM_RSSI_LIST ]: multiple CQM_RSSI_THOLD records * [ CONTROL_PORT_OVER_NL80211 ]: control port over nl80211 * [ ACK_SIGNAL_SUPPORT ]: ack signal level support * [ TXQS ]: FQ-CoDel-enabled intermediate TXQs * [ AIRTIME_FAIRNESS ]: airtime fairness scheduling * [ AQL ]: Airtime Queue Limits (AQL) * [ CONTROL_PORT_NO_PREAUTH ]: disable pre-auth over nl80211 control port support * [ SCAN_FREQ_KHZ ]: scan on kHz frequency support * [ CONTROL_PORT_OVER_NL80211_TX_STATUS ]: tx status for nl80211 control port support * [ POWERED_ADDR_CHANGE ]: can change MAC address while up