Immortalwrt

介绍

ImmortalWrt是基于OpenWRT二次开发的固件,兼具了OpenWRT的强大功能和简洁易用的界面,是小白上手软路由的首选。

使用指北

https://github.com/immortalwrt/user-FAQ/blob/main/immortalwrt%20%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E6%8C%87%E5%8C%97.md

基本情况

本人使用的是小米AX3000T(旧版),小米AX3000T进行过一次阉割,在芯片上砍了一刀。

新旧版芯片不同,因此所用的固件也有区别,需要辨别。旧版为ax3000t,新版(阉割版)为ax3000t_an8855

闲鱼上可以买到旧版,芯片更好一些

小米AX3000T 使用的是联发科(MediaTek)的 Filogic 820 平台,其芯片型号为 MT7981B。因此我使用的是针对mt789x进行了优化的ImmortalWrt:https://github.com/hanwckf/immortalwrt-mt798x/ (新旧版都用这个)

踩坑记录

无线网沒有802.1x的加密方式

无线网被迫公开,无法设置加密方式 被迫光着皮肤跑

https://github.com/hanwckf/immortalwrt-mt798x/issues/288

原因是编译固件的时候指定了Target Devices,导致编译时没有带上无线wifi加密相关的模块

解决方法如issue里所说,不要指定devices,可以调整默认软件包添加openclash之类的,但不要动target devices

你的.config里没有CONFIG_PACKAGE_luci-app-mtwifi-cfg,使用的配置文件不正确,按照编译说明重新使用defconfig重新生成。 另外不要去修改target devices,默认是使用CONFIG_TARGET_MULTI_PROFILE编译所有同CPU的路由器固件,你手动只选择JCG-Q30会让其它配置项目变动,导致无线需要的软件包没有编译进去

感谢大佬指导,重新检查,发现我的menuconfig里没有luci-app-mtwifi-cfg和luci-app-turboacc-mtk包,清理后重新安装feeds,终于出现了。问题应该就出现在这里,正在重新编译中。感谢!
~
更新,编译后问题解决。看来关键就在于之前没有成功安上luci-app-mtwifi-cfg和luci-app-turboacc-mtk包

刷固件的时候连入路由器

有线连接上传固件的时候需要给以太网手动指定网段和IP,忘了弄这步,半夜折腾了半天

固件刷错

Uboot救我狗命,我照着错的固件刷了N次,没Uboot死一万遍了

一定先刷Uboot!一定先刷Uboot!一定先刷Uboot!

  • openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-initramfs-factory.ubi
  • openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-initramfs-factory.ubi
  • immortalwrt-mediatek-mt7981-xiaomi_mi-router-ax3000t-squashfs-factory.bin
  • immortalwrt-mediatek-mt7981-xiaomi_mi-router-ax3000t-stock-squashfs-sysupgrade.bin

随便选几个来说一下怎么看固件,这里让GPT来讲

