Brave
@47c132035ed7a1105a867946b99d67af 网络安全与大数据研究小组 公开
讨论 USB 无线网卡 + Linux:把笔记本电脑改造成 WiFi 路由器

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 / MasqueradeAP 侧流量伪装后经上游出口发出
DHCP 服务器给下游设备分配 IP 地址
iptables / nftables防火墙、访问控制、端口转发

这些组件全部是 Linux 内核自带功能,无需额外软件。


硬件选购

USB WiFi 网卡选购要点

最关键的参数不是品牌或型号,而是芯片型号。Linux 对无线网卡的兼容性由芯片决定。

芯片方案对比

芯片频段理论速率Linux 驱动AP 模式价格
RTL8188EU2.4GHz150Mbps内核自带¥20-30
RTL8821CU / RTL8811CU2.4+5GHz150+433Mbps内核 6.14+ 自带¥25-40
RTL8812AU2.4+5GHz300+867Mbps第三方驱动¥60-100
AR92712.4GHz150Mbps主线内核,驱动+固件全开源¥30-50
MT7921au2.4+5GHz WiFi 6574+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 dnsmasq

2. 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=nl80211Linux 标准无线驱动接口
hw_mode=g2.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
EOF

port=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 DROP

DNS 劫持

强制下游 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.conf

dnsmasq 启动失败

常见原因:

错误原因解决
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 -D

macOS 的限制:

  • 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 内核 = 完整软件路由器,比硬件路由更灵活,比软路由更低成本。