1.需求介绍
2.解锁SSH
    (1)降回开发版固件
    (2)连接SSH
3.固化SSH
    (1)备份 Bdata 和 crash 分区
    (2)修改 Bdata 和 crash 
    (3)刷入 Bdata 和 crash 
    (4)切换系统版本
    (5)稳定版固件固化SSH
4.其他设置
附录:小米路由器修复工具的使用

本文首发于个人博客https://lisper517.top/index.php/archives/58/,转载请注明出处。
本文的目的是为小米AX6S路由器固化SSH,这样即使升级官方固件,SSH也会开放。
本文实验日期2022年10月11日,电脑为windows10系统。

1.需求介绍

在之前 寝室多设备连接校园网的解决方案 一文中,曾经为小米路由器4C刷上原版openwrt固件(固件可以理解为操作系统),在路由器上运行脚本实现校园网自动拨号、保持连接。实际上,如果使用性能更好的路由器,刷上其他固件以后还能做很多其他事情,但这一切都要通过基础的SSH来进行;可是路由器刷上其他固件后,由于不如原厂固件贴合,常常有路由器重启、wifi信号弱等问题。
综上,使用原厂固件,优点是系统稳定,缺点是没有打开SSH、自由度不高;使用其他固件可以打开SSH、得到更多功能,但缺点是不如原厂固件稳定、wifi信号差。所以,在使用原厂固件的情况下开启SSH功能,成为一个比较折衷的选择。
本文的目的就是对AX6S路由器,在使用原厂固件时打开SSH功能,并且将SSH功能固化,即使原厂固件升级或者路由器重启时也保持SSH打开。操作步骤和工具完全参考了 这个项目 。该项目包含的文件可到原网页下载,或者使用 笔者的备份 进行下载。本文中不含图片,项目中的md文档包含图片,更加直观。
另外需要说明的是,不同厂家或者不同型号的路由器,开启SSH的方法不尽相同,其他型号的路由器打开SSH不能完全使用本文的方法。

2.解锁SSH

对于小米AX6S路由器,一般是把原厂固件降回开发版固件(默认开启Telnet和SSH功能),然后用SN号计算出root密码,连接到SSH。

(1)降回开发版固件

浏览器进入AX6S主页:192.168.31.1,找到 常用设置 -> 系统状态 -> 升级检测 ,点击 手动升级 -> 选择文件 ,选择 miwifi_rb03_firmware_stable_1.2.7.bin 这个文件上传、开始升级。这个文件在 小米路由器官网 无法找到,因为现在AX6S和许多其他型号都不提供开发版固件下载(目前好像只有AX9000,就是售价1299¥的那款路由器提供开发版固件)。但是它的小米路由器修复工具挺不错的,救砖能力强大,建议下载一个,网址为 https://bigota.miwifi.com/xiaoqiang/tools/MIWIFIRepairTool.x86.zip
升级过程中注意路由器不要断电了。升级的同时,到 root密码计算网站 ,输入AX6S下方标签贴的SN号(或者在路由器管理页面也可以看到),经过一定计算得出root密码(小米官方固件的开发版都可以这样得到root密码)。路由器升级完成后指示灯会重新变蓝,刷新一下 192.168.31.1 可以确认,管理密码是一样的,但是能看到背景里有水印:only for test。

(2)连接SSH

使用putty.exe,ip为 192.168.31.1 ,端口就是22,进行连接。但有时开发版也可能只开启了Telnet、未打开SSH,那么就需要用Telnet开启SSH。
对于win10机器,在 windows设置 里搜索 启用或关闭windows功能 ,在下面的框中勾选 Telnet 客户端 后确定,这样就开启了Telnet功能。然后在cmd中输入 telnet 192.168.31.1 ,输入root和密码即可用telnet连接到AX6S。接下来进行如下操作以解锁SSH:

nvram set telnet_en=1
nvram set ssh_en=1
nvram set uart_en=1
nvram set boot_wait=on
nvram commit
/etc/init.d/dropbear enable
/etc/init.d/dropbear start

再次使用putty连接AX6S的SSH,成功。

至此,SSH解锁成功。为了让原厂固件升级后或路由器重启后SSH功能也保持开启,还需要进行一些额外操作。

3.固化SSH

以下的命令使用SSH或Telnet输入都可以。

(1)备份 Bdata 和 crash 分区

使用 cat /proc/mtd 查看 Bdata 和 crash 对应的dev名,笔者实验时分别为 mtd5 和 mtd7 。接下来使用如下命令备份它们:

