🔥 BRAVE 質押池已上線 — 在錢包搜尋 BRAVE 即可委託

USB 无线网卡 + Linux:把笔记本电脑改造成 WiFi 路由器

    • #34033

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

  • 抱歉,回覆主題必需先登入。