XiaBee's Studio.

红米AX6000路由器刷机

字数统计: 2.9k阅读时长: 13 min
2023/11/13

背景

双十一又剁手买了一个红米 AX6000,现在两台 AX6000 只是做个 mesh 用,主打一个暴殄天物(划掉)。

看网友测评说 AX6000 的 openwrt 系统性能做的比原厂要好,于是决定随机抽一台拿出来刷机。

准备工作

硬件准备

  • 一台红米 AX6000 路由器
  • 一台 PC(Mac / Windows / Linux 都可以)

技术准备

  • 会 ssh 就行

解锁 SSH

确认后台地址

先要找到路由器管理后台。红米 AX6000 的后台地址默认是 http://192.168.31.1,如果找不到后台可以重置路由器,恢复到默认后台地址。

我本人有两个 AX6000,组了个有线 mesh,要刷 mesh 机,进入主控路由器后台查看对应 IP 即可:

image-20231107181054979

升级到特定版本

在小米路由器后台,将路由器手动升级到 1.2.8 版本

之前懒得升级想直接用 1.0.x 的版本刷机,发现不太行,刷到后面调试模式起不来,还是得先刷入 1.2.8 的固件……

image-20231109162422507

获取路由器 stok

stoksession token 的缩写。它是用于会话验证的一个令牌,保证了用户操作的安全性。当用户登录小米路由器后台进行配置或管理时,系统会生成一个唯一的 stok,这样用户在后续的操作请求中必须提供这个令牌来证明其身份。通过使用 stok,小米路由器能够确保只有经过验证的会话才能执行敏感操作,从而防止未授权的访问和操作,增强了设备的安全性。

