Mac下给磊科N60Pro(2G RAM版)刷入ImmortalWrt系统

前言

最近入手了一台磊科 N60 Pro,硬件是 MT7986A、128MB NAND、2GB DDR4 的版本。原厂系统基础路由功能没有问题,但扩展能力有限,所以准备刷入 ImmortalWrt,再安装 iStore,用来按需补充插件。

这次刷机是在 Mac 下完成的,没有使用 Windows,也没有拆机接串口。完整流程包括:

  • 确认硬件和 MTD 分区;
  • 备份全部原厂 MTD 数据;
  • 校验 ImmortalWrt 官方镜像;
  • 在 macOS 上搭建临时 TFTP 服务;
  • 替换 FIP,也就是 BL31 + U-Boot;
  • 通过 TFTP 启动 initramfs 恢复系统;
  • 使用 sysupgrade 安装正式系统;
  • 验证 2GB 内存、overlay 和网络;
  • 安装 iStore;
  • 安装并启用 Argon 主题;
  • 安装 OpenClash 和 Mihomo 核心;
  • 在没有 IPv6-PD 的二级路由环境中配置 IPv6 Relay;
  • 清理 Mac 上的临时刷机环境。

最终结果是:ImmortalWrt 25.12.1 可以正确识别这台 2GB 版 N60 Pro 的全部内存,LuCI、WAN、NAND overlay 均正常。

最终运行状态如下:

本文是我在自己这台 N60 Pro 2GB 版上的实际操作记录。刷机始终存在变砖风险,不同批次硬件、分区布局和固件版本可能不同。不要跳过备份、哈希校验和 TFTP 自测,也不要直接套用别人机器的 Factory 分区。

硬件与软件环境

本次使用的环境:

项目 信息
路由器 磊科 Netcore N60 Pro
SoC MediaTek MT7986A,4 核 ARM Cortex-A53
内存 2GB DDR4
闪存 128MB SPI NAND
网口 2 个 2.5G + 3 个千兆口
USB USB 3.0
原厂内核 Linux 5.4.246
目标系统 ImmortalWrt 25.12.1
目标内核 Linux 6.12.94
操作电脑 macOS 27.0
有线接口 en7,不同 Mac 可能是 en5en6

刷机前原厂系统的 SSH 和 Telnet 都是开放的。原厂 SSH 用户名为 useradmin,密码与设备管理密码一致。本文不会记录真实密码,后面的命令都以交互输入密码为准。

先说结论和关键风险

这次刷机最重要的几个结论:

  1. ImmortalWrt 25.12.1 官方镜像可以在这台 2GB 版上识别约 1.94GiB 内存,不需要额外编译 2GB 专用固件。
  2. 首刷只替换 FIP,保留原厂 BL2Factory
  3. 不要刷下载目录中的 preloader.bin。它对应 BL2,写错后通常需要串口或编程器恢复。
  4. 新 U-Boot 没有 Web 恢复页面,恢复流程是由路由器主动从 192.168.1.254 的 TFTP 服务器下载 initramfs。
  5. 擦除 ubi 前必须先把 TFTP 环境准备好并在 Mac 本机完成下载测试。
  6. 原厂 Factory 通常包含无线校准、设备 MAC 等唯一数据,不能使用别人的备份替换。

建议全程使用有线连接,关闭 Mac 自动休眠。执行 mtd writemtd erasesysupgrade 时不要断电。

下载 ImmortalWrt 固件

使用 ImmortalWrt Firmware Selector:

ImmortalWrt Firmware Selector - Netcore N60 Pro 25.12.1

页面会提供四个文件:

immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-bl31-uboot.fip
immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb
immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-preloader.bin
immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-squashfs-sysupgrade.itb

本次只会使用:

  • bl31-uboot.fip:替换原厂 FIP;
  • initramfs-recovery.itb:通过 TFTP 临时启动;
  • squashfs-sysupgrade.itb:安装正式系统。

preloader.bin 不使用。

