软路由入门(四):插件与系统维护,从 opkg 到备份恢复
写在前面
这是「软路由入门」系列的第四篇,也是终篇,主题是插件与系统维护:从 opkg 软件包管理,到备份恢复、固件升级和日志排错。前三篇《软路由入门(一):什么是软路由,硬件怎么选》《软路由入门(二):固件选择与刷机》《软路由入门(三):首次配置与旁路由》把"买什么、怎么刷、怎么配“讲完了,这篇补上让系统长期稳定运行的部分——设备跑起来只是开始,后面长时间的日常使用中,你会反复面对装插件、更新软件源、升级固件、配置备份这些事。
本文延续系列的实测路线,测试环境是 ImageBuilder 定制的 OpenWrt 24.10.7(QEMU 虚拟机,x86_64),LuCI 中文界面。文中所有 opkg 命令、软件源配置、插件安装都在这套环境里实际执行过,命令输出原样贴出;固件升级章节按资料型整理(测试环境没有升级页的实测条件,步骤对照 OpenWrt 官方文档),其余章节全实测。
先划清边界:科学上网五个插件的深度配置(订阅、分流、内核)本站都有单篇教程,本篇只做场景推荐和指路;去广告的 AdGuard Home 是重头,从原理到装完配置、和代理插件共存,本篇一次讲透;备份、升级、日志是资料型 + 命令实操结合,保证你看完能直接上手。
阅读建议:第一次折腾插件,从「软件包管理入门」按顺序读,把 opkg 和软件源搞懂,后面所有安装操作都是这套动作的组合;只想去广告,直接跳到「常用插件推荐」里的 AdGuard Home;系统已经跑了一阵、担心哪天坏了,重点读「备份与恢复」「固件升级」「日志与排错」三章;想把设备当"养了几年的老伙计”,最后「日常维护清单」给你一张月度例行表。
软件包管理入门:opkg 与软件源
opkg 是什么:OpenWrt 的"应用商店"
opkg(OpenWrt Package Manager)是 OpenWrt 的软件包管理器,装插件、卸插件、查版本、更新软件列表全靠它,地位相当于 Linux 上的 apt 和 yum。OpenWrt 里把插件统称为
软件包OpenWrt 中可安装的软件单元,一个插件常由主程序包、LuCI 界面包和汉化包组成,用 opkg 管理。
:一个软件包可以是一个程序(比如 adguardhome)、一个 LuCI 界面(luci-app-xxx)、一个汉化包(luci-i18n-xxx-zh-cn)。装插件往往不止装一个包——界面包会依赖主程序,主程序又依赖一堆库,opkg 会自动把这些依赖一起装上,这正是它比"手动拷文件"省心的地方。OpenWrt 官方文档对 opkg 有完整说明(opkg 软件包管理器文档),命令和行为都和它写的一致。
LuCI 里的「系统 → 软件包」页面就是 opkg 的图形界面,点按钮等于在背后执行 opkg 命令。但维护场景我更推荐直接用 SSH 敲命令:输出完整、报错信息全、还能组合 grep 过滤,排查问题时比点界面快得多。SSH 怎么连、账号密码怎么设,第三篇的「管理权」章节讲过,这里默认你已经会了。
和 opkg 配套的两个概念先建立起来:
- 软件包列表:记录"源里有哪些包、什么版本"的索引。opkg update 就是刷新这份索引,新装源或源更新后必须刷一次,否则装包会提示找不到。
- 软件包状态:系统里记录了每个包是"手动装的"还是"作为依赖自动带的"。卸载时 opkg 会提示哪些依赖可以顺手清理,别一股脑全删,可能连带删掉别的插件要用的库。
软件源:插件从哪下载
软件源(软件仓库)是软件包存放的服务器地址,配置在 /etc/opkg/distfeeds.conf 文件里。我的测试机(OpenWrt 24.10.7 x86_64)默认配置了五个源,全部指向 OpenWrt 官方下载站:
root@OpenWrt:~# cat /etc/opkg/distfeeds.conf
src/gz openwrt_core https://downloads.openwrt.org/releases/24.10.7/targets/x86/64/packages
src/gz openwrt_base https://downloads.openwrt.org/releases/24.10.7/packages/x86_64/base
src/gz openwrt_luci https://downloads.openwrt.org/releases/24.10.7/packages/x86_64/luci
src/gz openwrt_packages https://downloads.openwrt.org/releases/24.10.7/packages/x86_64/packages
src/gz openwrt_routing https://downloads.openwrt.org/releases/24.10.7/packages/x86_64/routing
五个源各管一摊:core 放固件自带的核心组件,base 放基础库,luci 放管理界面,packages 放第三方应用,routing 放路由相关组件(比如 BGP 工具)。注意 URL 里的 releases/24.10.7——软件源和固件版本一一对应,24.10.7 的固件就该用 24.10.7 的源,跨版本混用会在装包时遇到依赖版本冲突。
官方源的特点是干净但克制:安全、签名校验严格,可插件数量有限,很多国内圈子常用的插件(代理插件、去广告插件)不在其中,这直接决定了下一节换源的必要性。想用更全的插件库,immortalwrt 这类分支项目的源是主流选择,第二篇的固件章节介绍过它,本篇聚焦"官方源 + 换国内镜像"这条路。
换源:国内镜像加速
官方源服务器在国外,国内网络下 opkg update 经常慢到超时。解决办法是换用国内镜像,这个操作圈内叫
换源把 OpenWrt 软件源地址从官方服务器换成国内镜像,解决 opkg 下载慢、超时的问题,换完需执行 opkg update 刷新索引。
——镜像就是把官方源原样同步到国内服务器,地址结构一致,换起来只改一个域名。常用镜像(均同步 OpenWrt 官方仓库,截止到本文更新时间可用):
| 镜像 | 地址 | 说明 |
|---|---|---|
| 清华 TUNA | mirrors.tuna.tsinghua.edu.cn/openwrt | 教育网和国内访问都快,文档齐全 |
| 中科大 USTC | mirrors.ustc.edu.cn/openwrt | 老牌镜像站,稳定性好 |
| 阿里云 | mirrors.aliyun.com/openwrt | 家宽访问速度稳定 |
换源用一条 sed 命令把 distfeeds.conf 里的域名整体替换:
sed -i 's#downloads.openwrt.org#mirrors.tuna.tsinghua.edu.cn/openwrt#g' /etc/opkg/distfeeds.conf
执行后 cat /etc/opkg/distfeeds.conf 检查一下,URL 开头的域名应该变成 mirrors.tuna.tsinghua.edu.cn,后面的 releases/24.10.7 路径保持原样——镜像就是按官方目录结构同步的,路径不能动。然后照常 opkg update,看到"Updated source"字样就是换源成功。想让网络更稳,可以在家里放一台旁路由专门跑镜像代理——这是另一套玩法,本篇不展开。
/etc/opkg/opkg.conf 里默认开着 option check_signature(签名校验),它是防止源被劫持、装到篡改包的关键防线。换源后如果报签名错误,先检查版本目录是否对得上、镜像是否同步完成,不要为了消错把它关掉——关掉等于把设备暴露给中间人。搜索安装卸载:SSH 命令实操
下面这套命令是我在测试机上一遍敲下来的,维护期 90% 的操作就是它们在循环。先更新软件包列表:
root@OpenWrt:~# opkg update
Downloading https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.7/packages/x86_64/base/Packages.gz
Updated source 'openwrt_base'
Downloading https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.7/packages/x86_64/luci/Packages.gz
Updated source 'openwrt_luci'
Downloading https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.7/packages/x86_64/packages/Packages.gz
Updated source 'openwrt_packages'
Downloading https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.7/packages/x86_64/routing/Packages.gz
Updated source 'openwrt_routing'
Downloading https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/24.10.7/targets/x86/64/packages/Packages.gz
Updated source 'openwrt_core'
五个源全部"Updated",说明换源成功、索引正常。搜包用 opkg list | grep,我把本篇要演示的两个包都搜了一遍,官方源里确实有:
root@OpenWrt:~# opkg list | grep -i adguard
adguardhome - 0.107.57-r1 - AdGuard Home: Network-level blocker
root@OpenWrt:~# opkg list | grep -i smartdns
luci-app-smartdns - 1.2023.42-r1 - LuCI Support for smartdns
opkg list 输出每行格式是"包名 - 版本号 - 简介"。搜代理插件用 opkg list-installed,只列已装的:
root@OpenWrt:~# opkg list-installed | grep -E "openclash|passwall|homeproxy|ssr"
luci-app-homeproxy - 26.151
luci-app-openclash - 0.47.156
luci-app-passwall - 26.8.12-r1
luci-app-passwall2 - 26.8.10-r1
luci-app-ssr-plus - 196-r7
测试机里五个主流代理插件都装了——后面「插件冲突排查」会讲为什么只能同时开一个。安装和卸载命令:
opkg install adguardhome # 安装,依赖自动带上
opkg remove luci-app-smartdns # 卸载,界面包和主程序要分别卸
常用命令汇总成一张表,贴在终端旁边:
| 命令 | 作用 |
|---|---|
opkg update | 刷新软件源索引,换源后必做 |
opkg list | 列出源里所有可用包,配合 grep 搜索 |
opkg list-installed | 列出已安装的包 |
opkg list-upgradable | 列出可升级的包 |
opkg install <包名> | 安装软件包,自动处理依赖 |
opkg remove <包名> | 卸载软件包 |
opkg info <包名> | 查看某个包的详细信息 |
LuCI 界面操作:系统 → 软件包
不想敲命令时,LuCI 的软件包页足够完成日常安装。路径是 System → Software(系统 → 软件包),页面顶部三个页签,中文界面的标签是 可用 / 已安装 / 更新(对应英文 Available / Installed / Updates,24.10 的 LuCI 界面源码里就是这么翻译的):
- 可用:显示软件源里所有能装的包,顶部过滤器输入关键字实时筛选,点包名右侧的安装…按钮安装,会先弹窗显示依赖清单;
- 已安装:列出系统里已装的包,右侧是移除…和**升级…**按钮;
- 更新:显示"源里有新版本"的已装包,一键批量升级,前提是先点右上角的**更新列表…**刷新索引。
界面操作和 SSH 命令是同一套东西,界面点「更新列表…」= 执行 opkg update,点「安装…」= opkg install。界面适合首次装包、看依赖关系;SSH 适合批量操作和排错,两条路都留着,场景不同用哪个顺手用哪个。
装界面包后如果显示英文,顺手把汉化包一起装了:搜索 luci-i18n-<插件名>-zh-cn,比如 luci-i18n-openclash-zh-cn。汉化包只是翻译文件,装了不会影响插件本体,LuCI 的软件包页专门有「翻译包」筛选开关,勾上就能把这类包过滤出来。
安全提醒一句:LuCI 软件包页在安装来自未知源的包时会弹风险警告,官方源和可信镜像源之外的东西,装之前想清楚来源——来历不明的整合包可能带后门,第二篇说过"只信官方和社区公认维护者"。
常用插件推荐:分场景挑
插件装什么,取决于你要解决什么问题。下面按三个场景推荐,每个场景对应一类插件,用折叠面板展开:科学上网(全家代理)是绝大多数人的第一需求,去广告(AdGuard Home)是电视盒子用户的刚需,DNS 分流(SmartDNS)属于进阶玩法,读完按需取用,别一次全装上——插件越多,冲突面越大。
▸场景一:科学上网五件套(小白首选)
OpenWrt 上主流代理插件就五个,功能本质相同:透明代理 + DNS 分流,区别在界面设计、内核选择和维护状态。五个插件的深度配置本站都有单篇教程,这里只给选型结论:
| 插件 | 一句话定位 | 教程 |
|---|---|---|
| OpenClash | 功能最全的 Clash 系插件,策略组玩法多,Fake-IP 防 DNS 污染做得好 | OpenClash 介绍和使用指南 |
| PassWall | 老牌多协议插件,界面朴素、依赖轻,xray 系用户首选 | PassWall 介绍和使用指南 |
| PassWall 2 | PassWall 的独立重构版,内置分流节点,界面更贴近新版需求 | PassWall 2 介绍和使用指南 |
| HomeProxy | ImmortalWrt 系新一代插件,sing-box 内核,国内/GFW 资源列表一体化 | HomeProxy 介绍和使用指南 |
| Hello World | SSR Plus+ 的新版(旧版已停更),Xray/mihomo 多核心,协议全家桶 | Hello World 使用教程 |
选型就一条原则:哪个看得顺眼用哪个,功能都够。特别提醒:五个插件只能同时开一个,透明代理插件会抢占防火墙转发规则和 DNS 端口,同时开的结果是两个都起不来(详细原因见「插件冲突排查」)。换插件前,先把旧的停掉。
▸场景二:去广告(AdGuard Home 实测,重头戏)
AdGuard Home 是 OpenWrt 上最主流的 DNS 级去广告工具,官方源直接能装(我实测到的版本是 0.107.57-r1)。为什么把它单独拎出来讲?因为电视盒子、智能电视这类设备装不了浏览器插件、改不了 hosts,而 DNS 级去广告恰好不依赖设备——在路由器上拦一次,全家生效。对"电视 App 开屏广告、网页弹窗广告"这类靠域名加载的广告,效果立竿见影。
为什么 DNS 级去广告有效:一条广告的加载路径是"设备请求广告域名 → DNS 查出 IP → 加载广告脚本/素材"。三步里掐断任何一步,广告就出不来。DNS 级去广告掐的是第一步:把广告域名解析成无效地址(比如 0.0.0.0),广告服务器连不上,广告自然加载失败。这招和 GFW 的 DNS 污染是同一个原理,区别只是"拦谁"由你自己定。AdGuard Home 自带广告域名黑名单(过滤列表),列表里的域名统一"解析失败",不用一条条手填。
要理解它的边界:DNS 级拦截只对"靠域名加载"的广告有效,剪进视频里的贴片广告、和内容同源的推广位拦不了;它不会提升网速——“装了去广告网速变快"大多是错觉,真有明显提升,多半是之前的 DNS 配置本身有问题(这观点来自去广告主题的口播稿,我实测下来的体感一致:过滤的是请求数,不是带宽)。另外规则会误杀:网页验证码、登录弹窗偶尔被当成广告拦掉,遇到网页功能异常,先关掉去广告试试。
安装(测试机实测,官方源直接装):
root@OpenWrt:~# opkg update
...(五个源全部 Updated)...
root@OpenWrt:~# opkg install adguardhome
Installing adguardhome (0.107.57-r1) to root...
Configuring adguardhome.
root@OpenWrt:~# /etc/init.d/AdGuardHome enable
root@OpenWrt:~# /etc/init.d/AdGuardHome start
装完浏览器访问 http://<路由器IP>:3000 进首次配置向导,向导会问管理端口、DNS 监听端口、上游 DNS 三项,照着下面配:

图注:AdGuard Home 首次配置向导(共五步),我的测试环境是 OpenWrt 24.10.7 官方源装的 0.107.57
- 管理界面监听:保持默认
3000(只在路由器本机监听即可,别暴露到外网); - DNS 监听端口:改成
5353!AdGuard Home 默认也想占53,而 53 已经被 dnsmasq 占着(第三篇讲过,OpenWrt 的 DHCP 和 DNS 都是 dnsmasq 提供的),直接冲突。用 5353 做 AdGuard 的监听口,是社区里最稳妥的共存姿势; - 上游 DNS:填公共 DNS 服务器,国内常用阿里
223.5.5.5、腾讯 DNSPod119.29.29.29,国际访问多可加 Cloudflare1.1.1.1(三个公共 DNS 的特点对照表在第三篇)。
配置向导走完,AdGuard Home 的过滤列表默认带一套基础规则,后台「过滤器 → DNS 拦截清单」里可以加社区规则、定期更新。被误拦的域名也有救:后台「查询日志」里能看到每一条被拦截的请求,确认是误杀就点加入白名单,下次不再拦它。
到这里 AdGuard 自己已经能跑了,但设备还不会主动用它——还需要把它接进 DNS 链路,见下面的共存说明。先给一个真实的场景感受:我家客厅的电视盒子,装不了浏览器插件,App 开屏广告以前只能手动跳过;AdGuard Home 在路由器上生效后,盒子的 DNS 请求统一过它,开屏广告直接不出现,这就是"DNS 级拦截不依赖设备"最直观的收益。
和科学上网共存:53 端口冲突。这是装完 AdGuard Home 最常见的翻车点,分两种情况:
- 没开代理插件时:让全家设备用 AdGuard,把 dnsmasq 的 DNS 请求转给它即可。LuCI 路径 Network → DHCP and DNS → 高级设置 → DNS 转发(DNS forwardings),填一行
127.0.0.1#5353——意思是"dnsmasq 收到的解析请求都转给本机 5353 端口的 AdGuard Home”。这样设备 → dnsmasq → AdGuard Home → 公网 DNS,过滤生效,什么都不用动; - 开了 OpenClash 时:OpenClash 的 redirect 模式会把设备的 53 端口流量直接劫持到 Clash 内核的 DNS 端口(默认
7874),dnsmasq 那层不走了,所以"填了 DNS 转发没反应"。共存做法是把 OpenClash 的 DNS 上游指向 AdGuard:在 OpenClash 的覆写设置 → DNS 服务器区,把 AdGuard Home 的监听地址127.0.0.1:5353加到自定义上游/追加上游里。链路变成设备 → OpenClash 内核 → AdGuard Home → 公网 DNS,先分流再过滤,两边各干各的。
netstat -tunlp | grep :53 看 53 被谁监听,logread | grep dnsmasq 看启动报错。解决:把 AdGuard Home 的 DNS 监听改回 5353,重启 dnsmasq(/etc/init.d/dnsmasq restart)。去广告效果怎么验收:AdGuard Home 后台首页有查询统计,能看到单位时间内拦截了多少条请求、命中哪些规则。拦到的数量开始明显下降是正常的——设备端会缓存,规则在变少说明广告主也在换域名,过滤列表记得定期更新。

