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 / 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=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 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=0unknown 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 内核 = 完整软件路由器,比硬件路由更灵活,比软路由更低成本。
歡迎留言回复交流。
Log in to reply.