文件名通常由 项目名-版本-平台-芯片-设备名-特性-类型.后缀 组成。

  • openwrt / immortalwrt:
    • openwrt: 官方、原版的 OpenWrt 项目。它是一个高度模块化、功能强大的开源路由器固件系统,追求稳定和标准化。
    • immortalwrt: OpenWrt 的一个分支 (fork)。它通常会包含一些更激进的更新、针对特定设备的优化、预集成的常用软件包(如科学上网工具、去广告等),以及更新的内核。可以理解为是一个更“开箱即用”且功能更丰富的版本。
  • 24.10.2:
    • 这是固件的版本号。数字越大,通常代表版本越新。
  • mediatek-filogic / mediatek-mt7981:
    • 这指的是硬件平台和SoC(系统级芯片)型号。小米AX3000T 使用的是联发科(MediaTek)的 Filogic 820 平台,其芯片型号为 MT7981B。这两个名称都指向同一个硬件平台。
  • xiaomi_mi-router-ax3000t:
    • 这明确指出了该固件适配的设备型号:小米 AX3000T 路由器。固件不能混刷,必须使用对应型号的。
  • ubootmod:
    • U-Boot Mod (修改版引导加载程序)。U-Boot 是路由器的引导加载程序,类似于电脑的BIOS。ubootmod 固件在刷入过程中会替换掉原厂的 U-Boot。
    • 优点: 修改后的 U-Boot 通常会解锁分区限制、提供 Web UI 恢复模式(俗称“不死 U-Boot”),让你刷机更方便、更不容易变砖。
    • 风险: 修改 U-Boot 是一个高风险操作,如果过程中断电或出现意外,可能导致设备“真砖”,需要通过编程器等硬件方式才能救回。
  • initramfs:
    • Initial RAM File System (初始内存文件系统)。这是一个临时的、在内存中运行的迷你系统。
    • 特点: 它不会被永久写入路由器的闪存(Flash)。路由器重启后,所有在 initramfs 系统中所做的更改都会丢失。
    • 用途: 它的主要作用是作为一个“跳板”或“中转系统”。你先刷入这个临时系统,然后在它的Web界面(LuCI)中,再刷入一个完整的、永久的 sysupgrade 固件。它主要用于首次从原厂固件刷为 OpenWrt/ImmortalWrt。
  • squashfs:
    • 这是一种高度压缩的只读文件系统。OpenWrt/ImmortalWrt 的标准固件都使用这种格式。
    • 特点: 系统核心文件被压缩在 squashfs 中,不可更改。而用户的配置、安装的软件等则保存在另一个可读写的 overlay 分区。这种结构使得系统非常稳定,并且可以通过恢复出厂设置轻松清除所有用户改动,回到初始状态。这是你日常使用的永久性系统。
  • factory:
    • 工厂固件。这种固件是专门设计用来 从设备的原厂(小米官方)固件刷入第三方固件(如 OpenWrt) 的。它的文件头和格式经过特殊构造,能够通过原厂固件的升级程序验证。
  • sysupgrade:
    • System Upgrade (系统升级)。这种固件用于 已经刷了 OpenWrt/ImmortalWrt 的设备进行升级。例如,从 OpenWrt 23.05 升级到 24.10,或者从一个旧的 ImmortalWrt 版本升级到新的版本。它通常会保留你的用户配置。
  • .ubi / .bin:
    • 这是固件文件的后缀(扩展名),代表不同的镜像格式。
    • .ubi: Unsorted Block Image format。这是针对 NAND 闪存设计的镜像格式,小米 AX3000T 使用的是 NAND 闪存,因此 OpenWrt 官方为其提供了 .ubi 格式的固件。
    • .bin: Binary file。一个通用的二进制文件格式。在这里它也是一个完整的固件镜像。选择 ubi 还是 bin 取决于你所使用的刷机方法和工具的要求。对于 AX3000T,两者都可以用于刷机,但通常建议遵循相应教程的指引。

四个固件文件的区别和使用场景

现在,我们将上面的关键词组合起来,解释你列出的这四个文件。

1. openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-ubootmod-initramfs-factory.ubi

  • 分解:
    • 项目: OpenWrt 官方
    • 特点: ubootmod (会修改U-Boot), initramfs (内存临时系统), factory (从原厂刷入)
    • 格式: .ubi
  • 讲解: 这是一个功能强大的“一步到位”的初始刷机包。它用于从小米官方固件首次刷入 OpenWrt。在刷入过程中,它不仅会启动一个临时的 OpenWrt 系统,还会顺便把你的路由器U-Boot给替换成功能更强的修改版U-Boot
  • 什么时候用:
    • 当你的路由器是 原厂固件
    • 你希望 第一次刷机就解锁U-Boot,获得更强的防砖和刷机便利性。
    • 刷完这个临时系统后,你需要立刻在它的界面里再刷入一个 OpenWrt 的 sysupgrade 固件才能完成永久安装。

2. openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-initramfs-factory.ubi

  • 分解:
    • 项目: OpenWrt 官方
    • 特点: initramfs (内存临时系统), factory (从原厂刷入)。注意:没有 ubootmod
    • 格式: .ubi
  • 讲解: 这是标准的、更安全的 OpenWrt 初始刷机包。它同样用于从小米官方固件首次刷入,但它 不会修改你路由器的 U-Boot,只启动一个临时的 OpenWrt 系统。
  • 什么时候用:
    • 当你的路由器是 原厂固件
    • 不想修改原厂 U-Boot,追求更低的风险。
    • 和上面一样,刷完这个临时系统后,你需要立刻在它的界面里再刷入一个 OpenWrt 的 sysupgrade 固件才能完成永久安装。

3. immortalwrt-mediatek-mt7981-xiaomi_mi-router-ax3000t-squashfs-factory.bin

  • 分解:
    • 项目: ImmortalWrt
    • 特点: squashfs (永久性系统), factory (从原厂刷入)
    • 格式: .bin
  • 讲解: 这是 ImmortalWrt 的初始刷机包。与 OpenWrt 的 initramfs 不同,这个固件设计为 从原厂固件直接刷入一个永久性的、可直接使用的 ImmortalWrt 系统。它是一步到位的安装包,刷完重启后就是完整的 ImmortalWrt 系统,不需要再刷 sysupgrade
  • 什么时候用:
    • 当你的路由器是 原厂固件
    • 你想直接安装 ImmortalWrt 系统,而不是 OpenWrt。
    • 你想一步完成,不想通过 initramfs 中转。

4. immortalwrt-mediatek-mt7981-xiaomi_mi-router-ax3000t-stock-squashfs-sysupgrade.bin

  • 分解:
    • 项目: ImmortalWrt
    • 特点: squashfs (永久性系统), sysupgrade (升级用)
    • 格式: .bin
  • 讲解: 这是 ImmortalWrt 的 升级包。"stock" 在这里通常指标准的、未经过度定制的版本。
  • 什么时候用:
    • 当你的路由器 已经运行着旧版本的 ImmortalWrt 或 OpenWrt
    • 你想升级到这个新版本的 ImmortalWrt。
    • 严禁用于从原厂固件刷入! 在原厂固件后台上传 sysupgrade 文件会导致刷机失败甚至变砖。

最后刷入的是immortalwrt-mediatek-mt7981-xiaomi_mi-router-ax3000t-squashfs-factory.bin,我刷了uboot了,不需要stock

没有无线加密方式

只有无加密(开放)

opkg install hostapd-wolfssl wpa-supplicant-wolfssl

尝试安装完整的加密支持包,无变化

移动rax3000m算力版,无法设置无线密码

根据github讨论得知

你的.config里没有CONFIG_PACKAGE_luci-app-mtwifi-cfg,使用的配置文件不正确,按照编译说明重新使用defconfig重新生成。
另外不要去修改target devices,默认是使用CONFIG_TARGET_MULTI_PROFILE编译所有同CPU的路由器固件,你手动只选择JCG-Q30会让其它配置项目变动,导致无线需要的软件包没有编译进去

carrothu-cn commented on Sep 24, 2024

你的.config里没有CONFIG_PACKAGE_luci-app-mtwifi-cfg,使用的配置文件不正确,按照编译说明重新使用defconfig重新生成。 另外不要去修改target devices,默认是使用CONFIG_TARGET_MULTI_PROFILE编译所有同CPU的路由器固件,你手动只选择JCG-Q30会让其它配置项目变动,导致无线需要的软件包没有编译进去

感谢大佬指导,重新检查,发现我的menuconfig里没有luci-app-mtwifi-cfg和luci-app-turboacc-mtk包,清理后重新安装feeds,终于出现了。问题应该就出现在这里,正在重新编译中。感谢!
~
更新,编译后问题解决。看来关键就在于之前没有成功安上luci-app-mtwifi-cfg和luci-app-turboacc-mtk包

BJTU校园网自动登录脚本

