发布于 

路由器刷机教程

⚠️ 风险提示

  • 刷机会清空全部数据,操作前完整备份(照片、通讯录、微信记录、OTP/Authenticator 密钥)
  • 解锁 Bootloader 通常失去保修,部分机型永久熔断保险丝(三星 Knox 0x1、小米部分机型)
  • 操作不当可能变砖,文末提供救砖思路,但不保证一定能救回
  • 电量 ≥ 60%、用原装数据线、台式机插机箱后置 USB 口
  • 本文仅用于技术学习与自有设备研究,请遵守当地法律法规

📌 针对路由器的补充风险:

  • 路由器没有电池,刷机时绝对不能断电——建议接 UPS 或确保不会碰掉电源线
  • 路由器通常是家庭网络的唯一出口,刷砖 = 全家断网。建议先备一台能用的旧路由器,或确认手机流量够用
  • 部分路由器有运营商远程管理(TR-069),刷机可能被运营商检测到,导致宽带账号异常
  • 刷机前务必备份原厂固件的整片 Flash(含 ART/EEPROM 无线校准数据),丢了无线信号会严重劣化

适用机型

路由器刷机的可行性与 SoC 方案强相关。先按芯片分类:

芯片系列 代表型号 常见设备 OpenWrt 支持 可玩性
MediaTek / Ralink MT7620 / MT7621 / MT7628 / MT7981 / MT7986 小米路由、newifi、斐讯、极路由、华硕部分 ⭐⭐⭐⭐⭐ 最好刷
Qualcomm Atheros AR9344 / QCA9531 / QCA9563 / IPQ4019 / IPQ8074 TP-Link、网件、小米、领势 ⭐⭐⭐⭐ 很好
Broadcom BCM4708 / BCM4709 / BCM4908 / BCM63xx 华硕中高端、网件、部分光猫 ⭐⭐ 闭源驱动,无线性能差
Realtek RTL8197F / RTL8186 低端路由、部分光猫
全志 / 瑞芯微 部分软路由/Nas ⭐⭐⭐ 视型号
x86 软路由(工控机、迷你主机) ⭐⭐⭐⭐⭐ 最自由

⚠️ Broadcom 特别注意:Broadcom 的无线驱动是闭源的二进制 blob,OpenWrt 只能用逆向出来的开源驱动,无线性能通常只有原厂的 30~60%,部分机型 5G 完全不可用。刷 Broadcom 路由器前先想清楚:你是否愿意牺牲无线性能换功能。

常见可刷机型举例

设备 芯片 Flash RAM 推荐固件 备注
小米路由器 3G MT7621 128MB NAND 256MB OpenWrt / Padavan 经典可刷机型
小米路由器 4A 千兆版 MT7621 16MB NOR 128MB OpenWrt / Padavan 便宜好刷
小米路由器 AC2100 MT7621 128MB NAND 128MB OpenWrt / Padavan
newifi D2(新路由3) MT7621 32MB NOR 256MB OpenWrt / Padavan 可玩性高
斐讯 K2 / K2P MT7620 / MT7621 8/16MB 64/128MB Padavan / 高恪 K2P 经典
极路由 3 / 4 MT7620 / MT7621 16/128MB 128/256MB OpenWrt / 老毛子
TP-Link WR841N(各版本) AR9341 / QCA9533 4~8MB 32MB OpenWrt 注意版本,V 版本不同芯片不同
网件 R6220 / R6350 MT7621 128MB 128MB OpenWrt
华硕 RT-ACRH17 IPQ4019 128MB 256MB OpenWrt
华硕 RT-AX88U BCM4908 256MB 1GB Asuswrt-Merlin Broadcom,不推荐刷 OpenWrt

📌 同一型号不同硬件版本(V1/V2/V3)可能用完全不同的芯片。TP-Link 尤其如此(WR841N 有十几个版本,芯片横跨 Atheros 和 Realtek)。必须拆机看芯片丝印,或者查 硬件版本 贴纸,不能只看型号。

准备工作

为什么刷路由器

动机 说明
官方固件有后门/漏洞 历史上多次曝光厂商留后门(部分厂商固件有硬编码口令、云端命令执行、未授权升级接口)
功能受限 官方固件不支持:广告过滤、自定义 DNS、科学上网、VLAN、多拨、IPv6 精细控制、WireGuard
停止更新 老设备官方停更,安全漏洞永久存在
跑 OpenWrt 做软路由/旁路由 广告过滤(AdGuard Home)、智能家居网关、流量监控、Docker(x86 平台)
做网络研究 抓包、镜像流量、VLAN 隔离 IoT 设备、蜜罐
性能榨取 老设备刷精简固件后可能更流畅

⚠️ 反过来的理由(什么时候不该刷)

  • 这是家里唯一的路由器,且你没有备用机 → 先买个便宜的备用
  • 设备是运营商光猫+路由一体机,且你没有宽带账号密码/LOID → 刷砖后无法恢复上网
  • 你很在意无线性能,且设备是 Broadcom 平台 → 刷 OpenWrt 后无线可能变弱
  • 设备还在保修期内且价值较高

刷机前必查清单

在拆机或动手之前,必须确认以下硬件参数。搞错任何一个都可能变砖。

参数 如何确认 为什么重要
CPU/SoC 型号 拆机看芯片丝印(如 MT7621AT);或系统内 cat /proc/cpuinfo 固件必须匹配 SoC,刷错必砖
Flash 容量 拆机看芯片丝印(如 25Q128 = 16MB);或 cat /proc/mtd 固件超过 Flash 容量 → 刷不进去或覆盖关键分区
Flash 类型 NOR(8/16MB 常见)vs NAND(128MB+) NOR 和 NAND 的固件格式、坏块管理完全不同,绝对不能混刷
RAM 容量 拆机看芯片;或 free -m 某些功能(如 AdGuard Home)需要足够 RAM
是否有 USB 口 目测 决定能否做 overlay 扩容、挂硬盘、接 4G 网卡
是否支持 Breed 查 Breed 官方支持列表 决定你有没有"不死"保险
# 如果能拿到 shell(telnet/SSH),先收集信息
cat /proc/cpuinfo
# system type             : MediaTek MT7621 SoC
# ...

cat /proc/meminfo | head -3
# MemTotal:         253940 kB

cat /proc/mtd
# dev:    size   erasesize  name
# mtd0: 00030000 00010000 "u-boot"
# mtd1: 00010000 00010000 "u-boot-env"
# mtd2: 00010000 00010000 "factory"
# mtd3: 00010000 00010000 "factory_bak"
# mtd4: 01f80000 00010000 "firmware"

ls /dev/mtd*
df -h
# 看 overlay 可用空间

# 关键:备份无线校准数据
cat /proc/mtd | grep -i -E "factory|art|eeprom|radio"

⚠️ 警告factory / art / EEPROM 分区存有无线射频校准数据,是每个设备唯一的。它通常位于 Flash 的 0x40000 偏移(不同机型可能不同)。这个分区丢了,无线信号会严重劣化甚至完全失效,且几乎无法恢复(除非售后或找到同型号同批次的校准数据——这也不合法)。刷机第一件事:备份整个 Flash。

工具清单