在登陆米家路由器管理后台(通常是 http://192.168.31.1)后,stok 会在 url 中显示出来:

image-20231113213021752

注意:每个 session 都有自己的生命周期,stok 一段时间后会自行销毁,如果遇到 403 等未授权的问题可以尝试刷新页面,获取新的 stok

后文将用 ${YOUR_STOK} 代替需要填入的 stok

开启调试模式

调试模式开启前是不可以直接 telnet 连接路由器的:

image-20231113175953173

因此我们需要先打开调试模式。在 1.2.8 版本的固件下,可以通过如下代码注入使 AX6000 打开调试模式:

1
' ; zz=$(dd if=/dev/zero bs=1 count=2 2>/dev/null) ; printf 'Z%c%c' $zz $zz | mtd write - crash ;

因此,我们在在浏览器的 url 栏中输入经过 url encode 的 url,注意替换 ${YOUR_STOK}

1
http://192.168.31.1/cgi-bin/luci/;stok=${YOUR_STOK}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20zz%3D%24%28dd%20if%3D%2Fdev%2Fzero%20bs%3D1%20count%3D2%202%3E%2Fdev%2Fnull%29%20%3B%20printf%20%27%A5%5A%25c%25c%27%20%24zz%20%24zz%20%7C%20mtd%20write%20-%20crash%20%3B%20

返回 {"code":0} 代表执行成功:

image-20231107182134768

设置 Bdata 永久开启 telnet

注入代码:

1
' ; bdata set telnet_en=1 ; bdata set ssh_en=1 ; bdata set uart_en=1 ; bdata commit ; 

我们在在浏览器的 url 栏中输入经过 url encode 的 url,注意替换 ${YOUR_STOK}

1
http://192.168.31.1/cgi-bin/luci/;stok=${YOUR_STOK}/api/misystem/set_sys_time?timezone=%20%27%20%3B%20bdata%20set%20telnet_en%3D1%20%3B%20bdata%20set%20ssh_en%3D1%20%3B%20bdata%20set%20uart_en%3D1%20%3B%20bdata%20commit%20%3B%20

浏览器请求重启

注入代码: ' ; reboot ;

在浏览器的 url 栏中输入经过 url encode 的 url,注意替换 ${YOUR_STOK}

1
http://192.168.31.1/cgi-bin/luci/;stok=${YOUR_STOK}/api/misystem/set_sys_time?timezone=%20%27%20%3b%20reboot%20%3b%20

重启中路由器蓝灯常亮,重新常亮白灯时代表重启完成,此时直接 telnet 连接路由器:

1
telnet 192.168.31.1

连接遇到问题可以尝试关闭 PC 的防火墙;正常连接如下:

image-20231107200926613

永久开启并固化 ssh

参考酱紫表的方法,我们在 telnet 成功后固化 ssh,主要通过 https://fastly.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh 脚本实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
echo -e 'admin\nadmin' | passwd root
# 将 root 密码设置为 admin
nvram set ssh_en=1
nvram set telnet_en=1
nvram set uart_en=1
nvram set boot_wait=on
nvram commit
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
/etc/init.d/dropbear restart
mkdir /data/auto_ssh
cd /data/auto_ssh
curl -O https://fastly.jsdelivr.net/gh/lemoeo/AX6S@main/auto_ssh.sh
# 下载相关脚本
chmod +x auto_ssh.sh
uci set firewall.auto_ssh=include
uci set firewall.auto_ssh.type='script'
uci set firewall.auto_ssh.path='/data/auto_ssh/auto_ssh.sh'
uci set firewall.auto_ssh.enabled='1'
uci commit firewall
uci set system.@system[0].timezone='CST-8'
uci set system.@system[0].webtimezone='CST-8'
uci set system.@system[0].timezoneindex='2.84'
uci commit
mtd erase crash
reboot

如果因为网络问题无法下载脚本,可以直接用 vi 写进 /data/auto_ssh/auto_ssh.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#!/bin/sh

auto_ssh_dir="/data/auto_ssh"
host_key="/etc/dropbear/dropbear_rsa_host_key"
host_key_bk="${auto_ssh_dir}/dropbear_rsa_host_key"

unlock() {
# Restore the host key.
[ -f $host_key_bk ] && ln -sf $host_key_bk $host_key

# Enable telnet, ssh, uart and boot_wait.
[ "$(nvram get telnet_en)" = 0 ] && nvram set telnet_en=1 && nvram commit
[ "$(nvram get ssh_en)" = 0 ] && nvram set ssh_en=1 && nvram commit
[ "$(nvram get uart_en)" = 0 ] && nvram set uart_en=1 && nvram commit
[ "$(nvram get boot_wait)" = "off" ] && nvram set boot_wait=on && nvram commit

[ "`uci -c /usr/share/xiaoqiang get xiaoqiang_version.version.CHANNEL`" != 'stable' ] && {
uci -c /usr/share/xiaoqiang set xiaoqiang_version.version.CHANNEL='stable'
uci -c /usr/share/xiaoqiang commit xiaoqiang_version.version 2>/dev/null
}

channel=`/sbin/uci get /usr/share/xiaoqiang/xiaoqiang_version.version.CHANNEL`
if [ "$channel" = "release" ]; then
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
fi

if [ -z "$(pidof dropbear)" -o -z "$(netstat -ntul | grep :22)" ]; then
/etc/init.d/dropbear restart 2>/dev/null
/etc/init.d/dropbear enable
fi
}

install() {
# unlock SSH.
unlock

# host key is empty, restart dropbear to generate the host key.
[ -s $host_key ] || /etc/init.d/dropbear restart 2>/dev/null

# Backup the host key.
if [ ! -s $host_key_bk ]; then
i=0
while [ $i -le 30 ]
do
if [ -s $host_key ]; then
cp -f $host_key $host_key_bk 2>/dev/null
break
fi
let i++
sleep 1s
done
fi

# Add script to system autostart
uci set firewall.auto_ssh=include
uci set firewall.auto_ssh.type='script'
uci set firewall.auto_ssh.path="${auto_ssh_dir}/auto_ssh.sh"
uci set firewall.auto_ssh.enabled='1'
uci commit firewall
echo -e "\033[32m SSH unlock complete. \033[0m"
}

uninstall() {
# Remove scripts from system autostart
uci delete firewall.auto_ssh
uci commit firewall
echo -e "\033[33m SSH unlock has been removed. \033[0m"
}

main() {
[ -z "$1" ] && unlock && return
case "$1" in
install)
install
;;
uninstall)
uninstall
;;
*)
echo -e "\033[31m Unknown parameter: $1 \033[0m"
return 1
;;
esac
}