建议先学习BJTU校园网的一些基本机制

事前准备

https://login.bjtu.edu.cn:802/eportal/portal/login?callback=dr1003&login_method=1&user_account=你的学号&user_password=校园网密码&wlan_user_ip=设备的IPV4地址

拿笔记本手动让软路由联网

opkg update
opkg install iconv

让设备支持iconv转码,因为校园网登陆页面是gbk编码,不支持转码就无法识别网页上的中文文字内容。

必做!不然脚本无法工作!

脚本部署

创建脚本

/root/bjtu_login_high_freq.sh

添加执行权限

chmod +x /root/bjtu_login_high_freq.sh

检测日志变化的命令

tail -f /tmp/bjtu_login.log

因为title乱码导致脚本判断网页标题的逻辑不生效


<title>▒▒▒▒▒¼ҳ</title>
<!--Dr.COMWebL
[DEBUG] 21:15:50 - --- End of Content ---
[DEBUG] 21:15:50 - Using keyword to check: 'user_password'
[DEBUG] 21:15:50 - Keyword NOT found. Network is considered online.

因为校园网认证系统的 HTTPS 证书通常是“自签名”的,直接访问会导致 curl 报错退出。我们需要告诉 curl 忽略证书验证,使用 -k--insecure 选项。


[2025-09-10 21:28:02] [LEVEL 3] --- 内容结束 ---
[2025-09-10 21:28:02] [LEVEL 1] 判断结果: 找到关键字 '上网登录页',需要执行登录。
[2025-09-10 21:28:02] [LEVEL 1] 检测到未登录,正在尝试自动登录...
[2025-09-10 21:28:02] [LEVEL 2] 构建登录请求URL: http://10.10.42.3:802/eportal/portal/login?user_account=23281205&user_password=Ade@2093
[2025-09-10 21:28:02] [LEVEL 2] 登录服务器响应内容: <html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx</center>
</body>
</html>
[2025-09-10 21:28:02] [LEVEL 0] 登录可能失败,请检查账号密码或服务器响应。

步骤二:修改 do_login 函数中的 curl 命令

do_login 函数内部,找到发送登录请求的 curl 命令,在里面加上 -k 选项。

修改前:

Bash

LOGIN_RESPONSE=$(curl -s --connect-timeout 5 -m 10 "$FULL_LOGIN_URL")

修改后:

Bash

LOGIN_RESPONSE=$(curl -s -k --connect-timeout 5 -m 10 "$FULL_LOGIN_URL")

这里的 -k 就是让 curl “忽略不安全的SSL证书”的关键。

最终完成版

#!/bin/sh

# --- 脚本配置 ---
# 账号和密码
USER_ACCOUNT="学号"
USER_PASSWORD="校园网密码"

# --- 调试与执行配置 ---
# 调试等级: 0=安静, 1=普通, 2=详细 3=我连登录页html内容都给你存下来
DEBUG_LEVEL=1 # 建议第一次部署设置为 3,检查网页内容是否正常获取。正常工作后设置为1,只记录关键信息

# 检测频率 (秒)
INTERVAL=1

# --- 核心参数配置 ---
LOGIN_IP="10.10.42.3"
LOGIN_PAGE_URL="http://${LOGIN_IP}/"
LOGIN_API_URL="https://${LOGIN_IP}:802/eportal/portal/login"

# 【重要】页面编码和关键字配置
PAGE_ENCODING="gbk"
NON_SIGN_IN_KEYWORD="上网登录页"
LOGIN_SUCCESS_KEYWORD="Portal协议认证成功"
LOGIN_CREDENTIALS_ERROR_KEYWORD="账号或密码错误,请检查!" # 新增的错误关键字

# --- 环境配置 ---
LOG_FILE="/tmp/bjtu_login.log"
LOCK_FILE="/tmp/bjtu_login.lock"

# --- 脚本核心区 ---

exec 200>$LOCK_FILE
flock -n 200 || { echo "Another instance is running. Exiting."; exit 1; }