nanddump -f /tmp/Bdata_mtd5.img /dev/mtd5
nanddump -f /tmp/crash_mtd7.img /dev/mtd7

如果 mtd5 和 mtd7 不是你的 Bdata 和 crash 对应的dev名,记得更改。然后用WinSCP连接到AX6S(文件协议选SCP),到/tmp下将 Bdata_mtd5.img 和 crash_mtd7.img 这两个备份的文件保存到windows机器上。在进一步改动之前,再额外把这两个文件备一份副本。

(2)修改 Bdata 和 crash

使用HxD.exe打开 crash_mtd7.img ,将开头的四位改成 A5 5A 00 00 后保存。

对于 Bdata_mtd5.img 要稍微复杂一点。同样用HxD.exe打开,进行下列操作:
将 telnet_en、ssh_en、uart_en 的值都从 0 修改为 1 。(在右侧)
复制字符串 boot_wait=on ,粘贴到末尾。具体是复制这串字符,把鼠标移到 b74_5G.. 的两个小数点中间,单击右键,选择 覆盖方式粘贴 。
点击工具栏的 编辑 -> 选择块 ,起始偏移输入 4 ,结束偏移输入 FFFF ,点击确定。
点击工具栏的 分析 -> 校验码 ,选择 CRC-32 ,点击确定。
下方会弹出一个框,有一列校验和,假设这个校验和为 12345678 ,就把它逆序后输入到前4位,也就是说前四位应该修改为 78 56 34 12 。
最后,点击保存。

(3)刷入 Bdata 和 crash

使用WinSCP将修改好的 crash_mtd7.img 放回到/tmp下,覆盖原来的文件,然后执行以下命令:

mtd -r write /tmp/crash_mtd7.img crash

AX6S会自己重启。之后重新用putty、WinSCP连接,同样把修改好的 Bdata_mtd5.img 放回到/tmp下,然后执行以下命令:

mtd -r write /tmp/Bdata_mtd5.img Bdata

AX6S也会重启。再次用putty连接,输入以下命令:

mtd erase crash #可以修复指示灯不亮等问题。笔者实验时,开启SSH后Internet灯就没亮过,使用这条命令后能亮
reboot

AX6S再次重启。

(4)切换系统版本

实际上这里的开发版也可以切换到稳定版,只是换一下启动分区。putty使用如下命令:

nvram get flag_last_success

如果返回值为1,说明现在开发版系统的分区号为1,则稳定版的分区号为0。使用如下命令切换到稳定版:

nvram set flag_last_success=0
nvram set flag_boot_rootfs=0
nvram commit
reboot

路由器会重启。

如果 nvram get flag_last_success 返回0,那么把后面4条命令中的前两条最后一个数字从0换成1即可。

(5)稳定版固件固化SSH

经过刚才的步骤,我们使用稳定版也可以开启SSH了。但是默认情况下稳定版的SSH是关闭的,你可以使用Telnet连接AX6S,并用下面的命令临时开启SSH:

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

这样虽然开启了SSH,但重启路由器后SSH又会关闭。解决办法是写一个开启SSH的脚本,路由器开机后自动运行该脚本、开启SSH。使用上面的命令临时开启SSH,然后进行如下操作:

mkdir /data/auto_ssh
vi /data/auto_ssh/auto_ssh.sh

复制如下内容(复制后,选中putty框,按一下i,shift+鼠标右键粘贴):

#!/bin/sh

host_key=/etc/dropbear/dropbear_rsa_host_key
host_key_bk=/data/auto_ssh/dropbear_rsa_host_key

# 如果存在备份的SSH密钥,将备份的密钥链接到dropbear使用的密钥
if [ -f $host_key_bk ]; then
    ln -sf $host_key_bk $host_key
fi

# 当前固件为稳定版时,需要执行下面命令开启SSH
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
    /etc/init.d/dropbear restart
fi

# 备份SSH密钥
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

按esc,按shift+:,输入wq后按enter即可保存。再进行下列操作:

chmod +x /data/auto_ssh/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

这样,就写了一个开启SSH的脚本,并把它添加到开机自启的服务中了,现在可以使用 reboot 重启,看看是否在重启后能连上SSH。
如果恢复出厂设置,或者再次刷机后,脚本会消失,自己重新添加一下、设置开机自启就行了。

如果要关闭开机自启SSH,使用如下命令:

uci delete firewall.auto_ssh
uci commit firewall
reboot

最后,原文还介绍了安装shellclash和刷入openwrt的方法,感兴趣的可参考md文件或 github原址

4.其他设置

为了安全性,需要进行一些设置。
passwd root 为root用户更改密码,建议改的复杂一点。

另外,建议SSH使用密钥登录、禁止密码登录。下面的内容看不懂也没关系,一般来说用复杂的root密码已经够了(除非你用DDNS或其他方式把路由器开放到公网)。
在为AX6S设置SSH前需要了解,小米路由器的原厂固件是从openwrt改来的(官方介绍是这样说的),对于openwrt,管理SSH的工具是dropbear;或者你也可以直接更改 /etc/config/dropbear ,可以把这个文件当成 /etc/ssh/sshd_config ,但是格式上不同。
使用puttygen生成一个公钥和私钥,然后putty连接AX6S后进行如下操作:

vi /etc/dropbear/authorized_keys

把公钥复制到这里,然后试试能否用putty密钥连接AX6S,注意一定要用密钥连接上再进行接下来的操作。有时会提示 server refused our key ,但是你还是能输入root的密码登录SSH,这种情况不算是密钥登录。
然后看一下默认的SSH设置:

vi /etc/config/dropbear

笔者实验时,原来的设置为:

config dropbear
        option PasswordAuth 'on'
        option RootPasswordAuth 'on'
        option Port         '22'
        option BannerFile   '/etc/banner'

参考 openwrt官网docs 可以了解更多。
下面关闭密码登录:

uci set dropbear.@dropbear[0].PasswordAuth="0"
uci set dropbear.@dropbear[0].RootPasswordAuth="0"
uci commit dropbear
/etc/init.d/dropbear restart

最后,笔者实验时发现,每次路由器重启后, /etc/dropbear/authorized_keys 这个文件会被删除掉,导致无法用密钥连接。这个问题可以修改 /data/auto_ssh/auto_ssh.sh 开机脚本来解决:

vi /data/auto_ssh/auto_ssh.sh

在开头添加几行,最后全文件如下:

#!/bin/sh

echo "你的公钥" > /etc/dropbear/authorized_keys
#添加其他公钥,使用如下命令
#tee -a /etc/dropbear/authorized_keys < "其他公钥"

host_key=/etc/dropbear/dropbear_rsa_host_key
host_key_bk=/data/auto_ssh/dropbear_rsa_host_key

# 如果存在备份的SSH密钥,将备份的密钥链接到dropbear使用的密钥
if [ -f $host_key_bk ]; then
    ln -sf $host_key_bk $host_key
fi

# 当前固件为稳定版时,需要执行下面命令开启SSH
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
    /etc/init.d/dropbear restart
fi

# 备份SSH密钥
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

最后,虽然SSH用密钥连接,但是telnet还开着、可用密码连接,是一个隐患。如果想关闭telnet,笔者的方法是:

crontab -e

在里面添加一行 * * * * * /etc/init.d/telnet stop ,这样每分钟关闭一次telnet服务,虽然有点笨拙,但至少telnet不会常开了;或者你也可以用iptables关闭telnet使用的23端口。

附录:小米路由器修复工具的使用

可能由于本文中修改了 Bdata 和 crash 分区,所以无法使用修复工具,这点要注意。
对小米路由器来说其实不太担心变砖,可以自由刷机,因为小米路由器修复工具很好用,下面讲讲修复工具的使用。
到官网下载小米路由器修复工具,解压后会报毒,选择 允许在设备上 。到官网下载小米路由器的固件,将电脑连接到路由器(连到路由器的LAN口),断开其他所有网线,运行exe文件,开始刷机。刷机过程中也注意不要断电,有UPS的可以用上。
上传刷机包 即选择固件,选择刚才下载的固件; 网卡设置 中,注意选择正确的网卡(比如你的电脑上装了虚拟机,可能显示其他网卡,注意选择有线连接到路由器LAN口的那张网卡); 到 刷机步骤 界面,断开路由器电源,按住reset键后接通路由器电源,直到橙灯闪烁松开reset键(对于路由器Mesh是紫灯长亮时),再等待5-8min,成功修复后路由器灯会变蓝闪烁,下面的文本框中会出现新的提示,这时路由器再断电重启。
这样就成功拯救小米路由器了。由于这个工具的存在,其他路由器可能已经变砖,小米路由器却还能救回来。

标签: 路由器, SSH

添加新评论