main "$@"

写完之后应该就可以正常 ssh 了。

报错处理

报错:no matching host key type found
1
Unable to negotiate with 192.168.31.1 port 22: no matching host key type found. Their offer: ssh-rsa

解决方法:用特定的加密算法

1
ssh -oHostKeyAlgorithms=+ssh-rsa root@192.168.31.1

更详细的处理方法参考 stackoverflow

报错:key verification failed.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:JOh+IoT8mmlmwTQtHn8W6YS8vCa4Xy9gac18KZiExwE.
Please contact your system administrator.
Add correct host key in /Users/xiabee/.ssh/known_hosts to get rid of this message.
Offending RSA key in /Users/xiabee/.ssh/known_hosts:41
Host key for 192.168.31.1 has changed and you have requested strict checking.
Host key verification failed.
scp: Connection closed

解决方法:重新写入 key

1
ssh-keygen -R 192.168.31.1

参考 stackoverflow

重置、升级、刷机后如何恢复 SSH

无论你是升级了系统、还是恢复了出厂、还是刷了别的版本的系统或 openwrt 再刷回来,telnet 其实都是打开的,因为写在了 bdata 分区。不过 telnet 密码会恢复成默认的,我们需要通过路由器后台右下角的 SN 号来计算。这里提供一个参考网站(安全的离线计算):Miwifidev

telnet 连上以后,执行:

1
2
sed -i 's/channel=.*/channel="debug"/g' /etc/init.d/dropbear
/etc/init.d/dropbear restart

就开启了 ssh,ssh 默认密码就是上面计算出来的一样。

刷入过渡固件 x-wrt

网上有 237 佬提供的升级固件,非常好用,但是需要从 x-wrt 底包中刷入。我们现在来刷 x-wrt 过渡固件。

先查看当前固件状态。这一步需要路由器是正常联网的,首先 ssh 连接上红米 ax6000 ,执行下面的命令,查看返回的 firmware 等于 0 还是 1。

1
cat /proc/cmdline

我截图这里是 1 :

image-20231107203417947

如果是 0 执行:

1
2
3
4
5
6
7
8
9
10
11
12
nvram set boot_wait=on
nvram set uart_en=1
nvram set flag_boot_rootfs=1
nvram set flag_last_success=1
nvram set flag_boot_success=1
nvram set flag_try_sys1_failed=0
nvram set flag_try_sys2_failed=0
nvram commit
cd /tmp
curl -L https://share.qust.me/d/%E8%B7%AF%E7%94%B1%E5%99%A8/redmi-ax6000/initramfs-factory.ubi -o initramfs-factory.ubi
ubiformat /dev/mtd9 -y -f /tmp/initramfs-factory.ubi
reboot -f

如果是 1 执行

1
2
3
4
5
6
7
8
9
10
11
12
nvram set boot_wait=on
nvram set uart_en=1
nvram set flag_boot_rootfs=0
nvram set flag_last_success=0
nvram set flag_boot_success=1
nvram set flag_try_sys1_failed=0
nvram set flag_try_sys2_failed=0
nvram commit
cd /tmp
curl -L https://share.qust.me/d/%E8%B7%AF%E7%94%B1%E5%99%A8/redmi-ax6000/initramfs-factory.ubi -o initramfs-factory.ubi
ubiformat /dev/mtd8 -y -f /tmp/initramfs-factory.ubi
reboot -f

路由器重启后可以在另一个终端中查看当前 IP,直到新增 IP 出现:

1
ifconfig | grep 192

复制执行完就会重启进入过渡固件,过渡固件的后台 IP 地址可以用上述命令看到,一般是 http://192.168.15.1/cgi-bin/luci/

用户名是 admin,密码是 admin

或者用户名/密码是 root/password,都试一下,不记得了(划掉)

image-20231107205846682

刷入正式 OpenWrt

在 x-wrt 的固件升级页面里面直接刷官方的 openwrt 固件或者 237 佬的 openwrt 固件,这里我只放了原装分区版本,没有修改 uboot 分区,即使翻车了也可以用小米官方的救机工具救回。237 佬两个固件的区别详情可见他本人博客