工具 用途 价格/获取
CH341A 编程器 + SOP8/SOP16 夹子 SPI Flash 读写、救砖 20~50 元,必备
USB-TTL 串口模块(CH340/CP2102/FT232) 串口调试、拿 root shell 5~20 元,必备
flashrom Linux 下读写 SPI Flash 开源,apt install flashrom
PuTTY / minicom / screen 串口终端 免费
binwalk 固件解包分析 pip install binwalk
tftpd64 / atftpd TFTP 服务器(救砖用) 免费
Breed / pb-boot 不死 bootloader 见下文
网线(不要只依赖 WiFi 刷机全程用有线
电烙铁、焊锡、杜邦线、排针 焊接串口排针
万用表 找 VCC/GND、测电压

环境准备

# Linux(推荐做路由器折腾的系统)
sudo apt update
sudo apt install flashrom binwalk minicom tftpd-hpa tftp-hpa \
                 u-boot-tools mtd-utils squashfs-tools

# 验证编程器识别
flashrom -p ch341a_spi
# 预期输出:
# flashrom v1.2 on Linux 5.15.0 (x86_64)
# Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on ch341a_spi.
# Windows 下检查 CH341A 驱动
Get-PnpDevice -PresentOnly | Where-Object { $_.FriendlyName -match "CH34" }
# 若显示感叹号,需安装 CH341A 驱动

# 串口 COM 口确认
Get-WmiObject Win32_SerialPort | Select-Object Name, DeviceID
# USB-SERIAL CH340 (COM4)

一、Breed 不死 Bootloader(最关键)

Breed 是整个路由器刷机领域最重要的东西。 有了它,你基本可以随便刷——刷坏了进 Breed 重刷即可。

1.1 什么是 Breed

项目 说明
本质 一段第三方 bootloader,替换(或部分替换)原厂 U-Boot
作者 hackpascal(国内开发者)
核心能力 Web 恢复模式——即使固件完全损坏,也能通过网页重刷
类比 相当于手机的"可进入的 fastboot + 内置救砖通道"
代价 覆盖原厂 bootloader → 失去官方保修;刷错版本会变砖

Breed 提供的能力:

功能 说明
Web 恢复控制台 断电按住 Reset 上电,访问 192.168.1.1 进入
固件刷写 网页直刷固件(支持 bin/trx 等格式)
环境变量编辑 修改启动参数、bootcmd
Bootloader 备份/恢复 可以在 Breed 里备份整个 Flash
内存/Flash 测试 硬件诊断
固件备份 网页直接下载整片 Flash 内容
时钟频率调整 超频/降频(有风险)
恢复出厂 清除 nvram

1.2 支持的芯片

Breed 主要针对 MediaTek / Ralink 平台:

芯片 支持 常见设备
MT7620 斐讯 K2、极路由 3、小米 mini
MT7621 小米 3G、newifi D2、K2P、AC2100
MT7628 小米 4、部分低端路由
MT7688 IoT 模块
MT7981 / MT7986(WiFi 6) ⚠️ 有限 较新,Breed 支持不明确
RT3052 / RT3352 / RT5350 很老的设备
RT3883 / RT3662 老设备
AR9344 / QCA953x(Atheros) 不支持 U-Boot 修改版pb-boot
IPQ4019 / IPQ8074(Qualcomm) ❌ 不支持 部分机型可刷 U-Boot 修改版
BCM 系列 ❌ 不支持 用 CFE 或官方恢复

📌 Atheros / Qualcomm 平台的替代品

  • pb-boot(主要给 Atheros AR/QCA 平台,部分 MT7620 也支持)
  • 各机型社区修改版 U-Boot
  • 部分博通设备用 CFE(Common Firmware Environment),有 CFE web server 恢复模式

Breed 的官方支持列表会随版本更新,请以作者发布页为准。

1.3 刷入 Breed 的方式

方式一:利用官方 Web 升级漏洞(最简单)

很多官方固件的 Web 升级接口不校验固件签名,可以直接把 Breed 当作"固件"上传。

1. 下载对应机型的 Breed bin(如 breed-mt7621-xiaomi-r3g.bin)
2. 登录路由器 Web 后台
3. 找到 系统设置 → 手动升级 / 固件升级
4. 选择 Breed bin 文件,点升级
5. 等待 1~2 分钟(不要断电!)
6. 路由器会重启进入 Breed

⚠️ 警告Breed 文件名必须与机型严格对应。文件名通常包含芯片和机型,如 breed-mt7621-newifi-d2.bin刷错机型的 Breed = 变砖,需要用编程器救。

方式二:先拿 shell 再手刷(通用)

适用于官方 Web 升级有签名校验的情况。

先通过漏洞/后门/telnet 拿到 shell(见后文"从安全视角看"一节),然后:

# 1. 下载 Breed 到 /tmp(内存盘)
cd /tmp
wget http://192.168.1.100/breed-mt7621-xxx.bin
# 或用 tftp
tftp -g -r breed-mt7621-xxx.bin 192.168.1.100

# 2. 校验 md5(务必做)
md5sum breed-mt7621-xxx.bin

# 3. 确认 bootloader 分区
cat /proc/mtd
# mtd0: 00030000 00010000 "u-boot"    ← 这就是目标

# 4. 备份原厂 bootloader(重要!)
dd if=/dev/mtd0 of=/tmp/uboot_orig.bin
# 通过 tftp/http 传出来,或用 cat 看

# 5. 刷入 Breed
mtd write /tmp/breed-mt7621-xxx.bin /dev/mtd0
# 或
mtd -r write /tmp/breed-mt7621-xxx.bin u-boot

# 6. 重启
reboot
# 更稳妥的做法:先解锁 mtd(部分固件 mtd 是只读的)
# 某些固件需要:
mtd unlock /dev/mtd0
mtd write /tmp/breed.bin /dev/mtd0

方式三:编程器刷入(万能,但要拆机)

# 拆机,用 CH341A 夹子夹住 SPI Flash 芯片
# 1. 先备份整片
flashrom -p ch341a_spi -r full_backup.bin

# 2. 只写 bootloader 区域(开头 192KB,即 0x0 ~ 0x30000)
flashrom -p ch341a_spi -w breed.bin
# 注意:breed.bin 必须是完整的整片镜像,不能只是 breed 本身
# 通常做法是拼接:breed(0x0~0x30000) + 原镜像剩余部分
# 拼接方法
# 备份原片 full_backup.bin(16MB)
# breed.bin 通常是 192KB(0x30000)
dd if=breed.bin of=new_flash.bin bs=1 count=196608
dd if=full_backup.bin of=new_flash.bin bs=1 skip=196608 seek=196608
# 现在 new_flash.bin = breed + 原厂其余部分

flashrom -p ch341a_spi -w new_flash.bin

⚠️ 警告编程器刷入时,CH341A 输出的是 3.3V 还是 5V 必须确认。CH341A 编程器有个跳线或开关选择 3.3V/5V,多数 SPI Flash 是 3.3V,用 5V 会烧芯片。老版本 CH341A 默认 5V,需要改跳线。

1.4 Breed Web 恢复模式(救命操作)

这是 Breed 最重要的功能,务必记住:

进入 Breed Web 恢复模式:
1. 路由器断电(拔掉电源)
2. 按住 Reset 键不放
3. 插上电源(保持按住 Reset)
4. 等待 5~10 秒(看到所有灯闪烁,或某个灯长亮)
5. 松开 Reset
6. 电脑用网线接到路由器 LAN 口
7. 电脑设置静态 IP:192.168.1.2,子网掩码 255.255.255.0
8. 浏览器访问 http://192.168.1.1
9. 出现 Breed Web 恢复控制台
# Windows 设置静态 IP
netsh interface ip set address "以太网" static 192.168.1.2 255.255.255.0

# 验证连通
ping 192.168.1.1
# Linux
sudo ip addr add 192.168.1.2/24 dev eth0
ping 192.168.1.1

# 恢复 DHCP
sudo ip addr del 192.168.1.2/24 dev eth0

Breed Web 界面功能:

菜单 用途
固件更新 刷入新固件(选 固件 分区,不是 Bootloader!)
固件备份 下载整片 Flash 或指定分区
Bootloader 更新 ⚠️ 更新 Breed 本身(高风险,不要乱点
环境变量编辑 修改 Breed 配置
恢复出厂设置 清除 nvram/配置
内存测试 / Flash 测试 硬件诊断
重启 重启设备

⚠️ 警告在 Breed 里刷固件时,务必确认刷的是「固件」区域而不是「Bootloader」区域。如果把固件刷进 Bootloader 区,会把 Breed 自己覆盖掉——那就真的砖了,只能上编程器。Breed 的界面会明确标注区域,仔细看再点

1.5 Breed 环境变量常用操作

# 在 Breed Web 控制台 → 环境变量编辑 中,或在串口下:

# 查看所有环境变量
printenv

# 常见变量
bootcmd          # 启动命令
ipaddr           # Breed 自身 IP(默认 192.168.1.1)
serverip         # TFTP 服务器 IP
autoboot_command # 自动启动命令
baudrate         # 串口波特率

# 修改 TFTP 服务器 IP(用于 tftp 刷机)
setenv serverip 192.168.1.100

# 保存
saveenv

二、固件类型对照表

固件 基于 适用芯片 特点 适合
官方原厂 厂商定制 全平台 无线性能最好、稳定性官方保障、功能受限、可能有后门 追求无线性能与省心
OpenWrt 上游开源 MT76xx / Atheros / IPQ / x86 最主流,包管理完善(opkg)、社区巨大、文档全 首选,功能与生态平衡
LEDE OpenWrt 分支(已合并回 OpenWrt) 同 OpenWrt 2016~2018 年的分支,已停止维护,老教程里常见 ❌ 不要再用了
Padavan(老毛子) 华硕 RT-N56U 固件衍生 MT7620 / MT7621 界面友好、功能丰富(多拨、SS、广告过滤)、中文支持好、性能调优好 国内 MT762x 用户首选
PandoraBox OpenWrt 衍生(国内) MT76xx / Atheros 国内团队维护,中文界面,插件预装 想要 OpenWrt 但懒得配置
高恪 闭源商业固件(有免费版) MT762x / 部分 Atheros 流控(QoS)强、企业级功能、闭源 多人共享带宽、做流控
集客 闭源 多平台 AP 管理、无线漫游、AC 控制器 做无线覆盖、多 AP 组网
Asuswrt-Merlin 华硕官方固件增强 Broadcom(华硕机型) 保留原厂无线驱动 + 增强功能 华硕路由器首选(不刷 OpenWrt)
DD-WRT 老牌开源 多平台(近年支持下降) 历史悠久,更新缓慢,新设备支持差 老设备救活
Tomato 老牌开源(含 FreshTomato) Broadcom 老机型 轻量、界面简洁 老博通设备
iKuai / 爱快 闭源商业 x86 流控、多拨、行为管理强 x86 软路由主路由
LEDE x86 / OpenWrt x86 OpenWrt x86 软路由首选 x86 软路由
RouterOS (MikroTik) 闭源 MikroTik 硬件 / x86 企业级功能,学习曲线陡 网络工程师

选择决策树

你的设备是什么芯片?
├── MT7620 / MT7621 / MT7628
│   ├── 想要功能全 + 界面友好 + 中文    → Padavan(老毛子)
│   ├── 想要生态 + 可玩性 + 长期维护    → OpenWrt
│   └── 想要闭源省事 + 流控            → PandoraBox / 高恪
├── Atheros AR/QCA / IPQ
│   └── OpenWrt(唯一主流选择)
├── Broadcom(华硕/网件)
│   ├── 华硕机型                        → Asuswrt-Merlin(保留无线性能)
│   └── 其他                            → 谨慎,OpenWrt 无线性能差
└── x86
    ├── 做主路由                        → OpenWrt / iKuai
    └── 做旁路由(网关/广告过滤)        → OpenWrt

⚠️ 重要LEDE 项目已于 2018 年重新合并回 OpenWrt。现在还在下载"LEDE 固件"的基本都是多年未更新的老包,有已知安全漏洞。请使用 OpenWrt 官方最新版openwrt.org)。

固件格式对照

格式 说明 用法
*.bin 通用固件镜像 Web 升级 / Breed / 编程器
*-squashfs-sysupgrade.bin OpenWrt 升级包(含文件系统) 系统内 sysupgrade 或 Breed 刷入
*-squashfs-factory.bin OpenWrt 从原厂首次刷入用 原厂 Web 升级 / Breed
*-initramfs-kernel.bin 内存运行版(不写 Flash) 测试用,重启丢失
*.trx 博通/asus 格式 博通设备
*.chk Netgear 格式 网件设备
*.img 通用 / x86 视平台

⚠️ 警告factorysysupgrade 不要搞混

  • 首次从原厂刷 OpenWrt → 用 factory
  • 已经在 OpenWrt 上升级 → 用 sysupgrade
  • 用错可能刷不进去(有校验)或配置丢失

三、刷机路径(由易到难)

3.1 路径对比

路径 难度 前置条件 救砖能力 适用
① Web 后台升级 原厂固件可访问 首次刷 OpenWrt/Padavan
② TFTP 救砖 ⭐⭐ 设备有 tftp 恢复功能 Web 刷挂了
③ 刷 Breed / pb-boot ⭐⭐⭐ 已能刷固件 刷机前必做
④ UART 串口 + U-Boot ⭐⭐⭐⭐ 会焊接、有串口模块 无 Web 恢复时
⑤ 编程器刷机 ⭐⭐⭐⭐⭐ 拆机、CH341A 万能 真砖最后手段

强烈建议的顺序:

1. 先确认机型、芯片、Flash
2. 【可选但强烈推荐】刷入 Breed
3. 通过 Breed 刷入目标固件
4. 玩坏了用 Breed Web 恢复重刷
5. 极端情况用编程器

⚠️ 警告先刷 Breed 再刷固件,这是路由器刷机的黄金法则。没有 Breed 就刷第三方固件 = 裸奔,一旦刷坏只能拆机上编程器。

3.2 路径①:Web 后台升级

1. 电脑用网线接路由器 LAN 口(不要用 WiFi 刷机!)
2. 浏览器访问 192.168.1.1(或 192.168.31.1 / 192.168.0.1 / tplogin.cn 等)
3. 登录管理后台
4. 找到 系统设置 / 高级设置 → 固件升级 / 手动升级
5. 选择固件文件(factory.bin 或 Breed bin)
6. 点击升级,等待 3~5 分钟
7. 期间绝对不要断电、不要刷新页面
8. 路由器自动重启

部分机型的固件名 trick:

某些厂商固件会校验文件名或文件头。常见绕过方式:

情况 处理
校验文件名后缀 xxx.bin 改名为厂商期望的名字,如 miwifi_r3g_firmware_xxx.bin
校验文件头 magic 需要用该机型的打包工具重新打包(各机型不同,查社区)
校验固件签名 无法绕过 → 走 Breed 或 shell 路径
TP-Link 部分机型 固件名不能太长,且可能要求去掉文件头(用 dd 剥掉前 512 字节)
# TP-Link 常见处理:去掉文件头
dd if=openwrt-ar71xx-tl-wr841n-v8-squashfs-factory.bin \
   of=wr841nv8_tp_recovery.bin bs=512 skip=1
# 然后用 wr841nv8_tp_recovery.bin 升级

3.3 路径②:TFTP 救砖

很多路由器(尤其 TP-Link)内置 TFTP 恢复:按住 Reset 上电,设备会从 TFTP 服务器拉取固件。

1. 电脑设置静态 IP(通常是 192.168.0.66 或 192.168.1.66,因机型而异)
   TP-Link 经典值:192.168.0.66
2. 电脑上运行 TFTP 服务器(tftpd64 / atftpd)
3. 把固件放到 TFTP 根目录,并重命名为设备期望的文件名
   TP-Link WR841N: wr841nv8_tp_recovery.bin
   具体文件名查机型资料(有些是 0200A8C0.img)
4. 路由器断电 → 按住 Reset → 上电 → 保持 10~15 秒
5. 设备自动从 TFTP 拉取固件并刷入
6. 观察 TFTP 服务器日志,看到传输即成功
# Linux 搭建 tftp 服务器
sudo apt install tftpd-hpa
sudo mkdir -p /srv/tftp
sudo cp wr841nv8_tp_recovery.bin /srv/tftp/
sudo chmod 666 /srv/tftp/*
sudo systemctl start tftpd-hpa

# 设置静态 IP
sudo ip addr add 192.168.0.66/24 dev eth0

# 监控日志
sudo tail -f /var/log/syslog | grep tftp
# Windows:下载 tftpd64
# 1. 运行 tftpd64.exe
# 2. Current Directory 选择固件所在目录
# 3. Server interfaces 选择 192.168.0.66 对应的网卡
# 4. 观察 Tftp Server 标签页的日志

📌 TFTP 恢复的文件名和 IP 是厂商写死在 bootloader 里的,不同机型完全不同。必须查对应机型的资料,猜是猜不出来的。常用查询关键词:机型 + tftp recovery + filename

3.4 路径③:编程器刷机(真砖救星)

当设备完全无反应、串口无输出、Web 进不去时,编程器是最后的手段

硬件准备:

物品 说明
CH341A 编程器 20~30 元,淘宝常见
SOP8 测试夹(8 脚 Flash) 免拆焊,直接夹住芯片
SOP16 夹子(16 脚 NAND) 大容量 Flash
SOP8 转 DIP8 烧录座 需要拆焊芯片

⚠️ 警告

  • CH341A 电压跳线:务必设为 3.3V(老版本默认 5V,会烧毁 3.3V 的 SPI Flash)
  • 夹子接触必须良好,接触不良会导致读写出错。建议读写各做 2~3 次并比对
  • 务必先断电再夹夹子
  • 夹子方向:芯片上有个圆点(1 脚标记),夹子上的红线对应 1 脚

完整流程:

# 1. 识别芯片
flashrom -p ch341a_spi
# Found Winbond flash chip "W25Q128.V" (16384 kB, SPI) on ch341a_spi.

# 2. 【必做】整片备份(多读几次确保一致)
flashrom -p ch341a_spi -r backup1.bin
flashrom -p ch341a_spi -r backup2.bin
md5sum backup1.bin backup2.bin
# 两个 md5 必须相同!不同说明接触不良,重新夹

# 3. 校验读取完整性
flashrom -p ch341a_spi -v backup1.bin
# Verifying flash... VERIFIED.

# 4. 提取关键分区(从备份里)
# 查看分区布局(用 binwalk)
binwalk backup1.bin
# DECIMAL       HEXADECIMAL     DESCRIPTION
# 0             0x0             u-boot image
# 196608        0x30000         uImage header
# 262144        0x40000         Squashfs filesystem
# ...

# 5. 备份无线校准分区(通常在 0x40000,64KB)
#    具体偏移以机型为准,务必先 binwalk 确认
dd if=backup1.bin of=factory_calibration.bin bs=1 skip=262144 count=65536
# 注意:这个偏移是示例!不同机型可能完全不同

# 6. 写入新固件(整片写入)
flashrom -p ch341a_spi -w new_firmware_full.bin
# 预期输出:
# Erasing and writing flash chip... Erase/write done.
# Verifying flash... VERIFIED.

# 7. 若只想写固件区(保留 bootloader 和 factory)
# 需要拼接,见 1.3 方式三

Windows 下的替代工具:

工具 说明
NeoProgrammer 开源,支持 CH341A,界面友好
AsProgrammer 开源,支持多种编程器
CH341A Programmer(官方) 原厂工具,功能简单
flashrom(Windows 版) 需装驱动

📌 只写固件区而不是整片:如果你只想换固件、保留原厂 bootloader 和无线校准分区,最稳的做法是用编程器读出整片 → 在本地拼接新固件 → 整片写回。这样绝对不会动到 calibration 数据。

# 拼接示例(假设:u-boot 0~0x30000,factory 0x40000~0x50000,firmware 0x50000~末尾)
cp backup1.bin new_full.bin
dd if=openwrt-factory.bin of=new_full.bin bs=1 seek=327680 conv=notrunc
# seek=327680 = 0x50000

flashrom -p ch341a_spi -w new_full.bin

四、从安全视角看(重点)

作为安全工程师,路由器固件研究是最有料的领域之一。 本节介绍如何从一个路由器里拿到 shell、提取固件、分析后门。

⚠️ 警告:本节内容仅用于自有设备的安全研究与学习。未经授权对他人设备进行测试是违法行为。

4.1 UART 串口拿 root shell

原理:几乎所有路由器主板上都留有 UART(通用异步收发器)调试串口,厂商用于生产调试。它直接连到 SoC 的串口控制器,通常提供一个无需认证的 root shell

4.1.1 找到串口引脚

主板上通常有 4 个孔/焊盘,排成一排(有时是 3 个,无 VCC),旁边可能标有 VCC GND TX RXJ1 / JP1 / CON1

典型 4 针布局(俯视):
┌─────────┐
│ ○  VCC │  ← 3.3V(有些是 5V,务必测!)
│ ○  RX  │  ← 接收(接模块的 TX)
│ ○  TX  │  ← 发送(接模块的 RX)
│ ○  GND │  ← 地
└─────────┘

用万用表确认:

引脚 测量方法 正常值
GND 通断档,对金属屏蔽罩(接地)应导通 蜂鸣
VCC 电压档,对 GND 3.3V(少数 5V)
TX 电压档,对 GND 空闲时约 3.3V(上拉)
RX 电压档,对 GND 接近 0V 或 3.3V,波动

⚠️ 警告不确定 VCC 电压就不要接。接 5V 到 3.3V 的 SoC 串口会烧毁芯片。用万用表量清楚,或者只接 GND/TX/RX 三根线,不接 VCC(这是最安全的做法)。

4.1.2 接线

路由器 USB-TTL 模块
GND GND
TX RXD
RX TXD
VCC 不接(更安全)

📌 TX 对 RX,RX 对 TX。这是最常见的接错点。接反了不会损坏,但收不到数据——交换一下即可。

模块选择:

模块 说明 推荐
CH340 最便宜(5元),驱动有时麻烦 ⭐⭐
CP2102 稳定,驱动完善 ⭐⭐⭐⭐ 推荐
FT232RL 最稳定,支持电压选择 ⭐⭐⭐⭐⭐
FT232H 支持 JTAG/SPI 等多协议 进阶用

4.1.3 连接

# Linux
# 1. 查看设备
dmesg | tail
# usb 1-1: ch341-uart converter now attached to ttyUSB0

# 2. 设置权限
sudo usermod -aG dialout $USER
# 重新登录生效

# 3. 用 minicom
sudo minicom -s
# → Serial port setup
# → A: Serial Device: /dev/ttyUSB0
# → E: Bps/Par/Bits: 115200 8N1
# → F: Hardware Flow Control: No
# → G: Software Flow Control: No
# → Save setup as dfl

# 4. 连接
sudo minicom
# 或用 screen(更简单)
screen /dev/ttyUSB0 115200

# 退出:Ctrl+A 然后按 K,再按 Y
# macOS
ls /dev/cu.usbserial*
screen /dev/cu.usbserial-1420 115200
# Windows:PuTTY
# 1. 设备管理器确认 COM 口(如 COM4)
# 2. PuTTY → Connection type: Serial
# 3. Serial line: COM4
# 4. Speed: 115200
# 5. Flow control: None
# 6. Open

4.1.4 常见波特率

波特率 适用
115200 最常见(80% 的路由器)
57600 部分老设备
38400 老设备
9600 很少
921600 少数新设备

📌 115200 试不出来时,尝试 57600 或 38400。或者用逻辑分析仪测 TX 线的波特率。

4.1.5 预期输出

接通后给路由器上电,应该看到 U-Boot 启动日志:

U-Boot 1.1.3 (Aug 12 2015 - 10:20:32)

Board: Ralink APSoC DRAM:  128 MB
relocate_code Pointer at: 87fb0000
spi_wait_nsec: 42
spi device id: ef 40 18 0 0 (40180000)
find flash: W25Q128BV
raspi_read: from:30000 len:1000
============================================
Ralink UBoot Version: 5.0.0.0
--------------------------------------------
ASIC 7621A
DRAM_CONF_FROM: Auto-Detection
DRAM_TYPE: DDR3
...
Please choose the operation:
   1: Load system code to SDRAM via TFTP.
   2: Load system code then write to Flash via TFTP.
   3: Boot system code via Flash (default).
   4: Entr boot command line interface.
   9: Load Boot Loader code then write to Flash via TFTP.

按 4 进入 U-Boot 命令行:

MT7621 #
MT7621 # printenv
MT7621 # help

继续启动会看到 Linux 内核日志,最后出现:

BusyBox v1.19.4 (2018-01-01 10:00:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 ATTITUDE ADJUSTMENT (Attitude Adjustment, rXXXXX)
 -----------------------------------------------------
root@OpenWrt:/#

拿到 root shell 了。

4.1.6 串口下的常用操作

# U-Boot 命令行(MT7621 # 提示符)
printenv                          # 查看环境变量
setenv bootargs console=ttyS0,115200 root=/dev/mtdblock5
setenv serverip 192.168.1.100     # TFTP 服务器 IP
setenv ipaddr 192.168.1.1
tftpboot 0x80000000 firmware.bin  # 从 tftp 加载到内存
saveenv
bootm 0x80000000                  # 从内存启动

# 常见的绕过密码/改启动参数
setenv bootargs console=ttyS0,115200 init=/bin/sh   # 直接进 shell
# Linux shell 下(root@OpenWrt:/# 提示符)
cat /proc/mtd              # 分区表
cat /proc/cpuinfo          # CPU
free -m                    # 内存
cat /etc/shadow            # 密码哈希
ps aux                     # 进程
netstat -tulnp             # 端口
ls /etc/init.d/            # 启动服务
nvram show                 # 博通设备配置
uci show                   # OpenWrt 配置

4.2 SPI Flash 固件提取

即使拿不到 shell,只要能物理接触设备,就能提取固件。

4.2.1 编程器夹取(免拆焊)

# 用 SOP8 夹子夹住 SPI Flash 芯片
# 注意:必须切断设备电源(有些设计会导致 SoC 与编程器冲突)

flashrom -p ch341a_spi -r firmware.bin
# Reading flash... done.

# 校验
flashrom -p ch341a_spi -v firmware.bin
# Verifying flash... VERIFIED.

# 查看芯片信息
flashrom -p ch341a_spi --flash-size

⚠️ 注意:有些情况下 SoC 会与编程器争抢 SPI 总线,导致读取失败或数据错乱。解决方式:

  1. 完全断电(拔电源)
  2. 如果还不行,需要拆焊芯片或用 SPI 隔离夹具
  3. 或者短接 RESET 让 SoC 保持在复位状态

4.2.2 binwalk 解包

# 安装
sudo apt install binwalk
# 或
pip install binwalk
# 依赖
sudo apt install squashfs-tools mtd-utils gzip bzip2 tar ar lzma xz-utils \
                 lzop sleuthkit ubi_reader

# 扫描固件结构
binwalk firmware.bin

# 预期输出:
# DECIMAL       HEXADECIMAL     DESCRIPTION
# --------------------------------------------------------------------------------
# 0             0x0             uImage header, header size: 64 bytes, ...
# 64            0x40            LZMA compressed data, properties: 0x6D...
# 196608        0x30000         uImage header, ...  "Linux-3.10.14"
# 262144        0x40000         Squashfs filesystem, little endian, version 4.0,
#                               compression:xz, size: 3456789 bytes, ...
# 8388608       0x800000        JFFS2 filesystem, little endian
# 递归提取(-M 递归,-e 提取)
binwalk -Me firmware.bin

# 输出目录
ls _firmware.bin.extracted/
# 40
# 40.7z
# squashfs-root/
# jffs2-root/

# 进入文件系统
cd _firmware.bin.extracted/squashfs-root/
ls
# bin  dev  etc  lib  mnt  proc  root  sbin  sys  tmp  usr  var  www
# 只提取某个文件系统(不递归)
binwalk -e firmware.bin

# 指定输出目录
binwalk -Me --directory=extracted firmware.bin

4.2.3 手动提取 squashfs

# 找到 squashfs 偏移(假设 0x40000 = 262144)
dd if=firmware.bin of=rootfs.squashfs bs=1 skip=262144

# 解压
unsquashfs rootfs.squashfs
ls squashfs-root/

# 或用 7z(Windows)
7z x rootfs.squashfs
# JFFS2 提取
# 先用 binwalk 找到偏移
dd if=firmware.bin of=rootfs.jffs2 bs=1 skip=8388608

# 挂载(需要 mtdram 模块)
sudo modprobe mtdram total_size=32768 erase_size=256
sudo modprobe mtdblock
sudo dd if=rootfs.jffs2 of=/dev/mtdblock0
sudo mount -t jffs2 /dev/mtdblock0 /mnt/jffs2

# 或用 jefferson / jffs2dump 工具
pip install jefferson
jefferson rootfs.jffs2 -d jffs2_root
# UBI 镜像提取(NAND 设备常见)
ubireader_extract_images firmware.ubi
ls ubifs-root/

4.3 固件后门与漏洞研究思路

拿到文件系统后,找什么?

4.3.1 硬编码口令

cd squashfs-root/

# 1. 查看密码哈希
cat etc/shadow
cat etc/passwd
# root:$1$xxxxxxxx$yyyyyyyyyyyyy:0:0:root:/root:/bin/ash

# 用 john / hashcat 破解
john --wordlist=/usr/share/wordlists/rockyou.txt shadow.txt

# 2. 搜索硬编码凭据
grep -r -i -E "password|passwd|pwd|secret|token|apikey" etc/ 2>/dev/null
grep -r -i -E "password" www/ 2>/dev/null

# 3. 搜索默认密码字符串
grep -r -a -E "admin123|root123|12345678|default_pass" . 2>/dev/null
# 4. 常见厂商默认口令查找(示例,只用于自查设备)
grep -r -a -i -E "password\s*=\s*[\"'][^\"']{3,}" etc/ www/ 2>/dev/null | head -50

# 5. 查看 Web 后端的认证逻辑
find . -name "*.cgi" -o -name "*.lua" -o -name "*.asp" | head -20
ls www/
cat www/*.asp 2>/dev/null | head -50

4.3.2 未授权命令执行

# 1. 找 CGI / Lua / PHP 脚本里的命令执行函数
grep -r -E "os\.execute|io\.popen|system\(|popen\(|exec\(" www/ sbin/ usr/sbin/ 2>/dev/null

# 典型漏洞模式(GoAhead / Boa / uhttpd):
#   /cgi-bin/xxx?cmd=...;ls
#   表单参数直接拼进 os.execute

# 2. 找 Web 服务器配置
cat etc/httpd.conf 2>/dev/null
cat etc/config/uhttpd           # OpenWrt

# 3. 找开放的端口与服务
cat etc/services
grep -r "inetd" etc/
cat etc/inetd.conf 2>/dev/null
# 4. 找 telnet / ssh 后门
grep -r -a "telnetd" etc/init.d/ sbin/ usr/sbin/ 2>/dev/null
# 经典:固件里的 "telnet 后门开关"(如某些型号访问特定 URL 会启动 telnetd)

cat etc/init.d/telnet 2>/dev/null
ls etc/init.d/

# 5. 找调试后门
grep -r -a -E "debug|backdoor|magic" etc/ sbin/ 2>/dev/null | head -30

4.3.3 云端管理接口(TR-069)

# TR-069 / CWMP 是运营商远程管理协议,历史上多次曝出漏洞
cat etc/config/cwmp 2>/dev/null
grep -r -a "acs_url\|cwmp\|tr069" etc/ 2>/dev/null

# 常见风险:
# - ACS 服务器 URL 硬编码
# - 通过 ACS 下发的命令未鉴权
# - 厂商云端账号可远程执行任意命令
# 检查固件升级机制
grep -r -a -E "upgrade|firmware_url|ota" etc/ sbin/ 2>/dev/null
# 风险:固件升级不做签名校验 → 中间人可以植入恶意固件

4.3.4 实用分析命令汇总

# 固件信息收集
file firmware.bin
strings firmware.bin | grep -i -E "linux version|gcc version"
binwalk -A firmware.bin | head -30        # 分析指令集架构

# 二进制逆向准备
readelf -h bin/busybox                    # 架构(MIPS/ARM)
objdump -d bin/busybox | head -50

# 找 setuid 程序
find . -perm -4000 2>/dev/null

# 找可写的敏感文件
find . -perm -0002 -type f 2>/dev/null | head

# 检查启动脚本
cat etc/rc.local 2>/dev/null
cat etc/init.d/rcS 2>/dev/null

# 检查证书/密钥
find . -name "*.pem" -o -name "*.key" -o -name "*.crt" 2>/dev/null
grep -r -a "BEGIN RSA PRIVATE KEY" . 2>/dev/null

# 检查 DNS / 网络配置
cat etc/resolv.conf
cat etc/config/network

4.3.5 研究的正确姿势

⚠️ 警告只在自有设备或明确授权的设备上做这些事。

  • 对他人设备(包括公共场所、公司、邻居的路由器)做扫描/渗透测试是违法行为
  • 发现的漏洞应通过负责任的披露流程(联系厂商、CNCERT/CNNVD 等)上报,不要公开利用细节
  • 固件分析得到的厂商私钥、后门口令不要公开传播
  • 本文所有命令的目的都是自查自己的设备,不是攻击他人

4.4 用 UART + TFTP 快速刷机

拿到 U-Boot 命令行后,即使 Flash 里的固件坏了,也能通过 TFTP 救回:

# 1. U-Boot 命令行设置网络
MT7621 # setenv ipaddr 192.168.1.1
MT7621 # setenv serverip 192.168.1.100
MT7621 # saveenv

# 2. 从 TFTP 加载固件到内存
MT7621 # tftpboot 0x80000000 openwrt-ramips-mt7621-xxx-squashfs-sysupgrade.bin
# 预期输出:
# netboot_common, argc= 3
# NetTxPacket = 0x87FE2C40
# KSEG1ADDR(NetTxPacket) = 0xA7FE2C40
# Using Eth0 (10/100-M)
# ...
# Loading: ##############################################
# done
# Bytes transferred = 5242880 (500000 hex)

# 3. 写入 Flash
MT7621 # erase 0x9f050000 +0x7b0000      # 擦除固件区(地址因机型而异)
MT7621 # cp.b 0x80000000 0x9f050000 0x500000   # 复制到 Flash

# 4. 启动
MT7621 # bootm 0x9f050000

⚠️ 警告Flash 地址(如 0x9f050000)和大小(+0x7b0000)因机型而异,必须查对应机型的资料或看 printenv 里的分区定义。写错地址会覆盖 bootloader 或 calibration 分区 = 真砖。

五、OpenWrt 刷入后基础配置

5.1 首次登录与改密码

# 1. 电脑接 LAN 口,OpenWrt 默认 IP 是 192.168.1.1
#    默认无密码(首次登录会提示设置)

# 2. 命令行方式(telnet,OpenWrt 首次启动只开 telnet)
telnet 192.168.1.1
# 出现 OpenWrt 提示符

# 3. 设置 root 密码(设置后 telnet 关闭,SSH 开启)
passwd
# Enter new password: 
# Retype password: 
# Password for root changed by root

# 4. 退出 telnet,改用 SSH
exit
ssh root@192.168.1.1
# 或用 Web 界面
# 浏览器访问 192.168.1.1 → 首次登录会要求设置密码
# 注意:第一次访问要先设置密码才能进 LuCI

⚠️ 警告OpenWrt 默认 root 无密码,且首次启动开放 telnet。如果你的路由器直接暴露在公网(WAN 口接光猫而非路由模式),这是个严重的安全风险第一件事永远是设置密码。

5.2 配置网络

做旁路由(最常见的新手场景):

# 场景:主路由是 192.168.1.1,OpenWrt 做旁路由 192.168.1.2
# 关闭 DHCP,让主路由继续分配

uci set network.lan.ipaddr='192.168.1.2'
uci set network.lan.gateway='192.168.1.1'
uci set network.lan.dns='192.168.1.1'
uci commit network

# 关闭 LAN 口 DHCP
uci set dhcp.lan.ignore='1'
uci commit dhcp

# 应用
/etc/init.d/network restart
/etc/init.d/dnsmasq restart
# 检查配置
uci show network
uci show dhcp

做主路由(PPPoE 拨号):

# 假设 WAN 口需要 PPPoE 拨号(宽带账号密码从运营商处获取)
uci set network.wan.proto='pppoe'
uci set network.wan.username='your_broadband_account'
uci set network.wan.password='your_password'
uci set network.wan.ifname='eth0.2'      # 视机型而定
uci commit network
/etc/init.d/network restart

# 查看拨号状态
ifstatus wan
logread | grep pppoe
# DHCP 上网(光猫已拨号,路由模式)
uci set network.wan.proto='dhcp'
uci commit network
/etc/init.d/network restart
ifstatus wan

5.3 开启 SSH 并加固

# SSH 默认在设置 root 密码后自动开启(Dropbear)

# 查看 SSH 配置
uci show dropbear

# 修改 SSH 端口
uci set dropbear.@dropbear[0].Port='2222'
uci commit dropbear
/etc/init.d/dropbear restart

# 禁用密码登录,改用密钥(推荐)
# 1. 本地生成密钥
ssh-keygen -t ed25519

# 2. 把公钥传到路由器
ssh-copy-id root@192.168.1.1
# 或手动:
cat ~/.ssh/id_ed25519.pub | ssh root@192.168.1.1 "cat >> /etc/dropbear/authorized_keys"

# 3. 禁用密码登录
uci set dropbear.@dropbear[0].PasswordAuth='off'
uci set dropbear.@dropbear[0].RootPasswordAuth='off'
uci commit dropbear
/etc/init.d/dropbear restart

5.4 安装 LuCI 与中文包

# 更新软件源(先确认能联网)
opkg update

# 安装 LuCI(Web 界面,部分固件已自带)
opkg install luci

# 安装中文语言包
opkg install luci-i18n-base-zh-cn

# 安装常用中文包
opkg install luci-i18n-firewall-zh-cn
opkg install luci-i18n-opkg-zh-cn

# 安装 HTTPS 支持(LuCI 走 HTTPS)
opkg install luci-ssl-openssl
# 或轻量版
opkg install luci-ssl

# 重启 uhttpd
/etc/init.d/uhttpd restart
# 查看可用语言
opkg list | grep luci-i18n | grep zh-cn

# LuCI 界面设置中文
# System → System → Language and Style → Language: 简体中文

5.5 常用软件包

opkg update

# 网络工具
opkg install ip-full ipset iptables-nft
opkg install tcpdump               # 抓包
opkg install netcat                # nc
opkg install curl wget-ssl
opkg install mtr                   # 路由追踪

# 文件/存储
opkg install blkid fdisk e2fsprogs
opkg install kmod-fs-ext4 kmod-fs-ntfs3
opkg install kmod-usb-storage kmod-usb-storage-uas
opkg install usbutils

# 调试
opkg install strace
opkg install lsof

# 主题(可选)
opkg install luci-theme-argon
opkg install luci-app-argon-config

# 查看已安装
opkg list-installed

# 查看包信息
opkg info tcpdump

5.6 overlay 扩容(小 Flash 设备必备)

16MB Flash 的设备,装几个包就满了。解决方案:

方案一:用 USB 盘做 overlay(推荐)

# 1. 安装 USB 存储支持
opkg update
opkg install kmod-usb-storage kmod-usb-storage-uas kmod-fs-ext4 \
            block-mount e2fsprogs fdisk blkid

# 2. 插入 U 盘,确认识别
ls /dev/sd*
# /dev/sda  /dev/sda1

# 3. 分区并格式化(会清空 U 盘!)
fdisk /dev/sda
# n → p → 1 → 回车 → 回车 → w

mkfs.ext4 /dev/sda1

# 4. 挂载并复制 overlay
mkdir -p /mnt/sda1
mount /dev/sda1 /mnt/sda1

cp -a /overlay/. /mnt/sda1/
# 等待复制完成

# 5. 配置自动挂载为 overlay
uci add fstab mount
uci set fstab.@mount[-1].target='/overlay'
uci set fstab.@mount[-1].device='/dev/sda1'
uci set fstab.@mount[-1].fstype='ext4'
uci set fstab.@mount[-1].options='rw,sync'
uci set fstab.@mount[-1].enabled='1'
uci set fstab.@mount[-1].enabled_fsck='0'
uci commit fstab

# 6. 重启
reboot

# 7. 验证
df -h
# 应该看到 /overlay 变成了 U 盘容量
# 自动配置脚本(OpenWrt 官方推荐方式)
opkg install block-mount
block detect > /etc/config/fstab
uci set fstab.@mount[-1].target='/overlay'
uci set fstab.@mount[-1].enabled='1'
uci commit fstab
reboot

⚠️ 警告U 盘必须质量可靠。overlay 在 U 盘上,U 盘损坏 = 系统配置全丢(虽然还能启动到基本系统)。建议:

  • 品牌 U 盘或 mSATA/SATA SSD(如果有接口)
  • 重要配置定期备份/etc/config 目录)
  • 考虑用 extroot 的"外部 overlay 失败时回退内部"配置

方案二:用 U 盘挂载为 /opt 或数据盘(更保守)

# 只把大文件放 U 盘,系统仍在 Flash
uci add fstab mount
uci set fstab.@mount[-1].target='/mnt/usb'
uci set fstab.@mount[-1].device='/dev/sda1'
uci set fstab.@mount[-1].fstype='ext4'
uci set fstab.@mount[-1].enabled='1'
uci commit fstab
/etc/init.d/fstab restart

# 配置 opkg 装到 U 盘
echo "dest usb /mnt/usb" >> /etc/opkg.conf
opkg --dest usb install tcpdump

5.7 配置备份与恢复

# 备份配置(很重要!)
# Web: System → Backup / Flash Firmware → Generate archive
# 或命令行:
sysupgrade -b /tmp/backup.tar.gz
# 然后下载 /tmp/backup.tar.gz

scp root@192.168.1.1:/tmp/backup.tar.gz ./

# 恢复配置
sysupgrade -r /tmp/backup.tar.gz

# 只备份 /etc/config(最关键的部分)
tar czf /tmp/etc-config.tar.gz /etc/config/
scp root@192.168.1.1:/tmp/etc-config.tar.gz ./
# 列出备份内容
tar tzf backup.tar.gz
# etc/config/dhcp
# etc/config/dropbear
# etc/config/firewall
# etc/config/network
# etc/config/system
# etc/config/wireless
# ...

5.8 系统升级(sysupgrade)

# 上传固件后
sysupgrade -v /tmp/openwrt-xxx-squashfs-sysupgrade.bin

# 保留配置升级(默认)
sysupgrade /tmp/xxx-sysupgrade.bin

# 不保留配置(干净升级)
sysupgrade -n /tmp/xxx-sysupgrade.bin

# 强制升级(忽略版本检查)
sysupgrade -F /tmp/xxx-sysupgrade.bin

# 升级前备份
sysupgrade -b /tmp/backup.tar.gz

⚠️ 警告跨大版本升级(如 21.02 → 23.05)建议不保留配置sysupgrade -n)。配置文件格式可能变化,保留旧配置可能导致网络不通、无法登录。

六、救砖

6.1 救砖能力矩阵

你有的东西 救砖成功率
Breed / pb-boot 可用 ⭐⭐⭐⭐⭐ 接近 100%
有 UART 串口 + U-Boot 命令行 ⭐⭐⭐⭐ 很高
设备有 TFTP 恢复功能 ⭐⭐⭐ 较高
有整片 Flash 备份 + CH341A 编程器 ⭐⭐⭐⭐ 高
有 CH341A 但没有备份 ⭐⭐⭐ 中(能刷但可能丢校准数据)
什么都没有 ⭐ 低(售后或报废)

📌 这再次说明:刷 Breed + 备份整片 Flash 是最重要的准备工作。

6.2 救砖速查表

症状 诊断 救砖方案
电源灯亮,但 WiFi 搜不到、Web 进不去 固件启动失败 进 Breed(Reset 上电)重刷固件
电源灯不亮/常亮,无网络 固件损坏 串口看日志确认;Breed 重刷
反复重启(bootloop) 固件不兼容 Breed 重刷正确版本
Breed 也进不去 bootloader 损坏 编程器刷回备份
串口无任何输出 硬件故障或 bootloader 全毁 编程器;检查电源/电容
刷完无线信号极弱 calibration 分区被覆盖 从备份恢复 factory/art 分区
刷完 MAC 地址全是 00 calibration 丢失 恢复 calibration 分区
编程器读不出芯片 接触不良 / 芯片损坏 重新夹;检查电压;可能需拆焊

6.3 标准救砖流程

1. 确认供电正常(电源灯、网口灯)
2. 尝试进 Breed:断电 → 按住 Reset → 上电 → 等 10 秒 → 访问 192.168.1.1
   ├── 成功 → 网页刷回固件,结束
   └── 失败 → 下一步
3. 接串口(115200),上电看输出
   ├── 有 U-Boot 输出 → 按 4 进命令行,tftpboot 救
   ├── 有输出但内核崩 → 用 tftp 重刷固件
   └── 无输出 → 硬件故障或 bootloader 全毁
4. 上 CH341A 编程器
   ├── 能识别芯片 → 写回之前备份的整片镜像
   └── 读不到芯片 → 硬件损坏,报废或换芯片

6.4 恢复无线校准数据

# 从之前备份的整片镜像里提取 calibration 分区
# 假设 factory 分区在 0x40000,大小 64KB(以机型为准!)
dd if=full_backup.bin of=factory.bin bs=1 skip=262144 count=65536

# 用编程器写回
# 拼接:保留新固件,但把 factory 区换回原厂的
cp new_firmware_full.bin recovery.bin
dd if=factory.bin of=recovery.bin bs=1 seek=262144 conv=notrunc

flashrom -p ch341a_spi -w recovery.bin
# 若能进 Breed,也可以只刷 factory 分区
# Breed Web → 固件更新 → 选择区域为 "Factory" 或 "EEPROM"

⚠️ 警告偏移地址必须以你自己的机型为准0x40000 只是常见值之一,不同机型可能是 0x100000x500000x80000。错误地覆盖其他分区会造成新的损坏。先用 binwalk 分析你的备份,确认分区布局。

七、常见问题

7.1 刷完无线信号变差

原因:
1. Broadcom 平台 → 开源驱动性能天然差(无解,只能刷回原厂)
2. calibration/ART 分区被覆盖 → 从备份恢复
3. 发射功率被限制(固件默认功率低于原厂)→ 手动调整国家代码/功率
4. 驱动未正确加载 → dmesg 查看
# 查看无线状态
iwinfo
# wlan0     ESSID: "OpenWrt"
#           Access Point: XX:XX:XX:XX:XX:XX
#           Mode: Master  Channel: 6 (2.437 GHz)
#           Tx-Power: 20 dBm  Link Quality: unknown/70

# 调整国家代码(影响可用信道和功率)
uci set wireless.radio0.country='CN'
uci set wireless.radio0.txpower='20'
uci commit wireless
wifi reload

# 查看驱动加载
dmesg | grep -i -E "wifi|wlan|mt76|ath"

⚠️ 警告擅自提高发射功率超过国家规定限值(中国为 2.4GHz 20dBm / 100mW EIRP)是违法的。请遵守当地无线电管理法规。

7.2 刷完网口不通 / VLAN 配置错误

# 查看交换芯片配置
uci show network
swconfig dev switch0 show

# MT7621 典型 5 口配置(1 WAN + 4 LAN)
# 不同机型的端口编号不同,刷机后可能需要调整

# 查看接口
ip link show
ifconfig -a

# 重置网络配置
cp /rom/etc/config/network /etc/config/network
/etc/init.d/network restart

7.3 刷完 5G 无线不可用

原因:
1. 驱动不加载(Broadcom 常见)
2. DFS 信道问题(5G 的部分信道需雷达检测,固件可能禁用)
3. 国家代码限制

排查:
dmesg | grep -i -E "5g|phy1|ath10k|mt76"
iw phy
uci show wireless

# 尝试改信道为 36/40/44/48(非 DFS)
uci set wireless.radio1.channel='36'
uci commit wireless
wifi reload

7.4 flashrom 报 "No EEPROM/flash device found"

# 排查
# 1. 检查接线/夹子
flashrom -p ch341a_spi -V     # 加 -V 看详细输出

# 2. 检查驱动(Windows)
# 设备管理器 → 是否有 CH341A 设备

# 3. 指定芯片型号(跳过自动检测)
flashrom -p ch341a_spi -c "W25Q128.V"

# 4. Linux 权限
sudo flashrom -p ch341a_spi

# 5. 尝试降速
flashrom -p ch341a_spi -r backup.bin --spi-speed 1000

7.5 OpenWrt 装包装不下

# 查看空间
df -h
# Filesystem                Size      Used Available Use% Mounted on
# /dev/root                 5.0M      5.0M         0 100% /rom
# tmpfs                    61.9M      1.2M     60.7M   2% /tmp
# /dev/mtdblock6            9.5M      1.5M      8.0M  16% /overlay

# 解决:
# 1. 清理 opkg 缓存
rm -rf /tmp/opkg-lists/*
opkg clean

# 2. 删除不用的包
opkg remove --autoremove luci-app-opkg

# 3. 做 overlay 扩容(见 5.6)
# 4. 或用 imagebuilder 定制精简固件

7.6 忘记 OpenWrt 密码

# 方法:进 failsafe 模式
# 1. 路由器断电
# 2. 通电,在启动过程中(看到某个灯快速闪烁时)反复按 Reset 键
# 3. 进入 failsafe 模式(OpenWrt 提示 "Press the [f] key and hit [enter]")
# 4. 电脑设静态 IP 192.168.1.2,telnet 192.168.1.1
telnet 192.168.1.1
# 出现 OpenWrt failsafe 提示

# 重新挂载根为可写
mount_root

# 改密码
passwd

# 重启
reboot -f

八、操作检查清单

刷机前:

  • [ ] 确认 SoC 型号(拆机看丝印,不只是看型号贴纸)
  • [ ] 确认 Flash 类型与容量(NOR vs NAND,8/16/128MB)
  • [ ] 确认 硬件版本(V1/V2/V3)
  • [ ] 确认目标固件支持该机型(查 OpenWrt Table of Hardware / 社区)
  • [ ] 已备份整片 Flashflashrom -r,多读几次对比 md5)
  • [ ] 已单独备份 calibration/factory/ART 分区
  • [ ] 已备份原厂 bootloader
  • [ ] 有 CH341A 编程器 + 夹子(没有就先买
  • [ ] 有 USB-TTL 串口模块(强烈建议)
  • [ ] 有备用路由器(刷砖时全家不断网)
  • [ ] 电脑已设好静态 IP,网线已接 LAN 口
  • [ ] 知道该机型的 Breed 是否支持、TFTP 恢复文件名
  • [ ] 刷机过程不会断电(不要在有定时断电/熊孩子的环境刷)

刷机顺序:

  • [ ] 1. 备份整片 Flash
  • [ ] 2. 刷入 Breed(如果支持)
  • [ ] 3. 验证能进 Breed Web 恢复模式
  • [ ] 4. 通过 Breed 刷入目标固件
  • [ ] 5. 首次启动后立刻设置 root 密码
  • [ ] 6. 配置网络 → 验证能上网
  • [ ] 7. 安装中文包 + 常用工具
  • [ ] 8. 做 overlay 扩容(小 Flash 设备)
  • [ ] 9. 备份 /etc/config 配置
  • [ ] 10. 记录下 Breed 进入方式,贴在路由器底部

参考资源

类型 说明
OpenWrt Table of Hardware openwrt.org/toh查机型支持的第一站
OpenWrt 官方文档 openwrt.org/docs
OpenWrt 中文社区 国内教程、固件、讨论
Breed 发布页(hackpascal) Breed 支持列表与下载,请从可信来源获取
GitHub: espressif/esptool 不适用路由器,但同类工具思路
flashrom 官方文档 flashrom.org — 支持的编程器与芯片列表
binwalk 仓库 GitHub: ReFirmLabs/binwalk — 固件解包
恩山无线论坛 国内路由器刷机最大的中文社区
GitHub: coolcrescent 固件分析工具集合

⚠️ 警告国内论坛(恩山等)上的固件来源复杂,很多是个人打包的修改版固件刷第三方打包固件 = 把家庭网络的所有流量交给一个陌生人。建议:

  • 优先使用 OpenWrt 官方编译的固件openwrt.org 下载)
  • 或用官方 Image Builder / SDK 自行定制
  • 刷个人打包固件前,至少确认作者可信度、校验哈希、看看有没有人审计过
  • 路由器是家庭网络的所有流量的必经之地,这比手机上装个来路不明的 App 危险得多

📌 路由器硬件版本极其繁杂,同一型号不同批次可能换了芯片、换了 Flash、换了交换芯片。所有操作前请以拆机看到的实际芯片丝印为准,不要只看型号。本文中的 Flash 偏移地址、分区布局均为示例,实际值必须通过对你自己设备的备份做 binwalk 分析来确定。