中兴 F410GV9 光猫持久化 Telnet

中兴 F410GV9 恢复出厂设置后,Web 管理仍然可以正常访问,但 Telnet 会回到关闭状态。临时进入 FactoryMode 虽然能够取得 root shell,却只在当前运行周期内有效;设备重启或 FactoryMode 超时后,临时账号和 Telnet 服务都可能失效。

如果后续需要备份配置、排查服务或研究设备内部数据,更方便的做法是先通过 FactoryMode 开启一次临时 Telnet,再把 LAN 侧 Telnet 配置写入设备数据库。这样重启后可以使用自己设置的账号密码重新登录。

本文记录一次在 F410GV9 上实际验证成功的配置过程。Telnet 只对局域网开放,WAN 侧开关始终保持关闭。操作修改前建议备份现有配置。

环境与准备

本次设备和网络状态如下:

项目实测值
型号F410GV9
管理地址192.168.1.1
Web 管理HTTP 80
FactoryMode 服务HTTP 8080
Telnet 端口TCP 23
初始 Telnet 状态关闭
系统BusyBox 1.17.2
内核Linux 4.1.25,ARMv7
固件构建时间2021-08-19

电脑需要连接到光猫 LAN 侧,并与 192.168.1.1 处于同一网段。可以先确认设备在线,以及 Telnet 尚未开放:

1
2
ping 192.168.1.1
nc -vz 192.168.1.1 23

开启临时 Telnet 使用 zteOnu。准备好 Go 环境后直接使用上游源码即可:

1
2
3
git clone https://github.com/Septrum101/zteOnu.git
cd zteOnu
go test ./...

开启临时 FactoryMode Telnet

F410GV9 的普通 Web 管理位于 80,FactoryMode 接口位于 8080zteOnu 默认端口就是 8080,下面仍显式写出端口,避免把两个服务混淆。

本机实测可用的 FactoryMode 用户名是 factorymode,密码是 nE%jA@5b。这组凭据来自公开项目 zte_modem_tools 内置的默认候选表,并不是设备独有的密码,也不是 Web 管理账号。不同运营商和固件可能使用其他组合。

执行:

1
2
3
4
5
go run . \
--ip 192.168.1.1 \
--port 8080 \
--user factorymode \
--pass 'nE%jA@5b'

握手成功时,工具会依次完成 FactoryMode 复位、随机数交换、认证和模式切换,并返回一组临时 Telnet 凭据:

1
2
3
4
5
6
7
step [0] reset factory: ok
step [1] request factory mode: ok
step [2] send sq: ok
step [3] check login auth: ok
step [4] enter factory mode: ok
user: <TEMP_USER>
pass: <TEMP_PASSWORD>

输出中的 <TEMP_USER><TEMP_PASSWORD> 由设备为本次 FactoryMode 会话动态生成,每次运行都可能不同。这组账号也不是准备写入数据库的持久账号。FactoryMode 可能在数分钟后超时,拿到凭据后应尽快继续。

使用临时账号连接光猫:

1
telnet 192.168.1.1 23

成功后会看到设备型号和 BusyBox shell。先用只读命令确认权限:

1
2
id
uname -a

实测结果为:

1
2
uid=0(root) gid=0(root)
Linux F410GV9 4.1.25 #1 Thu Aug 19 13:16:08 CST 2021 armv7l GNU/Linux

检查原始 Telnet 配置

修改前先读取 TelnetCfg,记录原始值:

1
sendcmd 1 DB p TelnetCfg

恢复出厂后的关键字段如下:

1
2
3
4
5
6
Wan_Enable   = 0
Lan_Enable = 0
TS_Port = 23
TSLan_Port = 23
Max_Con_Num = 1
InitSecLvl = 0

Wan_Enable=0 表示 WAN 侧 Telnet 关闭,Lan_Enable=0 表示 LAN 侧 Telnet 也未持久开启。用户名和密码字段会被固件显示为 ******,无法从这里读出原值。

写入持久化配置

持久密码可以自定义,需要保存好,并在下面命令中替换 ROOT_TELNET_PASSWORD。回到临时 Telnet shell 后执行:

1
2
3
4
5
6
sendcmd 1 DB set TelnetCfg 0 Lan_Enable 1
sendcmd 1 DB set TelnetCfg 0 TSLan_UName root
sendcmd 1 DB set TelnetCfg 0 TSLan_UPwd ROOT_TELNET_PASSWORD
sendcmd 1 DB set TelnetCfg 0 Max_Con_Num 3
sendcmd 1 DB set TelnetCfg 0 InitSecLvl 3
sendcmd 1 DB save

这组设置只启用 LAN 侧 Telnet,没有修改 Wan_Enable。写入完成后再次检查:

1
sendcmd 1 DB p TelnetCfg

关键字段应变为:

1
2
3
4
5
6
Wan_Enable   = 0
Lan_Enable = 1
TS_Port = 23
TSLan_Port = 23
Max_Con_Num = 3
InitSecLvl = 3

用户名和密码仍然会显示为 ******,这是正常现象。此时不要仅凭当前 Telnet 仍然在线就判断成功,必须重启后重新登录,才能确认配置已经持久化。

重启并验证

确认 sendcmd 1 DB save 已经执行,再重启设备:

1
reboot

重启期间管理端口可能先接受 TCP 连接、随后立即断开,这通常只是服务尚未完全启动。等待约一分钟,再检查 Telnet 端口:

1
nc -vz 192.168.1.1 23

端口恢复后重新连接:

1
telnet 192.168.1.1 23

这次使用持久账号登录:

1
2
Login: root
Password: <ROOT_TELNET_PASSWORD>

登录后再次执行:

1
2
id
uname -a

重启后如果仍然得到 uid=0(root),说明 LAN Telnet 开关和登录凭据已经写入持久数据库,配置成功。

关闭持久化 Telnet

如果以后不再需要 Telnet,可以登录后关闭 LAN 侧开关并保存:

1
2
3
sendcmd 1 DB set TelnetCfg 0 Lan_Enable 0
sendcmd 1 DB save
reboot

如需同时恢复本文修改过的非凭据字段,也可以在保存前执行:

1
2
sendcmd 1 DB set TelnetCfg 0 Max_Con_Num 1
sendcmd 1 DB set TelnetCfg 0 InitSecLvl 0