路由器刷机教程
⚠️ 风险提示
- 刷机会清空全部数据,操作前完整备份(照片、通讯录、微信记录、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 | 视平台 |
⚠️ 警告:
factory和sysupgrade不要搞混:
- 首次从原厂刷 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 RX 或 J1 / 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 总线,导致读取失败或数据错乱。解决方式:
- 完全断电(拔电源)
- 如果还不行,需要拆焊芯片或用 SPI 隔离夹具
- 或者短接 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只是常见值之一,不同机型可能是0x10000、0x50000、0x80000等。错误地覆盖其他分区会造成新的损坏。先用 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 / 社区)
- [ ] 已备份整片 Flash(
flashrom -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分析来确定。