Immortalwrt
介绍
ImmortalWrt是基于OpenWRT二次开发的固件,兼具了OpenWRT的强大功能和简洁易用的界面,是小白上手软路由的首选。
使用指北
基本情况
本人使用的是小米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 是一个高风险操作,如果过程中断电或出现意外,可能导致设备“真砖”,需要通过编程器等硬件方式才能救回。
- U-Boot Mod (修改版引导加载程序)。U-Boot 是路由器的引导加载程序,类似于电脑的BIOS。
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
尝试安装完整的加密支持包,无变化
根据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校园网的一些基本机制
事前准备
拿笔记本手动让软路由联网
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动刀
总之照着做了,管用了,计网学艺不精根本不知道在干什么
主机名映射

手动设置后顺利访问,接下来尝试换思路解决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 后台进行设置:
- 进入 LAN 接口设置
- 在左侧菜单栏,导航到 网络 -> 接口 (Network -> Interfaces)。
- 找到列表中的 LAN 接口,点击右侧的 “修改” (Edit) 按钮。
- 配置 DHCP 服务器的 IPv6 设置
- 在修改 LAN 接口的页面中,点击上方的 “DHCP 服务器” (DHCP Server) 标签页。
- 然后,点击下方的 “IPv6 设置” (IPv6 Settings) 子标签页。
- 现在,您会看到三个关键的下拉菜单,请将它们全部设置为 “中继模式” (Relay mode):
- RA 服务 (RA-Service):
中继模式
- DHCPv6 服务 (DHCPv6-Service):
中继模式
- NDP 代理 (NDP-Proxy):
中继模式
- RA 服务 (RA-Service):
- 解释:
- RA (路由通告) 设置为中继,意味着软路由会把上游(WAN6)的路由信息转发给下游(LAN)设备。
- DHCPv6 设置为中继,意味着软路由会把下游设备获取 IPv6 地址的请求,原封不动地转发给上游处理。
- NDP (邻居发现协议) 设置为中继,能帮助不同网段的设备互相发现,确保网络通畅。
- 保存并应用配置
- 完成上述设置后,点击页面右下角的 “保存” (Save) 按钮。
- 然后返回到 网络 -> 接口 主页面,点击右上角的 “保存并应用” (Save & Apply)。
后续优化
有地址但不能上网?——校园网IPv6的/64子网下DHCPv6中继以及重设OpenWRT路由
我就说这世界上从来都不缺计算机天才。
被帖子里大一学生的计网知识储备震撼到了,准备按他帖子去试试对校园网的进一步探索
Comments NOTHING