USB 无线网卡 + Linux:把笔记本电脑改造成 WiFi 路由器
一台 Linux 笔记本电脑内置一张 WiFi 网卡用于连接上游网络(手机热点、家用路由),再插入一张 USB WiFi 网卡创建接入点(AP),其他设备连接后即可共享上游网络。笔记本同时承担路由、NAT、防火墙、VPN 等任务,功能远超普通家用路由器。
手机热点/家用路由 ←内置WiFi(STA)── Linux ──USB WiFi(AP)→ 其他设备
↕
VPN/策略路由/防火墙核心概念
为什么需要两张 WiFi 网卡?
802.11 标准规定一张物理网卡在同一时间只能处于一种工作模式:
| 模式 | 作用 |
|---|---|
| Station(STA) | 连接别人的热点,作为客户端上网 |
| Access Point(AP) | 发射热点,让其他设备连接 |
| Monitor | 监听空中无线帧,用于抓包分析 |
内置 WiFi 在连接手机热点时已处于 STA 模式,无法同时做 AP。因此需要第二张网卡专门做 AP。
Linux 如何变成路由器
| 组件 | 作用 |
|---|---|
| IP 转发 | 允许内核在不同网口间转发数据包 |
| NAT / Masquerade | AP 侧流量伪装后经上游出口发出 |
| DHCP 服务器 | 给下游设备分配 IP 地址 |
| iptables / nftables | 防火墙、访问控制、端口转发 |
这些组件全部是 Linux 内核自带功能,无需额外软件。
硬件选购
USB WiFi 网卡选购要点
最关键的参数不是品牌或型号,而是芯片型号。Linux 对无线网卡的兼容性由芯片决定。
芯片方案对比
| 芯片 | 频段 | 理论速率 | Linux 驱动 | AP 模式 | 价格 |
|---|---|---|---|---|---|
| RTL8188EU | 2.4GHz | 150Mbps | 内核自带 | ✓ | ¥20-30 |
| RTL8821CU / RTL8811CU | 2.4+5GHz | 150+433Mbps | 内核 6.14+ 自带 | ✓ | ¥25-40 |
| RTL8812AU | 2.4+5GHz | 300+867Mbps | 第三方驱动 | ✓ | ¥60-100 |
| AR9271 | 2.4GHz | 150Mbps | 主线内核,驱动+固件全开源 | ✓ | ¥30-50 |
| MT7921au | 2.4+5GHz WiFi 6 | 574+1201Mbps | 主线内核 5.19+ | ✓ | ¥50-100 |
避雷指南
- 不要买 Broadcom 芯片的 USB 网卡(如 BCM43143、BCM4323)。Linux 驱动极度不成熟,AP 模式几乎不可用。
- 不要买宣称 "免驱" 的网卡。这些 "免驱" 通常指 Windows 内置驱动,Linux 上无意义。
- 优先买 USB-A 接口。USB-C 接口的 WiFi 网卡极少,选择空间小。买 USB-A 网卡 + 几块钱的转接头即可。
芯片确认方法
购买前问卖家芯片型号,或到手后插 Linux 上运行:
lsusb
# 输出如:ID 0bda:c811 Realtek Semiconductor Corp.
# 0bda:c811 即 RTL8811CU
# 确认 AP 模式支持
iw list | grep -A 10 "Supported interface modes"
# 输出包含 * AP 即为支持网络方案
基本路由
上游网络 ← 内置WiFi(WAN) ── Linux(192.168.100.1) ── USB网卡(AP) → 下游设备
↑
DHCP: 192.168.100.x加 VPN 网关
上游网络 ← 内置WiFi(WAN) ── Linux ── VPN隧道 ── USB网卡(AP) → 下游设备全走VPN策略路由
上游网络 ← 内置WiFi ── Linux ── USB网卡(AP) → 设备A走VPN
↕ → 设备B走直连
ip rule + iptables mark配置方法
方法一:NetworkManager 一键热点(最简单)
# 查看接口名
iw dev
# 开热点
nmcli dev wifi hotspot ifname wlx... ssid MyRouter password 12345678
# 设为持久连接
nmcli connection add type wifi ifname wlx... mode ap ssid MyRouter \
wifi-sec.key-mgmt wpa-psk wifi-sec.psk 12345678 \
ipv4.method shared ipv6.method disabled优点:一行命令。缺点:ipv4.method shared 的网段不可控,且与自定义 iptables 策略可能冲突。
方法二:hostapd + dnsmasq(灵活可控)
1. 安装
sudo apt install hostapd dnsmasq2. hostapd 配置(AP)
sudo tee /etc/hostapd/hostapd.conf << 'EOF'
interface=wlx000000000001
driver=nl80211
ssid=MyRouter
hw_mode=g
channel=7
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
EOF参数说明:
| 参数 | 说明 |
|---|---|
interface | 网卡接口名 |
driver=nl80211 | Linux 标准无线驱动接口 |
hw_mode=g | 2.4GHz(a=5GHz,g=2.4GHz) |
channel | 信道,2.4GHz 用 1-11,5GHz 用 36-165 |
3. dnsmasq 配置(DHCP)
sudo tee /etc/dnsmasq.d/router-lan.conf << 'EOF'
port=0
bind-interfaces
interface=wlx000000000001
dhcp-range=192.168.100.50,192.168.100.200,12h
dhcp-option=3,192.168.100.1
dhcp-option=6,192.168.100.1
EOFport=0 关闭 dnsmasq 的 DNS 功能,避免端口冲突。dhcp-option=3 把网关指向路由器本身。
4. 启动
# 先配 IP
sudo ip addr flush dev wlx000000000001
sudo ip addr add 192.168.100.1/24 dev wlx000000000001
sudo ip link set wlx000000000001 up
# 启 AP
sudo hostapd -B /etc/hostapd/hostapd.conf
sleep 2
# 启 DHCP
sudo systemctl restart dnsmasq
# 开转发 + NAT
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o wlp2s0 -j MASQUERADE
sudo iptables -A FORWARD -i wlx000000000001 -o wlp2s0 -j ACCEPT
sudo iptables -A FORWARD -i wlp2s0 -o wlx000000000001 -m state --state RELATED,ESTABLISHED -j ACCEPT其中 wlp2s0 是上游 WiFi 接口,wlx000000000001 是 USB 网卡接口。
方法三:单脚本管理(推荐)
将所有步骤封装为一个管理脚本,用法:
sudo ./router setup 交互式配置向导
sudo ./router start 一键启动
sudo ./router stop 一键停止
sudo ./router status 查看状态脚本核心流程:
start:
1. setup_lan() → 清旧IP、设固定IP、UP接口
2. start_ap() → 杀旧hostapd、启新hostapd、等待就绪
3. start_dhcp() → 启dnsmasq(失败重试)
4. enable_fwd() → sysctl ip_forward=1
5. apply_rules() → iptables NAT + 转发 + 安全规则安全增强
Kill Switch
VPN 断线时,阻止下游设备通过上游 WiFi 直连互联网:
iptables -A FORWARD -i wlx... -o wlp2s0 -j DROPDNS 劫持
强制下游 DNS 请求走指定服务器:
iptables -t nat -A PREROUTING -i wlx... -p udp --dport 53 \
-j DNAT --to-destination 指定DNS地址MSS Clamping
VPN 隧道有额外开销,不做处理会导致 TCP 分片:
iptables -t mangle -A FORWARD -o 隧道接口 -p tcp \
--tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu故障排查
hostapd 启动后接口状态 NO-CARRIER
信道不兼容。换信道:
sudo sed -i 's/channel=7/channel=1/' /etc/hostapd/hostapd.conf
sudo pkill hostapd && sudo hostapd -B /etc/hostapd/hostapd.confdnsmasq 启动失败
常见原因:
| 错误 | 原因 | 解决 |
|---|---|---|
Address already in use | 端口 53 被占用 | 配置加 port=0 |
unknown interface | 接口未就绪 | 先确认 hostapd 运行中,加启动延时/重试 |
下游设备连上但无法上网
排查顺序:
# 1. 确认上游有网
ping -c 2 1.1.1.1
# 2. 确认转发开启
cat /proc/sys/net/ipv4/ip_forward
# 3. 确认 iptables 有流量计数
iptables -L FORWARD -n -v
# 4. 确认下游设备 IP 正确(在设备上查)
# 网关 = 192.168.100.1,IP 在同一网段SSH 断连(Broken Pipe)
原因:SSH 连接建立在上游 WiFi 接口上,上游断线后连接立即中断。
解决:从下游侧 SSH 管理:
# 手机/笔记本连 AP 热点
ssh user@192.168.100.1这样管理路径独立于上游网络。
macOS 方案
macOS 也可以实现类似功能,但受限较多:
# 开启转发
sudo sysctl -w net.inet.ip.forwarding=1
# pf 做 NAT
echo "nat on en0 from 192.168.2.0/24 to any -> (en0)" | sudo pfctl -ef -
# DHCP
sudo /usr/libexec/bootpd -DmacOS 的限制:
- USB WiFi 网卡驱动极少(多数只支持 macOS 内置的 Broadcom 卡)
- AP 模式需要额外驱动(如 macOS 自带的互联网共享功能可用)
- VPN 策略路由不如 Linux 灵活
适合轻度使用,重度路由场景建议用 Linux。
小结
| 场景 | 推荐方案 | 投入成本 |
|---|---|---|
| 临时用 | nmcli 一行命令开热点 | ¥25-40(USB 网卡) |
| 日常用 | hostapd + dnsmasq + iptables | ¥25-40 |
| 长期稳定 | 单脚本管理 + systemd 自启 | ¥25-80 |
| 高性能 | MT7921au 双频 WiFi 6 | ¥50-100 |
核心思路:一张 USB WiFi 网卡 + Linux 内核 = 完整软件路由器,比硬件路由更灵活,比软路由更低成本。