Skip to content

Releases

Mini-Router v0.5.0

Choose a tag to compare

@Cd1s Cd1s released this 31 Oct 06:15
1c5a027

Mini-Router

新内容 / 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-run nat46-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 ships unbound-libs: apk add unbound). DNS64 upstreams always follow the WAN DNS regardless of the LAN dns.upstream mode; 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+ 的 helper mr-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 detect is 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_ip PPPoE 线会被摘出路由,按 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_ip now 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, and policy_routes with fallback: main use the main route until a public address arrives (fallback: drop is unchanged). mr doctor shows 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-dns and mr-parental-dns now listen on the LAN bridges plus 127.0.0.1 / ::1 only, not on every address of lo (hundreds of /128 on lo could 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 plan is not empty after the upgrade: it shows the new dnsmasq listen lines (and the same lines in proxy-dns.conf / parental-dns.conf when 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 文案变了:原来的 RISK automatic public-IP redial stopped after repeated private addresses 不再出现;拿到私网 / CGNAT 地址时现在是 WARN waiting for the ISP to release a session slot … redial N done, next in M min,并且那条线会被摘出路由。如果你的监控或脚本在匹配旧的文案或 RISK 等级,请改一下。
    The mr doctor wording for require_public_ip changed (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), then mr plan and mr 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.0 is 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

Choose a tag to compare

@Cd1s Cd1s released this 18 Oct 08:27
27f1509

Mini-Router

新内容 / 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 doctor warns 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_relay is off by default: with it off every generated file is byte-identical to v0.4.0, so mr plan should 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 doctor now 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), then mr plan and mr 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.1 is 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

Choose a tag to compare

@Cd1s Cd1s released this 18 Oct 06:01
0f37e7f

Mini-Router

新内容 / 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 detect probes 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.sh no longer rolls back on WiFi-less machines or on the first apply of a fresh machine; PPPoE checks the kernel first (Alpine's linux-virt has 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/: real install.sh on fresh Alpine VMs with simulated ISPs and a LAN client, scenarios 01–07, host-wide lab id locks.

其它 / Other (#128, #130)

  • 不开 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 an MR_APPLY=0 install.

  • 面板监听所有地址:/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 with mr plan first.

  • 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/mr and unpack the rootfs tarball over / (install.sh step 2 — do not re-run the whole installer, it regenerates router.yaml), then mr plan and mr 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.0 is 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

Choose a tag to compare

@Cd1s Cd1s released this 01 Oct 09:58
18d02a0

新内容 / 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

Choose a tag to compare

@Cd1s Cd1s released this 27 Sep 08:19
58c490c

Mini-Router

新内容 / 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

Choose a tag to compare

@Cd1s Cd1s released this 26 Sep 15:29
2ce7911

Mini-Router

新内容 / 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

Choose a tag to compare

@Cd1s Cd1s released this 25 Sep 12:41

Mini-Router

新内容 / 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 开机竞态修复;dnsmasq quiet-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

Choose a tag to compare

@Cd1s Cd1s released this 24 Sep 18:03

第一个公开版本 / 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.