log_msg() {
    local level=$1; local message=$2; local timestamp
    timestamp=$(date '+%Y-%m-%d %H:%M:%S')
    if [ "$DEBUG_LEVEL" -ge "$level" ]; then
        # 写入日志文件
        echo "[$timestamp] [LEVEL $level] $message" >> "$LOG_FILE"
        # 打印到控制台(如果脚本在前台运行)
        if [ "$DEBUG_LEVEL" -gt 0 ]; then
            echo "[$timestamp] [LEVEL $level] $message"
        fi
    fi
}

do_login() {
    log_msg 1 "检测到未登录,正在尝试自动登录..."
    FULL_LOGIN_URL="${LOGIN_API_URL}?user_account=${USER_ACCOUNT}&user_password=${USER_PASSWORD}"
    log_msg 2 "构建登录请求URL: $FULL_LOGIN_URL"
    
    # 使用 curl 发送 HTTPS 请求,-s静默,-k忽略证书,--connect-timeout连接超时,-m总超时
    LOGIN_RESPONSE=$(curl -s -k --connect-timeout 5 -m 10 "$FULL_LOGIN_URL")
    
    log_msg 2 "登录服务器响应内容: $LOGIN_RESPONSE"
    
    if echo "$LOGIN_RESPONSE" | grep -q "$LOGIN_SUCCESS_KEYWORD"; then
        # 1. 登录成功
        log_msg 0 "【成功】登录成功!"
    elif echo "$LOGIN_RESPONSE" | grep -q "$LOGIN_CREDENTIALS_ERROR_KEYWORD"; then
        # 2. 账号/密码错误
        log_msg 0 "【失败】登录失败:账号或密码错误,请检查配置。"
        # 账号密码错误后,应该停止尝试登录,防止被封,可以考虑退出脚本
        # exit 1 
    else
        # 3. 其他失败情况
        log_msg 0 "【失败】登录可能失败,服务器返回了其他信息或连接问题。"
        # 如果是其他临时错误,可以继续等待下一个周期再尝试
    fi
}

# --- 主循环 (修改为无限循环) ---
log_msg 1 "脚本作为常驻服务启动,开始持续检测网络状态..."

# 使用无限循环
while true; do
    log_msg 2 "--- 开始新一轮检测 ---"
    
    # 使用 curl 获取登录页,-s静默模式,--connect-timeout连接超时,-m总超时
    CHECK_RESULT=$(curl -s --connect-timeout 3 -m 5 "$LOGIN_PAGE_URL")
    
    GREP_INPUT="$CHECK_RESULT"
    
    if [ -n "$PAGE_ENCODING" ]; then
        log_msg 2 "页面编码设置为 '$PAGE_ENCODING',正在进行转码..."
        # 尝试使用 iconv 将页面内容从指定编码转为 UTF-8
        GREP_INPUT=$(echo "$CHECK_RESULT" | iconv -f "$PAGE_ENCODING" -t utf-8 2>/dev/null)
        if [ $? -ne 0 ]; then
            log_msg 2 "【警告】iconv 转码失败,使用原始内容进行匹配。"
            GREP_INPUT="$CHECK_RESULT"
        fi
    fi

    log_msg 3 "--- 待检测内容 (转码后) ---"
    log_msg 3 "$GREP_INPUT"
    log_msg 3 "--- 内容结束 ---"

    if echo "$GREP_INPUT" | grep -q "$NON_SIGN_IN_KEYWORD"; then
        log_msg 1 "判断结果: 找到关键字 '$NON_SIGN_IN_KEYWORD',需要执行登录。"
        do_login
        # 登录后建议多等几秒,让网络状态稳定
        sleep 5 
    else
        log_msg 1 "判断结果: 未找到关键字 '$NON_SIGN_IN_KEYWORD',网络状态正常。"
    fi
    
    # 每次循环后固定等待
    sleep $INTERVAL
done

# 脚本正常情况下不会执行到这里
log_msg 1 "脚本异常退出。"
exit 0

