Repository navigation
Releases
Mini-Router v0.5.0
新内容 / What's new(v0.4.1 → v0.5.0)
内置 NAT46 与受管 DNS64 / Built-in NAT46 and managed DNS64 (#169, #172)
- 新选项
proxy.nat46(默认关闭):内置的 SOCKS5 NAT46 转换器mr-nat46,只监听回环,支持 TCP CONNECT 和 UDP ASSOCIATE。proxy.extra_config里"每端口一个源 IPv6"的 SOCKS 出站访问 IPv4 字面量(如https://124.222.230.137/)时,由它按源地址(后缀或完整 IPv6 用户名)转成 NAT64 地址;源表热加载,不安全的目标地址会被拒绝。sing-box 1.14 不会为 IPv4 字面量合成 NAT64 地址,这一项用来替掉外部手工的nat46-socks。 proxy.nat46.dns64(默认关闭):独立的 unbound 实例(默认127.0.0.1:1153,服务mr-dns64),不碰系统的 unbound,proxy.extra_config里原有的 dns64 接线可以原样保留。需要/usr/sbin/unbound;固件镜像只带unbound-libs,要用的话先apk add unbound(缺少时校验会提示)。- DNS64 的上游始终跟随 WAN 的 DNS(#172),与 LAN 的
dns.upstream模式无关(manual / DoT / ISP 都一样):当前 WAN resolver 文件 → WAN 租约里的 DNS →dns.fallback→dns.servers,忽略回环和未指定地址。NAT46 的默认值只在使用时补上、不写进配置,所以老配置升级后不会出现config.unapplied。 - New
proxy.nat46(off by default): a built-in loopback-only SOCKS5 NAT46 converter (TCP CONNECT, UDP ASSOCIATE) that maps IPv4 literals to NAT64 addresses per source IPv6 (suffix or full address), with hot-reloaded source tables; it replaces the hand-runnat46-socks.proxy.nat46.dns64(off by default) runs a private unbound instance and leaves the system unbound alone; it needs/usr/sbin/unbound(the firmware image only shipsunbound-libs:apk add unbound). DNS64 upstreams always follow the WAN DNS regardless of the LANdns.upstreammode; NAT46 defaults are applied at use time and never written into the config.
运营商 DNS 屏蔽绕过 / ISP DNS unblock (#171, #173)
- 新选项
dns.unblock(默认关闭):sing-box 1.14+ 的 helpermr-dns-unblock(127.0.0.2:53)检查运营商(或手动指定)DNS 的应答;遇到屏蔽页地址、私网黑洞、A / AAAA / HTTPS 空应答时,改用 Cloudflare、Google、Quad9 或自定义的可信解析器重试,正常应答保持运营商的结果。dnsmasq 读/run/mini-router/resolv-lan.conf:helper 健康时指向 helper,不健康时回落到运营商解析器。mr-mon约每 5 秒探测一次、连续两次结果一致才切换,helper 停止、挂死或重启后约 10 秒恢复,不需要重启 dnsmasq。 - 需要 sing-box ≥ 1.14.0:固件镜像自带;Alpine 官方仓库目前仍是 1.13.x,需要自己装 1.14+ 到
/usr/bin/sing-box。版本不够时校验和服务启动检查会明确报错,不会让旧版本接管 DNS。 - 新命令
mr dns unblock detect [--json] [域名 …](#173):只读检测。把当前每个运营商解析器同可信解析器和1.1.1.1:53对比,找出重复出现的屏蔽页地址、私网黑洞、空应答以及 UDP/53 劫持,给出延迟和建议。面板 DNS 页有「检测」按钮和「按检测结果填表」,只填表单,应用仍走 plan / apply / confirm;API 为dns.unblock.detect(token 作用域operate)。 - New
dns.unblock(off by default): a supervised sing-box 1.14+ helper retries block-page / private-sinkhole / empty answers through a trusted resolver and falls back to the ISP resolvers automatically when it is unhealthy (recovery in about 10 s, dnsmasq is not restarted).mr dns unblock detectis a read-only diagnosis (block-page addresses, sinkholes, empty answers, UDP/53 interception) with a panel button that only fills the form.
PPPoE:公网地址保护 / require_public_ip (#175)
wan[].require_public_ip不再放弃:前四次按require_public_ip_gap(默认 180 秒)间隔重拨,之后间隔翻倍、上限 15 分钟(配置的间隔大于 15 分钟则保持),直到拿到公网地址或关闭该选项。只重拨拿到私网地址的那条线,已有公网地址的线不会被碰;状态记在/run/mini-router/require-public-ip.json(重启后重新计,拿到公网地址后清除)。原来的"重拨已停止"风险状态没有了。- 拿到私网 / CGNAT 地址(RFC1918、100.64/10、169.254/16)的
require_public_ipPPPoE 线会被摘出路由,按 down 处理(不需要开multiwan):它的 WAN 表去掉默认路由、main 表 metric 抬高,负载均衡和 DNS 排序跳过它。policy_routes里fallback: main(默认)的规则立即回落到主路由(ppp-up 钩子马上处理,每分钟一次的mr wan public-check --cron兜底,最坏一分钟),拿到公网地址后自动回到原 WAN;fallback: drop不变,仍然断开。 mr doctor和 WAN 页:原来的 RISK 变成 WARN,例如has 100.64.x.y (cgnat); waiting for the ISP to release a session slot (…): redial 5 done, next in 6 min;快速重拨阶段结束时记一条警告事件。wan[].require_public_ipnow redials forever with backoff (180 s × 4, then doubling up to 15 min) instead of giving up; only the line holding a private/CGNAT address is redialed. While it holds one, that line is treated as down: its default route is removed, balance and DNS ordering skip it, andpolicy_routeswithfallback: mainuse the main route until a public address arrives (fallback: dropis unchanged).mr doctorshows a WARN with the redial countdown instead of the old "stopped" RISK.
PPPoE:停止时必发 PADT / PPPoE always sends its PADT (#177)
- 停止 PPPoE 服务(包括
reboot)时,pppd 以lcp-max-terminate 1启动:收到 SIGTERM 后发一次 LCP Terminate-Request,运营商一应答就发 PADT,不应答则 3 秒后(lcp-restart)发出;mr-pppoe加上retry="SIGTERM/10",supervise-daemon 会等 pppd 退出,不再 5 秒后就宣布服务已停。运营商应答慢或不应答时,以前重启会丢掉 PADT,运营商继续把旧会话算进并发上限。 - Stopping PPPoE (including a reboot) now always gets the PADT out: one LCP Terminate-Request, PADT as soon as the ISP answers or after 3 s, and the service waits for pppd instead of giving up after 5 s.
dnsmasq 只监听 LAN 网桥和回环 / dnsmasq listen scope (#179)
- 主 dnsmasq、
mr-proxy-dns、mr-parental-dns现在只监听 LAN 网桥、127.0.0.1和::1(渲染出except-interface=lo、bind-dynamic、listen-address=127.0.0.1、listen-address=::1),不再监听lo上的每一个地址。原因:附加组件在lo上挂了几百个/128源地址时,三个实例都会撞到 1024 个文件描述符的上限,DNS 全断。DHCP、RDNSS、dns.redirect、代理 / 家长控制的 nft 重定向、/etc/resolv.conf(127.0.0.1)都不变。 - The main dnsmasq,
mr-proxy-dnsandmr-parental-dnsnow listen on the LAN bridges plus 127.0.0.1 / ::1 only, not on every address oflo(hundreds of/128onlocould exhaust the 1024-descriptor limit and take DNS down). Nothing else changes.
文档 / Docs (#180)
- 说明 LAN 下游路由器 / 虚拟化网段如何用标准 NDP / RA 中继(odhcpd relay 模式)共享上游委派的单个
/64、拿到公网 IPv6,以及路由器端需要和不需要做什么;注意点:被中继的流量都带中继的 MAC(按 MAC 的功能会把它们当成一台设备)、非 PD 线路上的nat6策略会对被中继的主机做 NPT、下游网桥上其它路由器接受 RA 时需要 RA guard。无代码改动。 - How hosts behind a downstream NDP/RA relay share the delegated /64 (net.md); docs only.
升级说明 / Upgrade notes
-
新功能默认全部关闭:
proxy.nat46、proxy.nat46.dns64、dns.unblock不打开时不会多出任何服务、文件或进程;require_public_ip没打开的线路行为不变。
All new features are off by default: with them off there are no new services, files or processes. -
mr plan会有一处差异(不是空):dnsmasq 的监听行。升级后mr plan只会显示/etc/dnsmasq.conf多了except-interface=lo和listen-address=::1(listen-address=127.0.0.1已存在则不重复);开了代理 DNS / 家长控制的配置,还会看到gen/proxy-dns.conf、gen/parental-dns.conf同样的改动。其余生成文件与 v0.4.1 逐字节相同。mr apply时 dnsmasq(以及这两个 DNS 服务)会重启一次,LAN 的 DNS 会短暂中断;建议在可以接受的时间mr apply --confirm 120。
mr planis not empty after the upgrade: it shows the new dnsmasq listen lines (and the same lines inproxy-dns.conf/parental-dns.confwhen those are enabled). Applying restarts dnsmasq once, so LAN DNS blips briefly; every other generated file is byte-identical to v0.4.1. -
require_public_ip的mr doctor文案变了:原来的 RISKautomatic public-IP redial stopped after repeated private addresses不再出现;拿到私网 / CGNAT 地址时现在是 WARNwaiting for the ISP to release a session slot … redial N done, next in M min,并且那条线会被摘出路由。如果你的监控或脚本在匹配旧的文案或 RISK 等级,请改一下。
Themr doctorwording forrequire_public_ipchanged (RISK "stopped" → WARN "waiting for the ISP …, next in M min"); adjust any monitoring that matches the old text. A line holding a private address is now also held out of routing. -
固件镜像的软件包:基础包是更新的 Alpine 3.24.3 快照(v0.4.1 是 3.24.2:curl 8.23、musl 1.2.6-r3 等),内核、sing-box、tailscaled、dstatus-agent 不变。
The firmware image is rebuilt on a newer Alpine 3.24.3 package snapshot; kernel, sing-box, tailscaled and dstatus-agent are unchanged. -
Redmi AX6000:
/usr/libexec/mr/sysupgrade -T --sha256 <SHA256SUMS 里的值> /tmp/mini-router-ax6000-v0.5.0-sysupgrade.tar setsid /usr/libexec/mr/sysupgrade -y --sha256 <同上> /tmp/mini-router-ax6000-v0.5.0-sysupgrade.tar > /tmp/su.log 2>&1 &
约 2 分钟后回来,设置保留。Back in about 2 minutes with settings kept.
-
Alpine:把
mr-linux-<架构>装成/usr/sbin/mr、mini-router-rootfs.tar.gz解到/(不要重跑整个 install.sh),然后mr plan、mr apply --confirm 120;见 docs/install-alpine.md。
Alpine: replace/usr/sbin/mr, unpack the rootfs tarball over/(do not re-run the installer), thenmr planandmr apply --confirm 120.
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://github.com/Cd1s/mini-router/releases/download/v0.5.0/install.sh && MR_VERSION=v0.5.0 sh install.sh
(预发布期间要写MR_VERSION=v0.5.0,否则 install.sh 下载的是 latest 那一版 / while this is a pre-release,MR_VERSION=v0.5.0is required)。
见 docs/install-alpine.md。 - Redmi AX6000(hanwckf 110M U-Boot 布局):
mini-router-ax6000-v0.5.0-sysupgrade.tar(刷机 / 升级)、-initramfs.cpio.xz、-kexec.tar.gz(从 OpenWrt 里先在内存试运行:Image、dtb、devmem、kexec-test.sh、initramfs)。见 docs/flash.md。镜像带 tailscaled 和 dstatus-agent(同 v0.4.0)。
文件 / Assets
SHA256SUMS 列出每个文件的校验值。
Mini-Router v0.4.1
新内容 / What's new(v0.4.0 → v0.4.1)
IPv6 SLAAC 中继 / IPv6 relay for lines without PD (#160)
- 新选项
wan[].ipv6_relay(默认关闭,需要ipv6: true和lan.ipv6_ra: true):上游只给一个 SLAAC/64、没有 DHCPv6-PD 时,把这个/64通告到 LAN,LAN 设备直接用运营商的全局地址(不是 NAT66)。有 PD 时自动让位给 PD。 - 路由器按 LAN 邻居逐个代理地址:每分钟的 cron 先在 WAN 上探测(有人应答 = 上游占用,永不代理),结论记在
/run,钩子、apply、cron 都按同一份结论行事,只代理确认空闲的地址;最多 64 个,不加常驻进程。入站仍默认拒绝,开放端口照旧用firewall.ipv6_allow。 - 设备要先发一次 IPv6 流量才会被发现,之后约一到两分钟可达;LAN 设备不能直接访问上游同一
/64里的其它主机(互联网和其它网段不受影响)。目前在 router.yaml 或 API 里打开,网页暂无开关。 - New
wan[].ipv6_relay(off by default): relay an upstream SLAAC /64 to the LAN when there is no PD. LAN hosts are proxied one by one, only after a per-minute probe on the WAN found the address free (verdicts shared in /run); PD takes priority; inbound stays default-deny. Limitation: LAN hosts cannot reach upstream hosts inside the relayed /64.
首次向导:WiFi 国家码 / Wizard: WiFi country (#166)
- 有无线网卡时,首次向导要求选择 WiFi 国家码,按浏览器语言或时区给出建议并要求确认;国家码决定 5 GHz 可用信道和发射规则。
mr doctor在配置了射频却没设国家码时给出 warn(wifi.country),WiFi 页面也会提示。- The first-run wizard asks for the WiFi country (suggested from the browser language or time zone, confirmed by the user);
mr doctorwarns when radios are configured without a country.
实验室与文档 / Lab and docs (#163, #165)
tools/lab新场景 09:首次设置向导端到端(延迟安装、WAN 探测 PPPoE / DHCP / LAN 冲突、向导应用并确认、已安装的路由器不进向导);场景 08 覆盖 IPv6 中继。- README、install-alpine.md、flash.md 和 agent skill 跟上 v0.4:向导、WAN 探测、换环境、
require_public_ip、ipv6_relay、全新环境实验室,以及两种平台的升级步骤。 - Lab scenario 09 (first-run wizard end to end) and 08 (IPv6 relay); README, install and flash docs and the agent skill updated for v0.4, including upgrade steps.
升级说明 / Upgrade notes
-
ipv6_relay默认关闭,老配置不受影响:不打开时生成的所有文件与 v0.4.0 逐字节相同,mr plan应该没有差异(示例配置实测如此)。
ipv6_relayis off by default: with it off every generated file is byte-identical to v0.4.0, somr planshould show no changes. -
WiFi 国家码:已有配置留空国家码仍然有效、照常工作,只是
mr doctor多一条 warn;建议在 WiFi 页设上(之后mr plan、mr apply --confirm 120)。向导只在新装 / 恢复出厂后出现,升级不会弹出。
An existing config with no WiFi country still validates and works;mr doctornow warns about it. Set it on the WiFi page. Upgrades never start the wizard. -
Redmi AX6000:
/usr/libexec/mr/sysupgrade -T --sha256 <SHA256SUMS 里的值> /tmp/mini-router-ax6000-v0.4.1-sysupgrade.tar setsid /usr/libexec/mr/sysupgrade -y --sha256 <同上> /tmp/mini-router-ax6000-v0.4.1-sysupgrade.tar > /tmp/su.log 2>&1 &
约 2 分钟后回来,设置保留。Back in about 2 minutes with settings kept.
-
Alpine:把
mr-linux-<架构>装成/usr/sbin/mr、mini-router-rootfs.tar.gz解到/(不要重跑整个 install.sh),然后mr plan、mr apply --confirm 120;见 docs/install-alpine.md。
Alpine: replace/usr/sbin/mr, unpack the rootfs tarball over/(do not re-run the installer), thenmr planandmr apply --confirm 120.
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://github.com/Cd1s/mini-router/releases/download/v0.4.1/install.sh && MR_VERSION=v0.4.1 sh install.sh
(预发布期间要写MR_VERSION=v0.4.1,否则 install.sh 下载的是 latest 那一版 / while this is a pre-release,MR_VERSION=v0.4.1is required)。
见 docs/install-alpine.md。 - Redmi AX6000(hanwckf 110M U-Boot 布局):
mini-router-ax6000-v0.4.1-sysupgrade.tar(刷机 / 升级)、-initramfs.cpio.xz、-kexec.tar.gz(从 OpenWrt 里先在内存试运行:Image、dtb、devmem、kexec-test.sh、initramfs)。见 docs/flash.md。镜像带 tailscaled 和 dstatus-agent(同 v0.4.0)。
文件 / Assets
SHA256SUMS 列出每个文件的校验值。
Mini-Router v0.4.0
新内容 / What's new
首次设置向导 / First-run setup wizard (#139, #157)
- 新装好的路由器第一次登录后进入向导:管理员密码、时区、WAN 探测、上游与 LAN 网段冲突检查、WiFi,最后在确认窗口里应用(不保留就自动回滚)。
mr wan detect:用独立的 PPPoE discovery 和一次性 DHCP DISCOVER 探测上游(只等 OFFER,不写租约、不装路由),报告 AC / 服务名、地址 / 网关 / DNS、链路速率。- A wizard after the first login on a new router: password, time zone, WAN detection, upstream/LAN conflict check, WiFi, applied inside a confirm window.
mr wan detectprobes PPPoE and DHCP without taking a lease or installing routes.
换环境 / 搬家更稳 / Moving house, changing ISPs (#138, #141, #134, #158)
- 光猫和路由器 LAN 同网段(例如光猫 192.168.1.254、LAN 192.168.1.0/24):网关落在 LAN 网段时装
<网关>/32 dev wan,只对网关做 proxy ARP 并 masquerade,上网、DNS、光猫管理页都能用;mr doctor提示网段冲突和改法。wan[].modem让 PPPoE 线路也能访问光猫管理地址。 - 换 WAN 协议(PPPoE ↔ DHCP ↔ 静态)后清理旧状态:迟到的 ip-down 被忽略,旧 IPv6 前缀在确认后退役,只删 mr 自己建的 VLAN,取消
wan[].mac后恢复网卡原厂 MAC。 - 回滚会停掉被删除 WAN 的服务;首次启动遇到被拒的配置能恢复;多 WAN 的 apply / 恢复备份回滚更稳(改过的 PPPoE 仍会回滚,没改的备用线路不受影响,一个有上限的校验时限,恢复中的列表快照断电后仍在)。
- Upstream on the LAN's own subnet keeps internet, DNS and the modem page working (gateway /32 route, gateway-only proxy ARP, masquerade); WAN protocol switches leave no stale state; rollback and multi-WAN restore are hardened.
运营商 DNS 与 IPv6 / ISP DNS and IPv6 (#138, #150, #158)
- dnsmasq 的上游 DNS 合并 PPPoE peerdns、DHCP option 6、DHCPv6,按健康状态排序;
dns.fallback在都不可用时兜底。 - DHCPv6 回复按 WAN 接口放行(链路本地目的地址、源端口 547),不再因运营商用了不规范的源地址被丢。
- IPv6 默认路由跟随多线路健康状态;同一 WAN 的委派前缀按网络分给多个 LAN 网络(每个网络固定的 SLA ID)。
- Upstream DNS from every ISP source, health-ordered, with
dns.fallback; DHCPv6 replies accepted by WAN interface (odd source addresses); IPv6 default routes follow multi-WAN health; a delegated prefix is split across LAN networks.
PPPoE 公网地址保护 / Public IPv4 guard (#150, #157)
wan[].require_public_ip: true:PPPoE 拿到私网 / CGNAT(RFC1918、100.64.0.0/10、169.254.0.0/16)地址时只重拨这一条线,冷却require_public_ip_gap(默认 180 秒),连续 5 次后停止并记一条 risk 事件,mr doctor也显示为 risk。复查由 crond 每分钟一次,不加常驻进程。mr doctor能认出"线路换成了 DHCP"(节流的 DHCP 探测),不再只说"没有 IPv4 地址"。- Redial a PPPoE line that got a private/CGNAT address, with a cooldown and a stop after 5 tries (risk event, shown by doctor); doctor names a line that switched to DHCP.
改 LAN 网段不失联 / Changing the LAN subnet (#153)
- 在网页上改
lan.ipv4时,配置里落在旧网段的地址(DHCP 固定分配、端口转发目标等)一起平移到新网段,旧网桥地址被清掉,有线 LAN 口短暂 down/up 让电脑续租;网页拿到一次性令牌,在新地址上确认(120 秒内只接受 LAN 来源一次)。 - Renumbering the LAN in the web UI shifts the config's addresses in the old subnet, removes old bridge addresses, lets wired clients renew and confirms on the new address with a one-time token.
网页补齐 / Web UI (#132, #136, #154)
- 系统、防火墙、代理:watchcat、Tailscale 出口节点 / 子网路由 / 登录、HTTPS 反向代理、LED、guard、按设备在家 / 离家生效的规则、按设备走代理。
- WiFi 按硬件建议生成(
wifi.defaults)、DNS 列表文件编辑、按设备的 DHCP 租约。 - WAN 与多线路:拨号顺序与重拨、删除时清理引用、IPv6 开关、多拨 MAC、光猫访问、公网 IPv4 保护、策略路由域名列表。
- System / firewall / proxy controls, WiFi defaults, DNS list editor, per-device leases, and the remaining WAN and multi-WAN settings.
Alpine 安装 / install.sh (#143, #147, #148)
- 修复:没有 WiFi 的机器(虚拟机、多数 x86 小主机)上
install.sh第 5 步总是回滚(不再重启配置没启用的mr-hostapd)。 - 修复:全新机器上第一次应用时
/run/mini-router还不存在导致回滚。 - 选 PPPoE 时先检查内核能否加载
pppoe(Alpine 的linux-virt内核没有),不能就立刻给出办法(apk add linux-lts后重启),不再等 90 秒后回滚;mr-pppoe和mr doctor也写明原因。 - Fixes:
install.shno longer rolls back on WiFi-less machines or on the first apply of a fresh machine; PPPoE checks the kernel first (Alpine'slinux-virthas no PPPoE) and says what to do.
全新环境实验室 / Fresh-environment lab (#149, #155)
tools/lab/:在全新 Alpine 虚拟机里跑真实的install.sh,模拟运营商(DHCP、PPPoE、DHCPv6-PD、CGNAT、光猫同网段)和局域网电脑,场景 01–07 输出 TAP。实验室 ID 主机级加锁,多个目录 / agent 同时用不会互相拆台。只在构建机上运行,不进 GitHub Actions。tools/lab/: realinstall.shon fresh Alpine VMs with simulated ISPs and a LAN client, scenarios 01–07, host-wide lab id locks.
- 不开 IPv6 的 WAN 不再接收 RA;删除 WAN 或它的 IPv6 时一并删除引用它的设置。经 LAN 上网关的静态路由会 masquerade 去往目标的 LAN 流量。
升级说明 / Upgrade notes
-
不会弹向导:向导标记只在全新 / 擦除后的 rootfs_data(AX6000)或
MR_APPLY=0的安装里创建;老用户升级不会出现向导。
Existing installs never see the wizard: its marker is only created on a new or wiped config partition, or by anMR_APPLY=0install. -
面板监听所有地址:
/etc/conf.d/mr-panel变成PANEL_ADDR=0.0.0.0(改 LAN 网段时新旧地址都能连),防火墙的 input 链只放行 LAN 网桥和 Tailscale、丢弃 WAN 进来的连接;mr-panel 在防火墙之后启动,nftables 表不在时退回只监听 LAN 地址。
The panel listens on all addresses, protected by mr-firewall, whose input chain accepts only the LAN bridges and Tailscale (it starts after the firewall and falls back to the LAN address without it). -
防火墙 / dhcpcd:DHCPv6 客户端的入站规则改为按 WAN 接口放行;多个 LAN 网络时委派前缀也分给其它网络(主 LAN 的前缀不变)。升级后第一次
mr apply会重载防火墙、重启 mr-panel,network.sh原地重跑一次;先用mr plan看清楚。
The DHCPv6-client firewall rule now matches by WAN interface; extra LAN networks also receive delegated prefixes (the main LAN's stays). The first apply after the update reloads the firewall and restarts mr-panel; check withmr planfirst. -
Redmi AX6000:
/usr/libexec/mr/sysupgrade -T --sha256 <SHA256SUMS 里的值> /tmp/mini-router-ax6000-v0.4.0-sysupgrade.tar setsid /usr/libexec/mr/sysupgrade -y --sha256 <同上> /tmp/mini-router-ax6000-v0.4.0-sysupgrade.tar > /tmp/su.log 2>&1 &
约 2 分钟后回来,设置保留;新镜像第一次启动时删掉 overlay 里镜像自带程序的旧副本(手工替换过的
/usr/sbin/mr、/www文件等),让新版本生效。
Back in about 2 minutes with settings kept; the first boot drops overlay copies of the image's own programs (e.g. a hand-replaced/usr/sbin/mr). -
Alpine:
apk add ethtool(新依赖),把mr-linux-<架构>装成/usr/sbin/mr、mini-router-rootfs.tar.gz解到/(同install.sh第 2 步,不要重跑整个 install.sh——它会重新生成 router.yaml),然后mr plan、mr apply --confirm 120。
Alpine:apk add ethtool(new dependency), replace/usr/sbin/mrand unpack the rootfs tarball over/(install.sh step 2 — do not re-run the whole installer, it regenerates router.yaml), thenmr planandmr apply --confirm 120.
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://github.com/Cd1s/mini-router/releases/download/v0.4.0/install.sh && MR_VERSION=v0.4.0 sh install.sh
(预发布期间要写MR_VERSION=v0.4.0,否则 install.sh 下载的是 latest 那一版 / while this is a pre-release,MR_VERSION=v0.4.0is required)。
单网口设备、旁路由、MR_APPLY=0:见 docs/install-alpine.md。 - Redmi AX6000(hanwckf 110M U-Boot 布局):
mini-router-ax6000-v0.4.0-sysupgrade.tar(刷机 / 升级)、-initramfs.cpio.xz、-kexec.tar.gz(从 OpenWrt 里先在内存试运行:Image、dtb、devmem、kexec-test.sh、initramfs)。见 docs/flash.md。镜像带 tailscaled 和 dstatus-agent(同 v0.3.2)。
文件 / Assets
SHA256SUMS 列出每个文件的校验值。
Mini-Router v0.3.2
新内容 / What's new
代理:自带 sing-box 配置 / Proxy: proxy.extra_config
proxy.extra_config指向一个你自己写的 sing-box JSON 片段,mr 渲染时合并进同一个 mr-proxy 实例:inbounds/outbounds/endpoints/dns.servers追加,route.rules/dns.rules放最前面(按 inbound 匹配的规则先于透明代理规则)。tag 冲突、未知顶层键、坏 JSON 都是校验错误;合并后的整份配置必须通过sing-box check才会 apply;密钥不会出现在 plan / status / API 里。可用来在同一个 sing-box 里加 Shadowsocks 服务端入站等,不用再起第二个进程(#122)。- Merge a user-written sing-box fragment into the single mr-proxy instance (server inbounds, custom outbounds). Gated by
sing-box check; secrets never reach plan/status/API.
修复 / Fix
- nat6(NPTv6)转换过的 IPv6 流不再进 flowtable 快速路径:之前进了之后后续包发不到对端,IPv6 + QUIC 握手完不成。没有 nat6 策略时规则集不变(#124,第 1 步;内核侧根因仍待查)。
- NPTv6-translated flows stay out of the flowtable (their later packets never reached the far end; QUIC over IPv6 stalled).
安装 / Install
同 v0.3.1:Alpine 用 install.sh;Redmi AX6000 用 mini-router-ax6000-v0.3.2-sysupgrade.tar(刷机 / 升级)、-initramfs.cpio.xz、-kexec.tar.gz。见 docs/install-alpine.md、docs/flash.md。
Mini-Router v0.3.1
新内容 / What's new
多拨 / Multi-dial
- 单口多拨:同一网口上的第二条及以后的 PPPoE 设了自己的
mac,就跑在 macvlan(mv-<名字>,private 模式)上,每条会话一个 MAC。运营商的 BRAS 按 MAC 记会话,共用 MAC 时一条会话建立或结束会把另一条踢掉。mr wan mac NAME生成固定的本地管理地址;没设mac的照旧共用,由mr doctor提示;多口多拨时同一账号用同一 MAC 也会提示(#114)。 - 硬件加速:Linux 的 macvlan 没有
ndo_fill_forward_path,挂在上面的 PPPoE 原本只能软件转发;新的内核补丁让它上下行都进 PPE。AX6000 固件已带kmod-macvlan(#114)。 - 拨号顺序
multiwan.dial_order:PPPoE 按顺序拨号,后面的线等前面的线连上并拿到 IPv6 前缀再拨。顺序被打乱时(前面的线后来单独重拨,或它的前缀来得晚),dial_restore: now | HH:MM | off重拨后面的线。适用于运营商某些功能只认账号最后一次计费事件的情况,例如它自带的 DDNS(#109)。
把设备固定到一条线 / Pinning a device to a line
policy_routes[].nat6:设备的 IPv6 不论用哪个前缀当源地址都走via,别的前缀出去时换成via的前缀(NPTv6,接口 ID 不变)。在它后面再加一条{src: "::/0", via: <另一条线>, nat6: true},这条线就只给这台设备用,IPv4 和 IPv6 都是(#108)。- DDNS
ipv6: mac::对被固定到某条线的设备,发布该线前缀里的地址;设备平时不用这个地址时,保留已发布的那个(#108)。
改配置更安全 / Safer changes
- 修复:直接改 router.yaml 再
mr apply --confirm,超时没确认时回滚不完整,防火墙和 router.yaml 仍是新配置,重启后改动还会回来。现在会回滚到上次被接受的配置,被拒的改动另存为router.yaml.rejected(#115)。 mr -c 新文件.yaml apply:和网页一样,先快照在用的配置再装上新文件(#115)。
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://github.com/Cd1s/mini-router/releases/latest/download/install.sh && sh install.sh
(单网口设备、旁路由:见 docs/install-alpine.md) - Redmi AX6000(hanwckf 110M U-Boot 布局):
mini-router-ax6000-v0.3.1-sysupgrade.tar(刷机 / 升级)和
mini-router-ax6000-v0.3.1-initramfs.cpio.xz(先用 kexec 在内存里试运行)。首次安装见 docs/flash.md;
出厂地址http://192.168.31.1/,WiFi 默认关闭。镜像不含 tailscale 等附加程序。 mini-router-ax6000-v0.3.1-kexec.tar.gz:从 110M 布局的 OpenWrt 里先在内存试运行用(Image、dtb、devmem、kexec-test.sh、initramfs)。需要 OpenWrt 内核支持 kexec(有/sys/kernel/kexec_loaded)并装好 kexec 工具:cd /tmp && tar xzf mini-router-ax6000-v0.3.1-kexec.tar.gz && sh kexec-test.sh mini-router-ax6000-v0.3.1-initramfs.cpio.xz。
从 v0.3.0 升级 AX6000 / Upgrading from v0.3.0
/usr/libexec/mr/sysupgrade -T --sha256 <SHA256SUMS 里的值> /tmp/mini-router-ax6000-v0.3.1-sysupgrade.tar
setsid /usr/libexec/mr/sysupgrade -y --sha256 <同上> /tmp/mini-router-ax6000-v0.3.1-sysupgrade.tar > /tmp/su.log 2>&1 &约 2 分钟后回来,设置保留;mr plan 应该没有差异。
要用单口多拨:mr wan mac wan2 得到一个 MAC,写进 wan[1].mac(docs/modules/net.md),然后 mr -c new.yaml apply --confirm 120,检查后 mr confirm。那条线会用新 MAC 重拨一次,运营商可能分配新的 IP。
文件 / Assets
SHA256SUMS 列出每个文件的校验值。
Mini-Router v0.3.0
新内容 / What's new
改配置更安全 / Safer changes
- 每次改动都能预览(语义 diff)、有完整历史、可以回滚到任意一次;改动按风险分级,低风险自动确认,高风险必须手动确认(#59 #61)。
- 机器强制的底线(guard):SSH 只在局域网、管理通道不会被改没(#61)。
- 确认窗口内断电 / 重启会自动回滚;待确认期间不能再改;网页保存保留 router.yaml 的注释和格式(#50 #53 #54)。
- 升级后时钟不再倒退(没有 RTC 的设备,kexec 前保存时间);升级前正常结束 PPPoE、记为计划内重启;体检不再误报升级检查(#99 #103 #105)。
- 复查修复:应用配置时 SSH 断开不再停在半路;被中断的应用可以回滚;确认 / 回滚加锁;快照落盘且不重名;回滚保留网页密码;状态文件写入先 fsync(#96)。
网络 / Networking
- 按域名选线路(dnsmasq nftset → fwmark),硬件卸载不受影响;两条线路各有 IPv6 前缀时,IPv6 按来源前缀走对应线路(#62 #94)。
- PPPoE 1500 MTU(RFC 4638);运营商换 IPv6 前缀时(重启或重拨)主动通告旧前缀作废,按线路分别判断(RFC 9096)(#73 #75 #96 #102)。
- 两条线路各有前缀时,路由器自己发出的 IPv6 用对应线路的地址(#97)。
- 旁路由(只管代理 / 全部设备 / 指定设备)和纯 AP 模式(#85)。
- 默认关闭 ICMP 重定向,sysctl 加固,代理路径调优;常驻 Go 程序的内存软上限高于实际用量,不再让 GC 空转耗 CPU(#55 #57 #106);内核回移 MT7986 WDMA TX hang 修复(#58)。
服务 / Services(不新增常驻进程,除了反向代理本身)
- 内置 DDNS:Cloudflare、阿里云、DNSPod、DuckDNS、dyndns2、webhook(#71 #95);网络唤醒 WOL(#71)。
- HTTPS 反向代理 + 自动证书(Let's Encrypt,DNS-01),局域网内同一域名直接解析到路由器(A + AAAA)(#78 #98)。
- DNS:去广告(dnsmasq 列表)、DNS 主导权(Firefox 金丝雀、拦截 DoT / DoH)(#76 #79)。
- lucky 已移除:由内置 DDNS 和反向代理取代(#98)。
设备与可观测 / Devices and observability
- 设备清单与分组、暂停上网、上下线通知、设备详情;按设备限速、按月流量、家长控制(强制安全搜索)、按设备全局代理(IPv4 + IPv6)、tailscale exit node、在家 / 离家规则(#89 #95)。
mr doctor体检 + 一键修复 / 自动修复,事件日志与通知;异地备份(https / WebDAV / S3 / GitHub);升级前检查、更新提示、崩溃循环限制;watchcat、定时关 WiFi / LED、测速(#74 #77 #95)。- WiFi:组播转单播、802.11v 频段引导、射频健康与自愈(#88)。
界面与 API / Web UI and API
- router.yaml 原文编辑、全局搜索、英文界面(#87 #93);系统监控仪表(#4)。
- 给脚本 / agent 的 API:作用域 token、plan / patch + base_rev、
mr get / set、mr schema(#67);mr启动快 18 倍(#66)。
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://github.com/Cd1s/mini-router/releases/latest/download/install.sh && sh install.sh
(单网口设备、旁路由:见 docs/install-alpine.md) - Redmi AX6000(hanwckf 110M U-Boot 布局):
mini-router-ax6000-v0.3.0-sysupgrade.tar(刷机 / 升级)和
mini-router-ax6000-v0.3.0-initramfs.cpio.xz(先用 kexec 在内存里试运行)。首次安装见 docs/flash.md;
出厂地址http://192.168.31.1/,WiFi 默认关闭。镜像不含 tailscale 等附加程序。
从 v0.2.0 升级 AX6000 / Upgrading from v0.2.0
/usr/libexec/mr/sysupgrade -T --sha256 <SHA256SUMS 里的值> /tmp/mini-router-ax6000-v0.3.0-sysupgrade.tar
setsid /usr/libexec/mr/sysupgrade -y --sha256 <同上> /tmp/mini-router-ax6000-v0.3.0-sysupgrade.tar > /tmp/su.log 2>&1 &约 2 分钟后回来,设置保留。然后 mr plan:新版本的默认值(sysctl、RA 寿命 45 分钟、Firefox 金丝雀等)会显示为差异,
mr apply --confirm 120,检查后 mr confirm。
注意 / Breaking:配置里如果还有 services.lucky,新版本会拒绝并提示——删掉它,改用 services.ddns 和 services.edge
(docs/modules/sys.md)。
文件 / Assets
SHA256SUMS 列出每个文件的校验值。
Mini-Router v0.2.0
新内容 / What's new
网页界面 / Web UI
- 全新 Mini-Router Logo(侧栏、登录页、网页图标)。
- 手机端:抽屉菜单打开后可以关掉了(遮罩、✕、Esc、点任意链接都会收回;以前菜单盖住了 ☰ 按钮);触控区域更大。
- 侧栏分组可折叠(记住状态,当前页所在分组自动展开);浅色 / 深色 / 跟随系统 主题切换。
固件升级更可靠(Redmi AX6000)/ Reliable in-place upgrades
- 内核补丁:kexec 瞬间未完成的 SPI-NAND 操作留下的中断不再让新内核崩溃;升级前先关网口(停 DMA)、冻结进程、同步。
- 新镜像首次启动时,overlay 里被镜像替换的旧程序文件自动清理(设置保留),不会再“升级了但还在跑旧版本”。
- 安装程序 initramfs 带全套 busybox 命令(以前会卡住直到断电)、看门狗有上限、进度写入内核日志、
panic=5自动回旧系统。 - nandsim 自测覆盖升级 / 回滚 / 首次启动(
build/m3/selftest.sh,P1–P7)。
系统 / System
- 没有 RTC 的设备:NTP 同步后每小时保存一次时间,断电或崩溃后时钟不再倒退几个小时。
mr-bootlog:每次开机 2 分钟后保存一份状态快照到闪存(最近 5 次),方便排查。mr-zram开机竞态修复;dnsmasqquiet-ra,系统日志 1 MB + 1 份轮转;dnsmasq / dhcpcd 信号改用pidof。mr帮助列出所有模块命令(JSON 输出,便于脚本和 agent)。
AI agent
- 新增
skills/mini-router:给 Claude Code / Codex 等 agent 的操作手册(安全改动流程、router.yaml速查、诊断命令、禁止事项)。
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://github.com/Cd1s/mini-router/releases/latest/download/install.sh && sh install.sh - Redmi AX6000(hanwckf 110M U-Boot 布局):
mini-router-ax6000-v0.2.0-sysupgrade.tar(刷机 / 升级)和
mini-router-ax6000-v0.2.0-initramfs.cpio.xz(先用 kexec 在内存里试运行)。首次安装步骤见 docs/flash.md;
出厂地址http://192.168.31.1/,WiFi 默认关闭。镜像不含 tailscale / lucky 等附加程序。
从 v0.1.0 升级 AX6000
v0.1.0 自带的升级脚本有 bug(安装程序缺 busybox 命令,会卡住直到断电重启;闪存不会被改动)。升级前先换成新脚本:
B=https://raw.githubusercontent.com/Cd1s/mini-router/v0.2.0/rootfs
wget -O /tmp/sysupgrade $B/usr/libexec/mr/sysupgrade && wget -O /tmp/mr-preinit $B/sbin/mr-preinit &&
install -m 0755 /tmp/sysupgrade /usr/libexec/mr/sysupgrade && install -m 0755 /tmp/mr-preinit /sbin/mr-preinit
/usr/libexec/mr/sysupgrade -T --sha256 <SHA256SUMS 里的值> /tmp/mini-router-ax6000-v0.2.0-sysupgrade.tar
setsid /usr/libexec/mr/sysupgrade -y --sha256 <同上> /tmp/mini-router-ax6000-v0.2.0-sysupgrade.tar > /tmp/su.log 2>&1 &约 2 分钟后回来,设置保留;之后运行 mr plan,有差异就 mr apply --confirm 120 + mr confirm。
文件 / Assets
mr-linux-<arch>(静态路由器工具)、mini-router-rootfs.tar.gz(服务、钩子、网页界面)、install.sh、AX6000 镜像、SHA256SUMS。
AX6000 镜像包含 Linux 内核(GPL-2.0,OpenWrt 构建,补丁见 build/m3/patches)与 sing-box 1.14.1(GPL-3.0,https://github.com/SagerNet/sing-box)。
mini-router v0.1.0
第一个公开版本 / first public release.
安装 / Install
- 任意架构的 Alpine Linux(x86_64 / arm64 / armv7 / armv6 / x86 / riscv64 / ppc64le):
wget -O install.sh https://raw.githubusercontent.com/Cd1s/mini-router/main/install.sh && sh install.sh - Redmi AX6000(hanwckf 110M u-boot 布局):
mini-router-ax6000-v0.1.0-sysupgrade.tar(刷机)与
mini-router-ax6000-v0.1.0-initramfs.cpio.xz(先用 kexec 在内存里试运行)。步骤见 docs/flash.md。
出厂地址 http://192.168.31.1/,WiFi 默认关闭。镜像不含 tailscale / lucky 等附加程序(可用 apk 安装)。
Assets: mr-linux-<arch> (static router tool), mini-router-rootfs.tar.gz (services + web UI),
install.sh, AX6000 image, SHA256SUMS. The AX6000 image contains sing-box 1.14.1 (GPL-3.0,
https://github.com/SagerNet/sing-box) and hostapd 2.11 with OpenWrt's noscan patch.