# 方案 A 完整复盘:OpenWrt 树莓派「WiFi 当 WAN + eth0 当 LAN」
这是一份从你零基础到跑通的全过程记录,包含拓扑、配置步骤、踩坑与修复。
一、方案 A 是什么
```text
WiFi (WAN)
家里主路由\] ←────────────────── \[树莓派 OpenWrt
2.4G SSID │
eth0 (LAN)
│
你的 PC
```
| 角色 | 接口 | 作用 |
|------|------|------|
| **WAN** | `phy0-sta0`(WiFi 客户端) | 连家里路由器,Pi 从这里上网 |
| **LAN** | `eth0` → `br-lan` | 网线直连 PC,PC 经 Pi 出网 |
**为什么不需要 USB 网卡?**
教程里加 USB 网口,是因为默认假设 **eth0 = LAN、第二个口 = WAN**。你只有一根网线时,eth0 接 PC 是**正确用法**;缺的只是 **第二条上行**,用 **WiFi 补上** 即可。
**为什么选 OpenWrt?**
Pi 当网关时,能统计整网 DNS、连接数、端口流量------这是后面做「网络心跳 SPI 屏」的基础。
二、硬件与物理连接
```text
PC 以太网口\] ←------网线------→ \[树莓派 eth0
树莓派 WiFi\] ←------无线------→ \[家里 2.4G WiFi
```
注意:
-
树莓派 4B **WiFi 只有 2.4GHz**,必须连 **2.4G SSID**,不能连 5G。
-
PC 与 Pi 之间 **不要** 开 Windows「Internet 连接共享 (ICS)」。
-
配置阶段建议 **关掉 PC 的 WiFi**,避免 PC 绕过 Pi 直接上网。
三、完整配置流程
阶段 0:PC 网络(最初用 192.168.1 网段)
| 项 | 值 |
|----|-----|
| IP | `192.168.1.100` |
| 掩码 | `255.255.255.0` |
| 网关 | `192.168.1.1` |
| DNS | `192.168.1.1` |
SSH 目标是 **Pi**,不是 PC 自己:
```bash
ssh root@192.168.1.1 # 对
ssh root@192.168.1.10 # 错(若 .10 是 PC 自己的 IP)
```
阶段 1:确认 LAN(eth0 / br-lan)
目标:eth0 在桥里,LAN 地址固定为 Pi 网关。
```bash
uci show network.lan
uci show network | grep -E 'br-lan|eth0'
ip addr show dev br-lan
brctl show
```
**你的正确结果:**
```text
network.lan.device='br-lan'
network.lan.ipaddr='192.168.1.1/24'
network.@device0.ports='eth0'
br-lan 下有 eth0,IP 为 192.168.1.1
```
结论:**LAN 配置正确,eth0 没有被 PC「占用坏」,而是正常充当 LAN 口。**
阶段 2:配置 WiFi 当 WAN
2.1 无线客户端(STA)
```bash
uci set wireless.radio0.country='CN'
uci set wireless.radio0.disabled='0'
uci set wireless.default_radio0.disabled='1' # 关掉默认 AP
uci set wireless.sta=wifi-iface
uci set wireless.sta.device='radio0'
uci set wireless.sta.mode='sta'
uci set wireless.sta.network='wan'
uci set wireless.sta.ssid='你的2.4G_WiFi名'
uci set wireless.sta.encryption='psk2'
uci set wireless.sta.key='你的WiFi密码'
uci commit wireless
```
2.2 WAN 接口
```bash
uci set network.wan=interface
uci set network.wan.proto='dhcp'
uci set network.wan.device='phy0-sta0' # 不是 wlan0!
uci commit network
wifi down
wifi up
/etc/init.d/network restart
```
2.3 验证 WAN
```bash
ip addr show dev phy0-sta0
ping -c 3 223.5.5.5
```
**成功标志:** `phy0-sta0` 有 IP(如 `192.168.1.113`),且能 ping 通 `223.5.5.5`。
阶段 3:防火墙 + PC 出网
```bash
uci set firewall.@zone1.masq='1'
uci set firewall.@zone1.mtu_fix='1'
uci commit firewall
/etc/init.d/firewall restart
```
确认存在 `lan → wan` 转发(一般默认就有)。
PC 上网测试:
```powershell
ping 192.168.1.1
ping 223.5.5.5
ping baidu.com
```
**你当时三条都通 → 方案 A 从 PC 视角已跑通。**
阶段 4:修复 Pi 本机 DNS + 网段冲突(后续完善)
4.1 Pi 不能 ping `baidu.com`
```text
ping 223.5.5.5 → 通(IP 路由 OK)
ping baidu.com → bad address(DNS 解析失败)
```
**原因:** Pi 本机查域名走 `/etc/resolv.conf` → dnsmasq,上游 DNS 未配好;PC 能 ping 域名,是因为 PC 用的 DNS 路径和 Pi 本机不同。
**修复:**
```bash
uci set network.wan.peerdns='0'
uci delete network.wan.dns
uci add_list network.wan.dns='223.5.5.5'
uci add_list network.wan.dns='114.114.114.114'
uci commit network
uci set dhcp.@dnsmasq0.noresolv='0'
uci add_list dhcp.@dnsmasq0.server='223.5.5.5'
uci add_list dhcp.@dnsmasq0.server='114.114.114.114'
uci commit dhcp
/etc/init.d/network restart
/etc/init.d/dnsmasq restart
```
4.2 `udhcpc: no lease, failing`
WiFi 已连接,但重启网络后 WAN 拿不到 DHCP。
**根因:LAN 与 WAN 同网段冲突**
```text
br-lan (eth0) → 192.168.1.1/24
phy0-sta0 (WiFi) → 也要 192.168.1.0/24
主路由网关 → 通常也是 192.168.1.1
```
Pi 自己占着 `192.168.1.1`,WAN 又要向 `192.168.1.1` 要 DHCP,内核路由混乱,`udhcpc` 就容易失败。
**修复:把 LAN 改到独立网段**
| 接口 | 改后网段 |
|------|----------|
| LAN (`br-lan`) | `192.168.50.1/24` |
| WAN (`phy0-sta0`) | 保持 `192.168.1.x`(主路由网段) |
| PC | `192.168.50.100`,网关 `192.168.50.1` |
```bash
uci set network.lan.ipaddr='192.168.50.1/24'
uci commit network
/etc/init.d/network restart
```
改完后 PC 与 Pi 都用 **50 网段** 通信,WAN 在 **1 网段** 向主路由要 IP,不再打架。
四、问题与解决对照表
| # | 现象 | 原因 | 解决 |
|---|------|------|------|
| 1 | SSH 连不上 `192.168.1.10` | `.10` 是 PC 自己的 IP,不是 Pi | SSH 目标改为 `192.168.1.1`(后改为 `192.168.50.1`) |
| 2 | 以为 eth0 被占用,必须 USB 网卡 | 误解教程拓扑 | eth0 = LAN 接 PC 正确;WAN 用 WiFi 即可 |
| 3 | 命令报错 `grep: show: No such file` | 多条命令粘在一行 | 每次只粘贴一行执行 |
| 4 | `ip: can't find device 'wlan0'` | OpenWrt 在 Pi 上无线口名是 `phy0-sta0` | `uci set network.wan.device='phy0-sta0'` |
| 5 | `NO-CARRIER` / `Failed to initiate sched scan` | 国家码、默认 AP、可能连了 5G | 设 `country=CN`、关 AP、连 **2.4G** SSID |
| 6 | 误加 `wireless.sta.sskey` | 字段名错误,应为 `key` | `uci delete wireless.sta.sskey`,用 `key` |
| 7 | `wifi downwifi down` 报错 | 又是命令粘在一起 | `wifi down` 与 `wifi up` 分开执行 |
| 8 | PC 全通,Pi 不能 ping `baidu.com` | Pi 本机 DNS 未配置 | 给 WAN/dnsmasq 配上游 DNS |
| 9 | `udhcpc: no lease, failing` | LAN/WAN 同网段 + 网关 IP 冲突 | LAN 改 `192.168.50.0/24` |
五、最终稳定拓扑
```text
主路由 192.168.1.1
↑ WiFi 2.4G
phy0-sta0 (WAN, DHCP 192.168.1.x)
│
OpenWrt Pi
br-lan 192.168.50.1 (LAN)
│
eth0
│
PC 192.168.50.100
```
**数据流:**
```text
PC → 192.168.50.1 (Pi) → NAT → phy0-sta0 → 主路由 → 互联网
```
六、常用维护命令
```bash
看接口
ip -br addr
brctl show
看 WAN 是否拿到 IP
ip addr show dev phy0-sta0
测 Pi 出网
ping -c 2 223.5.5.5
ping -c 2 baidu.com
无线重连
wifi reload
ifup wan
看日志
logread | tail -30
```
七、经验小结
-
**单网口 Pi 不是 eth0 坏了**,而是 WAN/LAN 要分到 **WiFi + eth0** 两个口上。
-
**接口名以 `ip link` 为准**,Pi 上常见 `phy0-sta0`,不是 `wlan0`。
-
**`ping IP` 通 ≠ DNS 通**;PC 能上网不代表 Pi 本机 DNS 已配好。
-
**LAN 与 WAN 不要用同一网段**;Pi LAN 尽量别和主路由网关同 IP(都用 `192.168.1.1` 会出各种怪问题)。
-
SSH 里 **一行一回车**,避免命令粘在一起。
八、下一步(你原本的目标)
网络底座已就绪,可以继续:
-
**SPI ST7735 屏**:接 GPIO,在 OpenWrt 上读 `phy0-sta0` / `br-lan` 流量、dnsmasq 统计做「心跳显示」。
-
**Docker 靶机 / DNS 隧道实验**:建议放在 **PC 或 NAS** 上;OpenWrt 继续当网关更合适。
如果你愿意,下一步可以从 **ST7735 接线 + OpenWrt 点亮第一帧** 开始,我可以按你的 1.44 寸屏逐步写命令。