OpenClash

2025-09-21 03:48:34 OpenClash 开始关闭...
2025-09-21 03:48:33 【Dev】版本内核更新失败,请检查网络或稍后再试!
2025-09-21 03:48:32 【Dev】版本内核正在下载,如下载失败请尝试手动下载并上传...
2025-09-21 03:48:32 提示:如果下载失败,您可以尝试在覆写设置 - 常规设置 - Github地址修改选项中设置CDN
2025-09-21 03:48:32 提示:检测到内核文件不存在,准备开始下载...

手动上传:https://www.right.com.cn/forum/thread-8272767-1-1.html

搞定后访问解析略卡,明显的迟钝,google能上但油管上不了。找不到DNS地址DNS_PROBE_STARTED,接着开始对DNS动刀

https://woj.app/8805.html

总之照着做了,管用了,计网学艺不精根本不知道在干什么

主机名映射

手动设置后顺利访问,接下来尝试换思路解决unknown host的问题

IPV6

以下内容由GPT老师进行讲解

根据您分享的状态,情况如下:

  • WAN6 接口: 已经通过 DHCPv6 成功获取到了一个公网 IPv6 地址:2001:da8:205:40b0:ced8:43ff:fe14:27e3/64这说明您的软路由已经成功连接上了 IPv6 互联网。
  • LAN 接口: 目前只分配了一个 fdba:6201:4541::1/60 的 IPv6 地址。这是一个 ULA 本地地址,只能用于局域网内部通信,无法访问公网 IPv6。

问题根源:您的软路由没有将 WAN6 口获取到的公网 IPv6 地址段(前缀)正确地“传递”或“代理”给 LAN 口下的设备

我们的目标就是配置这个“传递”的动作,让 LAN 口下的设备也能获得以 2001:da8:205:40b0 开头的公网 IPv6 地址。

由于您的上游(校园网)只分配了一个 /64 的前缀给您的路由器 WAN 口,这是 IPv6 的最小子网单位,无法再进行分割(子网划分)。因此,我们不能使用常规的“服务器”模式,而必须使用**“中继模式”(Relay Mode)**。

设置步骤

请按照以下步骤在您的 ImmortalWRT/OpenWrt 后台进行设置:

  1. 进入 LAN 接口设置
    • 在左侧菜单栏,导航到 网络 -> 接口 (Network -> Interfaces)
    • 找到列表中的 LAN 接口,点击右侧的 “修改” (Edit) 按钮。
  2. 配置 DHCP 服务器的 IPv6 设置
    • 在修改 LAN 接口的页面中,点击上方的 “DHCP 服务器” (DHCP Server) 标签页。
    • 然后,点击下方的 “IPv6 设置” (IPv6 Settings) 子标签页。
    • 现在,您会看到三个关键的下拉菜单,请将它们全部设置为 “中继模式” (Relay mode)
      • RA 服务 (RA-Service): 中继模式
      • DHCPv6 服务 (DHCPv6-Service): 中继模式
      • NDP 代理 (NDP-Proxy): 中继模式
    • 解释
      • RA (路由通告) 设置为中继,意味着软路由会把上游(WAN6)的路由信息转发给下游(LAN)设备。
      • DHCPv6 设置为中继,意味着软路由会把下游设备获取 IPv6 地址的请求,原封不动地转发给上游处理。
      • NDP (邻居发现协议) 设置为中继,能帮助不同网段的设备互相发现,确保网络通畅。
  3. 保存并应用配置
    • 完成上述设置后,点击页面右下角的 “保存” (Save) 按钮。
    • 然后返回到 网络 -> 接口 主页面,点击右上角的 “保存并应用” (Save & Apply)

后续优化

有地址但不能上网?——校园网IPv6的/64子网下DHCPv6中继以及重设OpenWRT路由

我就说这世界上从来都不缺计算机天才。

被帖子里大一学生的计网知识储备震撼到了,准备按他帖子去试试对校园网的进一步探索