图注:AdGuard Home 仪表盘,查询和拦截统计会随使用累积;实测拦截 doubleclick.net 广告域名返回 0.0.0.0
▸场景三:DNS 分流(SmartDNS,进阶)
SmartDNS 解决的是"不同域名走不同 DNS 服务器“的问题。默认情况下,所有域名解析都走同一个上游,但国内域名用国内 DNS 更快、国外域名用国外 DNS 才不容易被污染——一刀切总有半头吃亏。SmartDNS 的思路是按域名分组:把域名分成国内组、国外组,每组指定自己的上游 DNS,再按测速结果挑最快的返回。
官方源里能直接装(我搜到的是 luci-app-smartdns 1.2023.42-r1,依赖的 smartdns 主程序会一起装)。它的典型用法:
- 国内域名组 → 阿里
223.5.5.5/ DNSPod119.29.29.29,解析快、符合合规要求; - 国外域名组 → Cloudflare
1.1.1.1/ Google8.8.8.8,避开国内链路上的解析污染(第三篇讲过 DNS 污染的表现和危害); - 同时开缓存,重复域名不再反复查上游,局域网解析延迟进一步降低。
SmartDNS 和 AdGuard Home 不冲突,反而能串成一条链路:设备 → SmartDNS(分流)→ AdGuard Home(过滤)→ 公网 DNS。不过这条链多一跳,多一层排错面,先把单一工具跑稳再叠,是我给进阶玩家的顺序建议。SmartDNS 的配置项比 AdGuard Home 多一截,属于"资料型简介"范畴,具体分组规则写法建议参考SmartDNS 官方文档。
插件冲突排查
透明代理四选一:为什么只能开一个
先说结论:OpenClash、PassWall、PassWall 2、HomeProxy、Hello World 这五个透明代理插件,同一时刻只能开一个。不是开发者互相不兼容,是它们的工作方式决定了没法共存:
- 防火墙转发规则:透明代理靠 iptables/nftables 把设备流量重定向到自己的监听端口(OpenClash 的 redirect 模式就是干这个),两个插件都写规则,后写的把先写的覆盖掉,结果一个都代理不了;
- DNS 接管:插件都要接管域名解析(OpenClash 劫持 53 到 7874,其他插件各有各的 DNS 模块),同时开等于两个进程抢同一个活,解析结果互相打架;
- 端口占用:都监听自己的代理端口,冲突时报 “Address already in use”,服务起不来。
症状很典型:两个插件都显示"未运行",或者开了 A 之后 B 的日志疯狂报错。切换的正确姿势是:先在 A 的主界面关掉主开关 → 保存并应用 → 再开 B,顺序反了会有一段"双开"的混乱期。我在测试机里五个插件都装着,平时只开一个,互相切换从没出过问题——装可以多装,开只能开一个。
DNS 端口占用:53 被谁抢了
53 是 DNS 协议的标准端口,OpenWrt 上默认归 dnsmasq(DHCP + DNS 服务)。但下面这些家伙都可能来抢:
| 服务 | 什么时候占 53 |
|---|---|
| dnsmasq | 系统默认,一直在 |
| AdGuard Home | 默认配置就想占 53,需要改成 5353 |
| OpenClash | redirect 模式把 53 劫持到 7874,绕开 dnsmasq |
| SmartDNS | 作为 DNS 服务器时默认监听 53 |
| 其他代理插件 | DNS 模块开启时可能占用 |
排查端口归属一条命令:
root@OpenWrt:~# netstat -tunlp | grep :53
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 1234/dnsmasq
udp 0 0 0.0.0.0:53 0.0.0.0:* 1234/dnsmasq
输出里能看到53 端口被哪个进程监听(上面示例是 dnsmasq 正常持有)。如果监听的是别的进程、或者 dnsmasq 反复起不来,配合 logread | grep -i "address already in use" 基本一抓一个准。解决思路就两条:给多余的服务换端口(AdGuard 改 5353),或者关掉不需要的 DNS 服务(透明代理插件只留一个)。想清楚"这台路由器上到底谁负责给设备发 DNS 答案",53 冲突就绕不开你了。
备份与恢复
备份对象:/etc/config 与 uci 配置
OpenWrt 有个对维护极友好的设计:所有配置都是文本文件,集中在 /etc/config/ 目录。网络接口(network)、DHCP/DNS(dhcp)、防火墙(firewall)、管理权(dropbear)、每个插件的设置(openclash、passwall、adguardhome 等)——全是 uci 格式的明文配置。
备份把 OpenWrt 的配置文件(主要是 /etc/config 目录)导出保存,升级固件或折腾插件前执行,用于出问题时恢复。
的本质,就是把这些文本文件复制一份。
另一个配套工具是 uci 命令,它能把这些配置导出成一段可移植的文本:uci export network 输出网络配置,uci export 不带参数导出全部配置。文本 = 可读、可 diff、可手工编辑,这就是 OpenWrt 配置比"厂商 App 里的设置项"好维护的地方。
先把一个关键认知立起来:备份的是配置,不是插件本身。备份文件里只有"我配了什么",不含"插件程序本体"。所以恢复配置的前提是先把对应插件装回去,这个顺序别搞反(后面「迁移到新设备」会再强调)。
看一眼备份里到底有什么,心里就有底了。测试机上 /etc/config/ 目录长这样:
root@OpenWrt:~# ls /etc/config/
adguardhome dhcp dropbear firewall luci network openclash passwall rpcd shadowsocksr uhttpd
每个文件名对应一类配置:network 管接口和 IP,dhcp 管 DHCP/DNS,firewall 管防火墙,openclash/passwall/adguardhome 分别是各插件的设置。备份时整个目录打包,一个不落。备份文件的命名建议带日期(backup-20260813.tar.gz),电脑上留最近两三份就够——配置会演化,旧备份覆盖新配置比没有备份更麻烦。
两种备份方式
▸方式一:LuCI 导出备份(小白首选)
LuCI 自带一键备份,路径 System → Backup / Flash Firmware(系统 → 备份/升级),页面上部是备份区:
点 Generate archive(生成备份),页面会下载一个
backup-<型号>-<日期>.tar.gz文件;这个文件就是完整的配置备份,存到路由器以外的地方(电脑、网盘都行),别只留在路由器上;
恢复时回到同一页面,在 Restore(恢复)区上传这个 tar.gz 文件,等重启完成。
备份区下面就是恢复出厂(Reset)和刷固件(Flash)的入口,都在这一页。恢复出厂会把系统清回刚刷完的状态——点之前,确认备份已经导出并存到别处了。
▸方式二:SSH 命令备份(进阶)
SSH 里备份更灵活,可以只备配置、也可以连 uci 导出文本一起留:
# 打包整个 /etc/config 目录(推荐,恢复最完整)
root@OpenWrt:~# tar -czvf /tmp/backup-20260813.tar.gz /etc/config/
# 或者用 uci export 导出全部配置为纯文本
root@OpenWrt:~# uci export > /tmp/uci-backup.conf
# 单独导出某个配置,方便查看/对比
root@OpenWrt:~# uci export network
tar 方案恢复时原样解包回去,uci export 方案胜在可读——升级前把 network 配置导出看一眼,比进 LuCI 逐项截图省事。进阶玩家可以两条都留:tar 包管恢复,uci 文本管对比。
恢复与迁移到新设备
恢复把之前备份的配置文件重新导入 OpenWrt,使网络、插件等设置回到备份时的状态。
:LuCI 方式上传备份文件即可;SSH 方式用 tar 解包回根目录,再 uci import 导入文本配置:
tar -xzvf /tmp/backup-20260813.tar.gz -C /
uci import -c /etc/config < /tmp/uci-backup.conf
恢复完重启路由器让配置全面生效。注意:恢复会覆盖当前配置,别拿旧备份覆盖刚调好的新配置,恢复前确认时间点。
迁移到新设备:备份文件可以直接拿到另一台 OpenWrt 上用同样方式恢复,但有三个坑:
- 插件要先装:备份里没有插件程序,新设备先
opkg install装齐插件,再恢复配置,否则配置引用了不存在的包,相关服务起不来; - 网卡名可能不同:第二篇说过 WAN/LAN 是固件定制时软件定义的,新设备的
eth0/eth1分工可能和旧设备相反,恢复后登录不上先查接口绑定(uci show network); - MAC 地址变了:静态租约、端口转发里按旧 MAC 绑定的设备条目会失效,恢复后记得在新设备上重新确认一遍。
我的迁移经验是:新设备先裸机跑通联网,再装插件,最后恢复配置,三步分开,哪步出问题都好定位。
固件升级
sysupgrade 与保留配置
sysupgrade 是 OpenWrt 官方的固件升级命令,LuCI 里「系统 → 备份/升级 → 刷写新固件」背后调的就是它。它的核心机制是:默认保留 /etc/config 配置,只替换系统本体——这是 OpenWrt 和很多家用路由器固件的关键区别,升级完你的网络配置、插件配置都还在。
sysupgrade 的几个关键参数(对照官方手册,我在测试机的 sysupgrade 脚本里逐条核对过):
| 参数 | 作用 |
|---|---|
| 无参数(默认) | 升级并保留配置 |
-n | 升级并清空配置(等于恢复出厂 + 升级) |
-b <文件> | 只创建备份,不做升级 |
-r <文件> | 只恢复备份,不做升级 |
-k | 升级时把已装软件包列表写进备份 |
升级步骤与失败回滚
升级流程(资料型整理,步骤对照 OpenWrt 官方文档):
- 备份配置(上一步的产出);
- 下载固件:到 OpenWrt 官方固件选择器按设备型号下载新版本固件,核对 SHA-256 校验值(下载页会给出,和固件放一起核对,防止下载损坏或被动过手脚);
- LuCI 升级:系统 → 备份/升级 → Flash new firmware image(刷写新固件),上传固件文件,勾选 Keep settings(保留设置),点刷写,等设备自动重启;
- SSH 升级:把固件传到
/tmp/,执行sysupgrade -v /tmp/固件文件名,同样保留配置; - 重启后登录 状态 → 总览,确认固件版本号变成新版本,各插件正常启动。
两个提醒。跨大版本升级要查插件兼容性:OpenWrt 23.05 起防火墙后端从 iptables 换成了 nftables,部分老插件没跟上,升级后可能出现服务起不来——升级前先看插件维护者的发布说明。别抱着"追新"心态升级:路由器讲究稳定优先,官方源里能升的小版本升级跟紧就行,大版本让子弹飞一阵。
失败回滚:升级失败最常见的情况是升级过程中断电、或者固件与硬件不匹配导致无法启动。处理路径:
- x86 小主机:插上 U 盘重新写盘(第二篇的写盘流程),系统盘重刷即可,配置从备份恢复;
- ARM 设备(N1/R2S 这类):看 bootloader 还在不在,多数能进恢复界面重刷,具体自救方法在第二篇「变砖自救」章节;
- 无论如何,有备份就不怕——这也是每次升级前备份的意义。
日志与排错
logread 与状态页
日志OpenWrt 的系统运行记录,用 logread 命令查看,存于内存、重启即清空,是排错的第一现场。 是 OpenWrt 排错的第一现场,查看它的命令是 logread,输出所有服务的运行记录。常用姿势:
logread # 看全部日志
logread | grep -i error # 过滤报错
logread -e openclash # 只看含 openclash 的日志
logread -f # 实时滚动,复现问题时开着它看
注意一个特性:OpenWrt 的日志存在内存里,重启即清空。所以"出问题 → 重启 → 忘了抓日志"是排错大忌,先 logread 抓证据再重启。图形界面对应的是 Status → System Log / Kernel Log(状态 → 系统日志 / 内核日志),前者看服务层,后者看内核层;每个代理插件还有自己的运行日志页(比如 OpenClash 的「运行日志」),插件自身的问题去那看更直接。
常见故障日志特征
抓日志的样子,测试机上执行 logread -e dnsmasq 看到的就是这样的行(示例输出):
root@OpenWrt:~# logread -e dnsmasq
Sun Aug 13 10:02:41 2026 daemon.err dnsmasq[1234]: failed to bind DHCP server socket: Address already in use
Sun Aug 13 10:02:41 2026 daemon.err dnsmasq[1234]: FAILED to start up
daemon.err 是级别(错误),dnsmasq[1234] 是进程,后面的英文是原因。一个完整的排错案例走一遍:升级 AdGuard Home 后全家解析失败 → logread -e dnsmasq 看到 Address already in use → netstat -tunlp | grep :53 发现 53 被 AdGuardHome 进程占着 → 进 AdGuard 后台把 DNS 监听改回 5353 → /etc/init.d/dnsmasq restart → 网页恢复。日志指路、命令定位、配置修正,三步就是一套完整的排错。
日志关键字和故障的对应关系,维护期最常用这张表:
| 日志特征 | 含义 | 处理 |
|---|---|---|
Address already in use | 端口被占用,服务起不来 | 查 53 等端口归属,关掉冲突服务或改端口 |
Failed to resolve host / connection timed out | DNS 解析失败 | 查上游 DNS 配置、DNS 链路(dnsmasq → AdGuard 等) |
TLS handshake failure / connection reset | 节点侧问题 | 换节点/换协议测试,多半不是路由器的锅 |
内核下载失败、无法连接 | 插件从 GitHub 下载组件被墙 | 换 CDN 下载源,或临时开别的插件拉完再关 |
| 提示依赖未安装但明明装了 | 插件加载时序问题 | 重启路由器,多数情况重启即好 |
dnsmasq 反复重启失败 | 53 被占 | 按「DNS 端口占用」排查 |
排错顺序建议固定成套路:先看服务状态(插件主界面/状态页,没运行就点开看)→ 再 logread 过滤关键词(按上表对号入座)→ 最后才动配置。大多数"莫名其妙坏了"的案例,日志里都写着答案,只是没看。
日常维护清单
定时更新与清理
软路由的维护节奏,我的习惯是每月一次例行更新,折腾前(装插件、改配置、升固件)随时备份。月度例行三步:
opkg update # 1. 刷新索引
opkg list-upgradable # 2. 看有哪些包可升级
opkg upgrade # 3. 全部升级(或挑着升)
不想手动刷索引的,可以把"刷新索引"这件事交给系统定时任务:LuCI 的 System → Scheduled Tasks(系统 → 计划任务)就是 crontab 界面,加一行 0 4 * * 1 opkg update >/dev/null 2>&1(每周一凌晨 4 点刷新软件源)。只建议自动刷新索引,不建议自动升级——升级软件包可能有依赖变动,让"手动确认"这道人肉关卡留着,反而省心。
代理插件这类活跃项目,新版本往往跟着上游内核走(内核升级、协议支持变化),插件自己的更新在各自的 GitHub Releases 页面看。更新前老规矩:先备份。清理方面:不用的插件直接 opkg remove,装的时候图新鲜、留着吃内存的插件是设备变慢的第一来源;/tmp 是内存盘,重启自动清空,不用手动管;日志存在内存里也无需清理。
监控与体检
体检看四个数,全部在 SSH 里一行搞定:
uptime # 运行时间 + 负载,负载长期接近核心数说明吃紧
free # 内存余量,跑着代理插件还长期不足就要减插件了
df -h # 存储占用,overlay 分区写满会出各种怪问题
logread | grep -i error # 有没有反复报错
状态 → 总览页能直观看到固件版本、内核版本、内存/存储占用、运行时间,和第三篇认识环境时是同一页,现在它是你的体检表。另外一件小事但很重要:检查系统时间——时区在第三篇配过(Asia/Shanghai),如果时间明显不准,证书校验、订阅更新都会莫名失败,状态页看到时间漂了先处理 NTP。
把上面内容收成一张月度例行表:
| 频率 | 动作 |
|---|---|
| 每次折腾前 | 备份配置(LuCI 导出或 SSH 打包) |
| 每月 | opkg update + 升级软件包,扫一眼插件日志 |
| 每月 | 状态页看负载/内存/存储/时间 |
| 每季度 | 检查固件大版本更新和插件兼容性,决定要不要升级 |
FAQ:插件与维护常见问题 15 条
1. opkg update 一直失败/超时怎么办?
先换国内镜像(清华/中科大/阿里云,见「换源」),再重试;还不行检查路由器本身能不能正常上外网,ping downloads.openwrt.org 不通就是网络问题,不是源的问题。
2. 换源后提示签名校验失败? 多数是镜像的版本目录没对上(固件 24.10.7 就必须用 24.10.7 的源),或镜像同步没完成。别关签名校验,换回官方源试一次能过,就能确认是镜像问题。
3. 装了插件,LuCI 里看不到入口?
先确认装的是 luci-app-xxx 而不是只有主程序 xxx;界面包装好后刷新浏览器页面;依赖没装全时界面入口可能不出现,看日志里有没有报错。
4. 两个科学上网插件能同时开吗? 不能。透明代理插件会互相覆盖防火墙规则、抢占 DNS,同时开的结果是两个都起不来(详见「插件冲突排查」)。
5. AdGuard Home 装完全家上不了网? 53 端口被 AdGuard 占了,dnsmasq 起不来。把 AdGuard 的 DNS 监听改成 5353,重启 dnsmasq 就好。
6. AdGuard Home 和 OpenClash 怎么共存?
AdGuard 监听 5353,OpenClash 覆写设置 → DNS 区把 127.0.0.1:5353 加为上游。链路:设备 → OpenClash → AdGuard → 公网 DNS。
7. 去广告把验证码/登录框拦了? 规则误杀,正常现象。把对应域名加进白名单,或者临时关掉去广告刷新页面。过滤规则没法覆盖所有网站,误杀时先怀疑它。
8. 电视上的广告能拦吗? 靠域名加载的广告(开屏、网页弹窗)能拦,DNS 级拦截在网络层生效,电视不用装任何东西;剪进视频的贴片广告拦不了。
9. 备份文件能直接恢复到另一台设备吗? 能,但新设备要先装相同插件再恢复配置,还要检查网卡名(WAN/LAN 分配可能不同)和 MAC 相关的静态租约。
10. 升级固件会丢配置吗? 默认不丢——sysupgrade 保留 /etc/config。但升级本身有风险,升级前务必先手动备份一份,别把"默认保留"当保险。
11. 升级失败变砖了怎么办? x86 重新写盘,ARM 走 bootloader 恢复界面,完整自救流程在第二篇「变砖自救」。
12. 日志文件在哪?会占空间吗?
logread 输出的是内存日志,重启即清空,不占磁盘;需要留档的话升级前导出一次。
13. 忘记 root 密码进不去 LuCI? 官方固件有 failsafe 模式可以重置密码,具体步骤在第二篇(这也是"备份 + 手册"都该留一份的原因)。
14. 插件更新会丢配置吗? 不会。插件配置存在 /etc/config 下,升级软件包不动配置目录;倒是恢复出厂、刷不带配置的固件才会清空。
15. 多久维护一次合适? 月度例行 + 折腾前备份(见「日常维护清单」)。路由器是 7×24 小时运行的设备,定期看一眼比出了问题再救省事得多。
系列收尾与参考来源
四篇到这里全部收官,串联起来就是一条从零到长期使用的完整路径:
| 篇 | 内容 | 状态 |
|---|---|---|
| 一 | 什么是软路由、硬件选购、需求判断 | ✅ 已发布 |
| 二 | 固件选择与刷机、写盘、变砖自救 | ✅ 已发布 |
| 三 | 首次配置与旁路由、主路由/旁路由模式、代理插件实测 | ✅ 已发布 |
| 四(本篇) | 插件与维护:opkg、换源、去广告、备份恢复、升级、日志 | ✅ 已发布 |
四篇已经全部发布,从选购到维护的完整路径就在这个系列里。插件深度教程随时可读:OpenClash、PassWall、PassWall 2、HomeProxy、Hello World。
本篇的资料来源:
- OpenWrt 官方文档:opkg 软件包管理器、sysupgrade 手册、固件选择器
- OpenWrt 官方固件:ImageBuilder 定制 OpenWrt 24.10.7(QEMU 虚拟机),正文 opkg 命令与软件源均为虚拟机实测输出
- LuCI 24.10 源码:
luci-app-package-manager的 zh_Hans 翻译文件——软件包页的「可用/已安装/更新」页签与「更新列表…」按钮标签 - 两支 YouTube 口播稿(软路由入门、去广告方法大全):去广告原理、插件冲突、官方源纯净度等观点框架来源,正文已按本文口径全部重写
- 本站系列前三篇:选购、刷机、配置与旁路由——默认参数、DNS 链路、网卡定义等细节出处
评论
本地 Worker 预览版,后续可切换到 Cloudflare D1。
正在加载评论...