我的下载目录是:

/Users/VanJay/Downloads/ImmortalWrt-25.12.1

校验下载文件

先在 Mac 上计算 SHA-256:

shasum -a 256 /Users/VanJay/Downloads/ImmortalWrt-25.12.1/*

ImmortalWrt 25.12.1 对应的官方哈希为:

64c1a2def2ca957e17a1fca31c350eb6fa45f48328ead9ce86f8e5a13787654e  immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-bl31-uboot.fip
6b70a063e5699c73a891a759c04b1454be154cb716d599d51510af066134d504  immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb
33bc88b3f9fe8f7f5d6ce6ff167cde3c686c35ac23dea81fba837cfd896ceb6d  immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-preloader.bin
c8628275e344ec7a3482f13c8316187d3ba0eea05fa71192b9ef5577bafac0d1  immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-squashfs-sysupgrade.itb

哈希不一致时不要继续。重新下载,直到与官方发布页完全一致。

确认原厂系统和分区布局

先登录原厂系统:

ssh useradmin@路由器IP

检查系统和 MTD:

uname -a
cat /proc/mtd
free -h

我这台 2GB 版的原厂分区如下:

dev:    size   erasesize  name
mtd0: 08000000 00020000 "spi0.1"
mtd1: 00100000 00020000 "BL2"
mtd2: 00080000 00020000 "u-boot-env"
mtd3: 00200000 00020000 "Factory"
mtd4: 00200000 00020000 "FIP"
mtd5: 07280000 00020000 "ubi"

对应关系:

分区 大小 用途 是否允许在本流程写入
spi0.1 128MiB 整片 NAND 的 MTD 数据区
BL2 1MiB Preloader/早期引导
u-boot-env 512KiB 原厂 U-Boot 环境
Factory 2MiB MAC、无线校准等设备数据 绝对不要写
FIP 2MiB BL31 + U-Boot 是,仅写官方 FIP
ubi 114.5MiB 原厂系统和数据卷 会擦除

如果自己的 /proc/mtd 与此处不一致,应停止操作,重新确认硬件批次和适配情况。

备份原厂系统

收集系统信息

所有临时文件都写进 /tmp,不会向 NAND 增加额外写入:

mkdir -p /tmp/n60pro-backup
cd /tmp/n60pro-backup

cat /proc/mtd > proc-mtd.txt
uname -a > uname.txt
cat /proc/meminfo > meminfo.txt
cat /proc/cmdline > cmdline.txt
dmesg > dmesg.txt

备份全部 MTD 数据

使用只读设备节点备份:

dd if=/dev/mtd0ro of=mtd0_spi0.1.bin bs=128k
dd if=/dev/mtd1ro of=mtd1_BL2.bin bs=128k
dd if=/dev/mtd2ro of=mtd2_u-boot-env.bin bs=128k
dd if=/dev/mtd3ro of=mtd3_Factory.bin bs=128k
dd if=/dev/mtd4ro of=mtd4_FIP.bin bs=128k
dd if=/dev/mtd5ro of=mtd5_ubi.bin bs=128k

sync
sha256sum *.bin > SHA256SUMS
ls -lh
cat SHA256SUMS

预期文件大小:

mtd0_spi0.1.bin       128 MiB
mtd1_BL2.bin            1 MiB
mtd2_u-boot-env.bin    512 KiB
mtd3_Factory.bin         2 MiB
mtd4_FIP.bin             2 MiB
mtd5_ubi.bin          114.5 MiB

这里的 dd 备份是 MTD 数据区备份,不包含 NAND OOB/ECC 的取证级原始信息。对于本流程中的逻辑分区恢复已经很有价值;若系统额外提供 nanddump,也可以再做一份包含 OOB 的底层备份,但不要用不熟悉的参数直接恢复。

打包备份

cd /tmp
tar -czf n60pro-2g-original-backup.tar.gz n60pro-backup
sha256sum n60pro-2g-original-backup.tar.gz
ls -lh n60pro-2g-original-backup.tar.gz

注意:/tmp 是内存文件系统,重启就会丢失,必须立刻复制到 Mac。

从 Mac 拉回备份

新版本 macOS 的 scp 默认使用 SFTP,而原厂系统没有 /usr/libexec/sftp-server,直接执行可能报错:

ash: /usr/libexec/sftp-server: not found
scp: Connection closed

可以强制使用旧版 SCP 协议:

mkdir -p ~/Downloads/N60Pro-2G-Backup

scp -O useradmin@路由器IP:/tmp/n60pro-2g-original-backup.tar.gz \
  ~/Downloads/N60Pro-2G-Backup/

如果路由器连旧版 scp 服务端命令也没有,可以直接通过 SSH 标准输出传输二进制文件:

ssh -T useradmin@路由器IP \
  'cat /tmp/n60pro-2g-original-backup.tar.gz' \
  > ~/Downloads/N60Pro-2G-Backup/n60pro-2g-original-backup.tar.gz

在 Mac 上校验备份

cd ~/Downloads/N60Pro-2G-Backup

ls -lh n60pro-2g-original-backup.tar.gz
shasum -a 256 n60pro-2g-original-backup.tar.gz
tar -tzf n60pro-2g-original-backup.tar.gz

Mac 算出的归档哈希必须与路由器输出一致,tar -tzf 也必须能列出所有分区文件且不报错。

建议至少保存两份备份,分别放在不同磁盘或 NAS 上。尤其要保护好:

mtd1_BL2.bin
mtd2_u-boot-env.bin
mtd3_Factory.bin
mtd4_FIP.bin
mtd5_ubi.bin

理解 TFTP 恢复流程

替换 FIP 并擦除 ubi 后,路由器暂时没有可启动的正式系统。新 U-Boot 会主动执行 tftpboot,从另一台电脑下载 initramfs。

N60 Pro 的官方 U-Boot 默认网络参数是:

路由器/U-Boot IP:192.168.1.1
TFTP 服务器 IP:192.168.1.254
恢复文件名:immortalwrt-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb

因此 Mac 需要临时承担两个角色:

  1. 有线网卡增加 192.168.1.254/24 地址;
  2. 通过 macOS 自带的 tftpd 提供恢复镜像。

这不是把系统安装到 Mac,只是让路由器在没有系统时能取到一个临时启动镜像。

在 macOS 上准备 TFTP

确认有线接口名称

route -n get default
ifconfig

我的有线接口是 en7。后文的 en7 必须替换为自己实际使用的接口。

复制并重命名恢复镜像

U-Boot 要求的文件名没有版本号,所以不能直接保留下载文件原名:

FW=/Users/VanJay/Downloads/ImmortalWrt-25.12.1

sudo cp \
  "$FW/immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb" \
  /private/tftpboot/immortalwrt-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb

sudo chmod 644 \
  /private/tftpboot/immortalwrt-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb

为 Mac 增加临时地址

sudo ifconfig en7 alias 192.168.1.254 netmask 255.255.255.0

这是增加地址别名,不会删除 Mac 当前的地址。检查路由:

ifconfig en7 | grep '192.168.1.254'
route -n get 192.168.1.1 | grep interface

第二条应该显示:

interface: en7

启动 macOS 自带 TFTP 服务

sudo launchctl enable system/com.apple.tftpd
sudo launchctl bootstrap system /System/Library/LaunchDaemons/tftp.plist

如果第二条提示服务已经加载,可以忽略。

如果 macOS 防火墙已经开启,放行 tftpd

sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/libexec/tftpd
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/libexec/tftpd

必须先做本机 TFTP 测试

rm -f /tmp/n60pro-tftp-test.itb

tftp 127.0.0.1 <<'EOF'
binary
get immortalwrt-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb /tmp/n60pro-tftp-test.itb
quit
EOF

shasum -a 256 /tmp/n60pro-tftp-test.itb

必须能够完整接收 14680064 字节,并得到:

6b70a063e5699c73a891a759c04b1454be154cb716d599d51510af066134d504

如果本机测试不通过,绝对不要擦除路由器的 ubi

上传并刷入 FIP

上传 FIP 到原厂系统

仍然在 Mac 上执行:

FW=/Users/VanJay/Downloads/ImmortalWrt-25.12.1

ssh -T useradmin@路由器IP \
  'cat > /tmp/immortalwrt-bl31-uboot.fip' \
  < "$FW/immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-bl31-uboot.fip"

SSH 可能提示未使用 post-quantum key exchange,这只是原厂旧 SSH 服务的能力警告,不影响当前局域网传输。

在路由器上检查:

ls -l /tmp/immortalwrt-bl31-uboot.fip
sha256sum /tmp/immortalwrt-bl31-uboot.fip

预期:

大小:1105236 bytes
SHA-256:64c1a2def2ca957e17a1fca31c350eb6fa45f48328ead9ce86f8e5a13787654e

写入 FIP

再次确认原厂 FIP 备份还在:

ls -l /tmp/n60pro-backup/mtd4_FIP.bin

然后执行真正的写入:

mtd write /tmp/immortalwrt-bl31-uboot.fip FIP
sync

写完不要急着擦除 ubi,先从 MTD 回读相同长度并计算哈希:

dd if=/dev/mtd4ro of=/tmp/fip-readback.bin bs=1105236 count=1
sha256sum /tmp/fip-readback.bin

必须仍然得到:

64c1a2def2ca957e17a1fca31c350eb6fa45f48328ead9ce86f8e5a13787654e

如果哈希不一致,不要擦除 ubi,也不要重启。应立即停止并检查写入过程,必要时从当前仍在运行的原厂系统恢复原厂 FIP。

擦除原厂 ubi

只有 FIP 回读哈希一致才执行:

mtd erase ubi
sync

执行到这里,原厂系统已经被擦除。不要再随意断开 Mac 的 TFTP 服务。

通过 TFTP 启动 initramfs

可以在 Mac 的另一个终端监视 TFTP 请求:

sudo tcpdump -ni en7 'udp port 69'

然后:

  1. 拔掉路由器电源;
  2. 按住 RESET
  3. 重新插电,继续按住约 10 秒后松开;
  4. 保持网线连接原来的 LAN 口;
  5. 等待路由器从 192.168.1.254 下载约 14MB 的 initramfs;
  6. 再等待约 1 至 2 分钟启动临时系统。

如果 U-Boot 启动正常,tcpdump 会看到来自 192.168.1.1 的 TFTP 请求。

测试连接:

ping 192.168.1.1

能通后登录:

ssh-keygen -R 192.168.1.1
ssh root@192.168.1.1

initramfs 通常还没有 root 密码。

验证临时系统和 2GB 内存

先不要立即 sysupgrade,验证识别情况:

free -h
cat /proc/mtd
ubus call system board

本机实测结果:

Mem:        2030408 KB
model:      Netcore N60 Pro
board_name: netcore,n60-pro
rootfs_type: initramfs
version:    25.12.1
kernel:     6.12.94

也就是全部 2GB 内存已经识别,无需自行修改设备树或重新编译固件。

刷入新 U-Boot 后,MTD 名称和 ubi 大小会变成:

mtd0: 00100000 00020000 "bl2"
mtd1: 00080000 00020000 "u-boot-env"
mtd2: 00200000 00020000 "factory"
mtd3: 00200000 00020000 "fip"
mtd4: 07a80000 00020000 "ubi"

新的 U-Boot 将 NAND 尾部空间也纳入 ubi,所以这里的 ubi 比原厂系统显示得更大,这是适配设计的一部分。

安装正式 ImmortalWrt

上传 sysupgrade 镜像

Mac 执行:

FW=/Users/VanJay/Downloads/ImmortalWrt-25.12.1

ssh -T root@192.168.1.1 \
  'cat > /tmp/immortalwrt-sysupgrade.itb' \
  < "$FW/immortalwrt-25.12.1-mediatek-filogic-netcore_n60-pro-squashfs-sysupgrade.itb"

路由器中验证:

ls -l /tmp/immortalwrt-sysupgrade.itb
sha256sum /tmp/immortalwrt-sysupgrade.itb

必须是:

大小:18047252 bytes
SHA-256:c8628275e344ec7a3482f13c8316187d3ba0eea05fa71192b9ef5577bafac0d1

先做兼容性检查

sysupgrade -T /tmp/immortalwrt-sysupgrade.itb

如果出现镜像不兼容、校验失败或平台检查失败,停止操作。不要通过 -F 强制刷入。

正式写入

检查通过后执行:

sysupgrade -n /tmp/immortalwrt-sysupgrade.itb

-n 表示不保留 initramfs 临时配置。命令执行后 SSH 会断开,这是正常现象。

此时:

  • 不要断电;
  • 不要按 RESET;
  • 至少等待 5 分钟;
  • 暂时不要关闭 Mac 的 TFTP 服务,以便正式系统启动失败时仍可恢复。

验证正式系统

路由器默认地址仍是:

http://192.168.1.1/

重新登录前清理旧 SSH Host Key:

ping 192.168.1.1
ssh-keygen -R 192.168.1.1
ssh root@192.168.1.1

执行:

ubus call system board
free -h
df -h
mount | grep ' / '

本机正式系统的关键结果:

rootfs_type: squashfs
MemTotal:    2030412 KB
/overlay:    86.8M,总可用约 82.3M
根目录:      overlayfs:/overlay

df -h/dev/root/rom 显示 100% 是正常现象。它是只读 squashfs,不是磁盘写满;真正可写的数据位于 /overlay

立即设置管理密码:

passwd

检查 WAN 和 DNS

默认 WAN 使用 DHCP。将上级网络接入标有 WAN 的接口后检查:

ubus call network.interface.wan status
ping -c 3 1.1.1.1
nslookup github.com

正常状态应满足:

  • WAN up: true
  • 能获得 IPv4 地址和默认路由;
  • 能 Ping 通公网 IP;
  • DNS 能解析 github.com

如果公网 IP 能通但域名不能解析,应先检查 WAN 下发的 DNS,或在 LuCI 中为 WAN 手动指定可靠 DNS。

安装 iStore

ImmortalWrt 25.12.1 使用 apk 包管理器。当前 iStore 官方安装脚本已经兼容 ARM64 和 apk

在路由器执行:

apk update

cd /tmp
wget -O istore-reinstall.run \
  https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/istore-reinstall.run

chmod 755 istore-reinstall.run
./istore-reinstall.run

安装完成后检查:

apk info | grep -E 'luci-app-store|luci-lib-taskd|taskd'
/etc/init.d/taskd enable
/etc/init.d/taskd restart
rm -f /tmp/luci-indexcache
rm -rf /tmp/luci-modulecache
/etc/init.d/uhttpd restart

强制刷新浏览器,LuCI 菜单中应出现 iStore。

如果路由器直接下载 GitHub 文件很慢,可以在 Mac 上下载,再通过 SSH 传入:

curl -L \
  https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/istore-reinstall.run \
  -o /tmp/istore-reinstall.run

ssh -T root@192.168.1.1 \
  'cat > /tmp/istore-reinstall.run' \
  < /tmp/istore-reinstall.run

然后在路由器执行:

chmod 755 /tmp/istore-reinstall.run
/tmp/istore-reinstall.run

需要注意:2GB 是运行内存,不是闪存。内部 overlay 只有约 82MB 可用,iStore 本身可以安装,但 Docker、下载、影音等大型应用应使用 USB 3.0 外置存储。不要把大型容器和数据目录直接放进 NAND。

安装 Argon 主题

ImmortalWrt 默认的 Bootstrap 主题比较朴素。官方 25.12.1 软件源已经提供 Argon,不需要从第三方网盘下载,也不要安装为旧版 OpenWrt 打包的 IPK。

在 LuCI 中打开:

系统 -> 软件包

先点击“更新列表”,搜索并安装:

luci-theme-argon

本机安装到的版本为:

2.4.3-r20250722

也可以在 SSH 中执行等价命令:

apk update
apk add luci-theme-argon

安装完成后强制刷新 LuCI。页面底部出现 ArgonTheme v2.4.3,并且页面加载 /luci-static/argon/css/cascade.css,说明主题已经启用。

我保留了原来的 Bootstrap 主题作为回退,不建议为了省几百 KB 将其删除。如果 Argon 显示异常,可进入:

系统 -> 系统 -> 语言和界面 -> 主题

临时切回 Bootstrap。若只是浏览器缓存旧样式,在 Mac 上使用 Command + Shift + R 强制刷新即可。

安装 OpenClash

使用 ImmortalWrt 官方软件源安装

25.12.1 的官方软件源中已经有 luci-app-openclash,本机无需手动下载 GitHub Release,也避免了 IPK 与当前 apk 包管理器或内核版本不兼容的问题。

进入:

系统 -> 软件包

在“可用”列表中搜索:

luci-app-openclash

本机安装的版本是:

luci-app-openclash 0.47.075

点击“安装”后,LuCI 会同时解析并安装 Bash、Ruby YAML、ip-full、TUN、TPROXY 等依赖。本次提示共安装 23 个软件包,预计占用约 9.93MiB。不要勾选“允许覆盖冲突的包文件”。

对应的 SSH 命令为:

apk update
apk add luci-app-openclash

本次 LuCI 在等待 apk install 时曾显示前端请求超时,但后台安装其实已经完成。遇到相同情况不要立即重复点击,先刷新页面,再到“已安装”中搜索 openclash。看到操作按钮变成“移除”,并且 overlay 使用量增加,才能确认安装成功。

让 LuCI 加载新菜单

安装后如果“服务”菜单中没有 OpenClash,可先清理 LuCI 缓存并重启 Web 服务:

rm -f /tmp/luci-indexcache
rm -rf /tmp/luci-modulecache
/etc/init.d/uhttpd restart

如果菜单仍未出现,再正常重启一次路由器。重启后路径应为:

服务 -> OpenClash

本机重启后成功加载菜单,OpenClash 显示 Meta 运行中,内核为 Mihomo,Fake-IP 增强模式、控制面板和连通性检测均正常。

首次配置注意事项

OpenClash 只是客户端,安装软件包不等于已经配置代理。还需要在以下任一位置添加自己的配置:

服务 -> OpenClash -> 配置订阅
服务 -> OpenClash -> 配置管理

订阅地址相当于账号凭据,不要写入博客、截图、Git 仓库或发给他人。添加配置后先检查:

  • “运行状态”显示 Meta 运行中
  • 配置文件选择正确;
  • GitHub、YouTube 等连通性测试正常;
  • 不使用 OpenClash 时可以关闭总开关,避免代理规则影响故障排查;
  • 升级 OpenClash 插件、Mihomo 核心和配置文件是三件不同的事,不要混淆。

本机安装后 overlay 从约 11.74MiB 增加到约 24.18MiB,仍剩余约 62.62MiB。规则集和日志会继续占用空间,应定期清理,不要把大量订阅备份长期留在 NAND。

开启并验证 IPv6

先判断上游是否提供 IPv6-PD

不要看到 WAN6 有 IPv6 地址就直接认为 LAN 客户端也能使用 IPv6。先在 SSH 中检查:

ubus call network.interface.wan6 status

本机的 WAN6 已通过 DHCPv6 获得公网地址和 IPv6 默认网关,但返回结果中的 ipv6-prefix 为空。接口页面也只显示一个 /128 地址和 WAN 链路上的 /64 地址,没有可分配给 LAN 的委派前缀。

这是典型的二级路由场景:上级路由器提供 IPv6,但没有向 N60 Pro 下发 Prefix Delegation。此时继续使用默认的 RA Server 模式,LAN 通常只能拿到 fdxx: ULA 地址,无法获得公网 IPv6。正确做法是将上级 /64 通过 RA、DHCPv6 和 NDP 中继到下游。

如果自己的 ipv6-prefix 中已经出现 /56/60 或可用的 /64 委派前缀,则应优先使用正常的前缀委派和 RA Server,不要照抄下面的 Relay 配置。

配置 LAN 为中继下游

打开:

网络 -> 接口 -> lan -> 编辑 -> DHCP 服务器 -> IPv6 设置

设置:

选项
指定的主接口 不勾选
RA 服务 中继模式
DHCPv6 服务 中继模式
NDP 代理 中继模式
学习路由 保持勾选

点击弹窗中的“保存”,暂时不要单独应用,继续配置 WAN6。

配置 WAN6 为中继主接口

打开:

网络 -> 接口 -> wan6 -> 编辑 -> DHCP 服务器

如果页面提示“本接口未配置 DHCP 服务器”,先点击“配置 DHCP 服务器”。这里的“忽略此接口”只针对 dnsmasq 的普通 DHCP 服务,不妨碍 odhcpd 执行 IPv6 中继。

进入“IPv6 设置”后设置:

选项
指定的主接口 勾选
RA 服务 中继模式
DHCPv6 服务 中继模式
NDP 代理 中继模式
学习路由 保持勾选

保存后点击页面底部“保存并应用”。应用期间 LAN 和 WAN6 会短暂重启,IPv4 管理地址仍保持 192.168.1.1

以上 LuCI 操作对应的 UCI 配置如下。全新安装时也可以通过 SSH 执行:

uci set dhcp.lan.ra='relay'
uci set dhcp.lan.dhcpv6='relay'
uci set dhcp.lan.ndp='relay'

uci set dhcp.wan6='dhcp'
uci set dhcp.wan6.interface='wan6'
uci set dhcp.wan6.ignore='1'
uci set dhcp.wan6.master='1'
uci set dhcp.wan6.ra='relay'
uci set dhcp.wan6.dhcpv6='relay'
uci set dhcp.wan6.ndp='relay'

uci commit dhcp
/etc/init.d/odhcpd restart
ifup wan6

在 Mac 上验证 IPv6

配置应用后,重新插拔网线不是必须的;如果地址没有立即刷新,可以关闭再开启一次 Mac 的有线网络接口。

检查 en7,实际接口名按自己的 Mac 修改:

ifconfig en7
route -n get -inet6 default
ping6 -c 3 2001:4860:4860::8888

本机验证结果满足:

  • en7fe80:: 链路本地地址和 fdxx: ULA 外,还获得了 240e: 开头的公网 /64 地址;
  • IPv6 默认网关指向 N60 Pro 的 LAN 链路本地地址;
  • 向 Google IPv6 DNS 发送 3 个 ICMPv6 数据包全部收到响应,丢包率为 0%。

公网 IPv6 地址和前缀可能随运营商重拨变化,文章和截图中应只保留脱敏前缀。Relay 模式依赖上级路由的 RA;如果将来上级开始下发 PD,建议改回标准前缀委派模式。

清理 Mac 的临时 TFTP 环境

确认正式系统已经多次正常启动后,再清理:

sudo launchctl bootout system/com.apple.tftpd
sudo launchctl disable system/com.apple.tftpd
sudo ifconfig en7 -alias 192.168.1.254

sudo rm -f \
  /private/tftpboot/immortalwrt-mediatek-filogic-netcore_n60-pro-initramfs-recovery.itb

rm -f /tmp/n60pro-tftp-test.itb

如果之前将 tftpd 加入 macOS 防火墙,可以按需保留或删除对应规则。

常见问题

scp 报 sftp-server 不存在

原因是新版 macOS scp 默认使用 SFTP,而原厂路由器没有 SFTP Server。

解决方式:

scp -O useradmin@路由器IP:/远端文件 /本地目录/

或者使用:

ssh -T useradmin@路由器IP 'cat /远端文件' > /本地文件

按 RESET 后能 Ping 通,但没有 Web 恢复页

这是正常现象。N60 Pro 的 ImmortalWrt/OpenWrt U-Boot 没有 Web Failsafe 页面,它使用 TFTP Client 主动下载恢复镜像。

重点检查:

  • Mac 是否真正在 192.168.1.254
  • TFTP 是否已启动;
  • 文件名是否精确为无版本号的名称;
  • macOS 防火墙是否阻止 tftpd
  • 网线是否接在 LAN 口;
  • tcpdump 是否看到 UDP 69 请求。

TFTP 本机测试成功,路由器还是下载不到

本机访问 127.0.0.1 只证明 tftpd 能读文件,不代表防火墙允许外部请求。应确认接口路由并放行服务:

route -n get 192.168.1.1
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/libexec/tftpd
sudo tcpdump -ni en7 'udp port 69'

/rom 显示 100%

正常。/rom 是只读 squashfs 镜像,设计上就是固定大小。查看可写空间应关注:

df -h /overlay

2GB 版会不会只能识别 512MB

本机实际测试 ImmortalWrt 25.12.1 可以识别:

MemTotal: 2030412 KB

LuCI 显示约 1.94 GiB,所以不需要额外构建 2GB 固件。其它版本或第三方编译版仍应以 free -h 的实际结果为准。

刷机后 SSH 提示 Host Key 改变

系统已经更换,SSH Host Key 改变是正常的。确认当前连接的确是自己的路由器后执行:

ssh-keygen -R 192.168.1.1

iStore 安装后菜单没有出现

清理 LuCI 缓存并重启 Web 服务:

rm -f /tmp/luci-indexcache
rm -rf /tmp/luci-modulecache
/etc/init.d/uhttpd restart

关于恢复原厂

这次已经备份了原厂 BL2、U-Boot Env、Factory、FIP 和 UBI,但我没有在本机执行完整的原厂回刷验证,因此这里不把未经验证的恢复命令写成“一键操作”。

恢复原厂的大体原则是:

  1. 使用当前 U-Boot 通过 TFTP 启动 initramfs,避免在正在使用 NAND rootfs 时写系统分区;
  2. 先恢复自己的原厂 mtd5_ubi.bin
  3. 再恢复自己的原厂 mtd4_FIP.bin
  4. 保留本机 Factory 和 BL2,不使用网上他人的备份;
  5. 写入后重新校验,再断电重启;
  6. 若 U-Boot、BL2 或 NAND 坏块处理出现异常,应改用串口确认启动日志,而不是连续盲刷。

特别注意:原厂和新 U-Boot 展示的 MTD 编号不同,恢复时必须按分区名称、大小和当前 /proc/mtd 判断,不能只照抄 mtd4mtd5 编号。

总结

这次刷机最花时间的不是执行 mtd write,而是把恢复路径在写入前验证完整:

  • 固件来源和 SHA-256 正确;
  • 原厂所有关键分区有本机备份;
  • 备份已经复制到 Mac 且归档哈希一致;
  • TFTP 文件名、地址和服务均已自测;
  • FIP 写入后完成了 MTD 回读校验;
  • 先用 initramfs 验证硬件,再执行 sysupgrade;
  • 正式系统启动后确认 2GB 内存、overlay、WAN 和 DNS。
  • 使用官方软件源安装 Argon 与 OpenClash,保留原主题作为回退;
  • 根据上游没有 IPv6-PD 的实际情况配置 Relay,并从 LAN 客户端验证公网 IPv6。

只要不省略这些检查点,N60 Pro 的刷机路径是比较清晰的。最终 ImmortalWrt 25.12.1 正确识别全部 2GB 内存,iStore、Argon、OpenClash 和双栈网络均可正常工作,也为后续挂载 USB 存储和扩展家庭网络服务留下了空间。

参考资料