image-20231113191710143

  • 默认ip 192.168.6.1 用户名 root 密码 password 无线密码 12345678
  • full mini版差异在于默认集成插件,其他一致。

其他问题

这里主要列举一下我刷官方 Openwrt 固件遇到的问题,237 佬的固件写的很好,没遇到问题…

后台 IP 冲突

OpenWrt 官方版安装好之后,默认的IP地址是192.168.1.1,需要我们手动修改

  1. 拔掉 wan 口入网网线,确保冲突 IP 只有路由器 openwrt 在使用;
  2. 以 root 的身份 ssh 登录 openwrt 后台
  3. 修改/etc/config/network文件:

用 vim 或其他熟悉的文本编辑器,把 option ipaddr '192,168.1.1' 改成自己需要的IP地址,如 192.168.32.1 等,然后保存退出重启路由器即可。

image-20231113213147182

没有 vim 可以用 vi,或者手动装一个 vim:

1
2
opkg update
opkg install vim

没有 WEB-UI

能够 ssh 连接路由器,但是浏览器里面打不开管理后台。可能是官方默认的 Openwrt 没有装 Luci,我们连上 ssh 直接安装:

1
2
3
4
5
6
7
8
# 更新软件包仓库信息
opkg update

# 安装 Luci
opkg install luci

# 安装 Luci 中文语言包
opkg install luci-i18n-base-zh-cn

装好后如图所示:

image-20231107220326880

SCP 报错

没有 SCP,不方便导入文件:ssh 连上去手动装一个。

1
opkg install openssh-sftp-server

最终效果

237 佬的固件还是非常好用的!

image-20231113192721613

非常喜欢这个 UI

image-20231113192832772

服务设置

IPV6 设置

OpenWrt 官方默认不支持扩展 IPV6,启用的话需要安装 ipv6-helper,参考官方文档

image-20231113193149787

OpenClash 设置

不知道是不是那啥的原因,我自己的 openclash 一直配置有问题,而且 openclash 的作者也没有对 IPV6 做有效的支持。由于我对 IPV6 执念过深,隧放弃 openclash,感兴趣的小伙伴可以参考阿修的博客

image-20231113193503203

UU 加速器设置

手机里下载一个 UU 主机加速,连上 Wi-Fi 启动即可。

image-20231113194031018

实测,UU 加速器插件目前只可以给主机加速,给 PC 加速需要另外设置,将 PC 伪装成主机。

Reference

https://qust.me/post/ax6000-shellclash/

https://openwrt.org/toh/xiaomi/redmi_ax6000

https://www.right.com.cn/forum/thread-8261104-1-1.html

https://www.hughh.top/posts/soft-routing-guide-3/

https://firmware-selector.openwrt.org/?version=23.05.0-rc4&target=mediatek%2Ffilogic&id=xiaomi_redmi-router-ax6000-stock

CATALOG
  1. 1. 背景
  2. 2. 准备工作
    1. 2.1. 硬件准备
    2. 2.2. 技术准备
  3. 3. 解锁 SSH
    1. 3.1. 确认后台地址
    2. 3.2. 升级到特定版本
    3. 3.3. 获取路由器 stok
    4. 3.4. 开启调试模式
    5. 3.5. 设置 Bdata 永久开启 telnet
    6. 3.6. 浏览器请求重启
    7. 3.7. 永久开启并固化 ssh
      1. 3.7.1. 报错处理
        1. 3.7.1.1. 报错:no matching host key type found
        2. 3.7.1.2. 报错:key verification failed.
      2. 3.7.2. 重置、升级、刷机后如何恢复 SSH
  4. 4. 刷入过渡固件 x-wrt
  5. 5. 刷入正式 OpenWrt
  6. 6. 其他问题
    1. 6.1. 后台 IP 冲突
    2. 6.2. 没有 WEB-UI
    3. 6.3. SCP 报错
  7. 7. 最终效果
  8. 8. 服务设置
    1. 8.1. IPV6 设置
    2. 8.2. OpenClash 设置
    3. 8.3. UU 加速器设置
  9. 9. Reference