完全折腾指南: 将光猫改造成你的NAS

in 日常 with 0 comment

很久没有写完全折腾类文章了,这还得追溯到上次折腾S905L3A那会。
这篇文章很长,但是是小白级包学会。

封面

为什么会有这篇文章?

这篇文章本来应该在4个月前就完成了,但是我一直都在折腾NAS软件
其中我也尝试了很多方法,奈何时间不足断断续续的

至于为什么会这么折腾,完全是因为光猫限制比较大

感谢听我唠嗑,我们现在开始吧

准备一台光猫

这个材料很好找,一般的光猫都可以,但是有些光猫锁得很死,很考验大家的技术

为光猫解锁telnet

为什么是telnet呢

case1:热门机型直接找

这一步就需要大家熟练使用搜索引擎了。
型号很好找,直接打开 管理页面,去网上搜索就轻松找到

我的是H60G

case2:找不到或失败

可以尝试一些工具,比如 针对ZTE机型的爆破工具
这里就不重点介绍了,感兴趣的自己研究

连接到光猫

下载 putty,telnet连接到192.168.1.1
账号密码就是上一步爆破得来的,直接输入就行了

putty

有的畜生光猫默认给的权限不是root,这个时候root密码一般都是 aDm8H%MdA
建议固定到Windows剪贴板( Win标 + V )上,下一次登录就很方便了

剪贴板

为光猫干掉TR069

成功

运营商有一个坑爹的东西叫做远程管理,能批量远程配置
一旦配置下发,你可能就又得再重新配置一次了(《从0开始的折腾之旅》)
因此为了杜绝后患,必须得把远程管理这个隐患干掉

sidbg or sendcmd

我接触过两种光猫,有两种管理工具,除了名字不一样,命令是一样的
你可以试试看哪种命令适合你的光猫

sendcmd 1 DB set WANC 0 Enable 0
sidbg 1 DB set WANC 0 Enable 0

然后你也可以顺便改一下超级密码,这样下次Web端登录会更方便
(比如我家的光猫就是账号 root 密码 toor ,怎么样好记吗)

sidbg 1 DB set DevAuthInfo 0 User [账号]
sidbg 1 DB set DevAuthInfo 0 Pass [密码]

查看架构

~ $ cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 1 (v7l)
BogoMIPS : 1594.16
Features : half thumb fastmult edsp tls
CPU implementer : 0x41
CPU architecture : 7
CPU variant : 0x4
CPU part : 0xc09
CPU revision : 1

processor : 1
model name : ARMv7 Processor rev 1 (v7l)
BogoMIPS : 1594.16
Features : half thumb fastmult edsp tls
CPU implementer : 0x41
CPU architecture : 7
CPU variant : 0x4
CPU part : 0xc09
CPU revision : 1

Hardware : ZTE ZX279128 (Device Tree)
Revision : 0000
Serial : 0000000000000000

armv7,但是没有vfp,那就当作是armv5,或者说是armel,别搞错了
mips的可能稍微难搞一点,下文可能需要自己编译软件

考虑安家位置

这个很重要,划重点
根目录大多是有CRC校检的或者直接打包进内核的,bin这类文件夹大多放在根目录。所以想要重启后不消失或者不变砖,建议找/usr/data,空间也大
或者这里更建议扔到自启动脚本周围,如我的光猫就保存到/usr/local/osgi/,方便
下文默认所有文件都保存到/usr/local/osgi/,如果不是,你可能需要修改nginx配置并替换所有出现的/usr/local/osgi/

举个例子

准备软件

想要ctrl作为软件管理程序?自行参考 我写的文章
[懒人版一键复制] 这里假设你的光猫有curl自带,如果没有,参考 https://hi.imzlh.top/2024/03/02.cgi

# aria2
curl https://hi.imzlh.top/usr/uploads/2024/03/971539169.gz | gunzip - > aria2
# nginx
curl https://hi.imzlh.top/usr/uploads/2024/07/1871251897.gz | gunzip - > nginx
# natmap
curl https://hi.imzlh.top/usr/uploads/2024/07/1468987588.gz | gunzip - > natmap

配置nginx

首先,你需要安装vList5和一个fancyindex美化包,方法也非常简单
假设你的硬盘已经挂载到了/mnt,如果没有,请执行mount /dev/sda /mnt

curl -L https://github.com/imzlh/vlist-njs/releases/download/master/vlist5.js -o /usr/local/osgi/vlist.js
cd /mnt
curl https://github.com/imzlh/vList5/releases/download/main/vlist5_latest.tgz -L | tar xz
mkdir .static
cd .static
curl https://hi.imzlh.top/usr/uploads/2024/07/2093537519.gz | tar xz

关于nginx配置文件这里直接抄作业就行了,保存到 /usr/local/osgi/etc/nginx/nginx.conf
我可是研究了将近一天研究出来了这一份高性能高并发的nginx配置
(B:你似乎很骄傲啊,你知不知道,你这一句就相当于赤裸裸地在说 “快夸我,快给我三连”啊?)
(别忘了新建文件夹,mkdir /usr/local/osgi/etc/nginx/)

worker_processes                                auto;

events {
        accept_mutex                            on;
        multi_accept                            on;
        use                                     epoll;
        worker_connections                      1024;
}

http {
        include                                 mime.types;
        default_type                            application/octet-stream;
        log_format                              main '$status $remote_addr $request';
        access_log                              /tmp/nginx/access.log main;

        tcp_nopush                              off;
        tcp_nodelay                             on;

        client_max_body_size                    256m;
        client_body_buffer_size                 128m;
        client_header_timeout                   1m;
        client_body_timeout                     10m;
        send_timeout                            10m;
        reset_timedout_connection               on;
        client_body_in_file_only                clean;
        client_body_in_single_buffer            on;

        gzip                                    on;
        gzip_min_length                         1024;
        gzip_buffers                            4 128k;
        gzip_types                              text/plain;
        gzip_vary                               on;

        output_buffers                          2 128k;
        postpone_output                         1460;
        sendfile                                on;
        sendfile_max_chunk                      256k;
        directio                                4m;
        keepalive_timeout                       1h;
        open_file_cache                         max=1024 inactive=1m;
        open_file_cache_min_uses                4;

        server_tokens                           off;

        proxy_cache_path                        /tmp/nginx/cache/ levels=1:2
                                                    keys_zone=thumb:1M inactive=10h max_size=256M;
        proxy_http_version                      1.1;
        ssl_session_cache                       shared:SSL:1m;

        dav_ext_lock_zone                       zone=dav:1m timeout=1h;

        js_shared_dict_zone                     zone=njs:1m type=string;
        resolver                                114.114.114.114 223.5.5.5 8.8.8.8;

        http2_recv_buffer_size                  128k;
        http2_chunk_size                        128k;
        http3_stream_buffer_size                128k;

        server {
                listen                          81;
                # listen                          [::]:8443 ssl;
                # listen                          [::]:444 quic;
                listen                          [::]:88;


                # http2                           on;
                # http3                           on;

                # ssl_certificate                 [证书cer/crt文件];
                # ssl_certificate_key             [证书key文件];
                # ssl_protocols                   TLSv1.2 TLSv1.3;
                # ssl_buffer_size                 32k;
                # ssl_early_data                  on;
                # ssl_session_timeout             10m;

                root                            /mnt/;
                index                           index.html;

                fancyindex                      on;
                fancyindex_localtime            on;
                fancyindex_exact_size           off;
                fancyindex_header               /.static/header.html;
                fancyindex_footer               /.static/footer.html;
                fancyindex_css_href             /.static/core.css;
                fancyindex_default_sort         name;
                fancyindex_show_path            off;
                fancyindex_hide_parent_dir      on;
                fancyindex_time_format          "%y/%m/%d %H:%M";

                charset_types                   *;
                charset                         utf-8;

                dav_methods                     PUT DELETE MKCOL COPY MOVE;
                dav_ext_methods                 PROPFIND OPTIONS LOCK UNLOCK;
                dav_access                      user:rw group:rw all:r;
                create_full_put_path            on;
                dav_ext_lock                    zone=dav;

                # js_path                               lib/nginx/;
                js_import                               /usr/local/osgi/lib/nginx/vlist.js;
                js_import                               /usr/local/osgi/lib/nginx/ddns.js;
                js_fetch_buffer_size            128k;
                js_fetch_max_response_buffer_size 4m;
                js_fetch_timeout                30s;
                js_fetch_verify                 off;

                add_header      Alt-Svc                         'h3=":444"; h2=":8443"; ma=86400';
                add_header      Access-Control-Allow-Origin     * always;
                add_header      Access-Control-Allow-Headers    "Content-Type, Authorization" always;

                location = /@api/{
                        js_var                  $authkey "[请自己设一个密码]";
                        js_content              vlist.main;
                }
        }
}

PS 想要SSL? 打开注释掉的内容即可

考虑:动态更新

在这么精简的系统内,如何处理 请求更新 呢?
那只有使用 curl 才行。如果没有请使用 wget也差不多(嘛,HTTPS就别想了)

参考readme.md,这是适用于natmap地自动更新脚本的参数列表

argv[0]: Script path
argv[1]: Public address (IPv4/IPv6)
argv[2]: Public port
argv[3]: IP4P
argv[4]: Bind port (private port)
argv[5]: Protocol (TCP/UDP)
argv[6]: Private address (IPv4/IPv6)

所以脚本也很好写(保存到/usr/local/osgi/update.sh,别忘了chmod +x update.sh):

#!/bin/sh
# 换成自己的动态重定向服务,如我的是redirect.php
curl https://[你的服务地址]?addr=$1:$2
# wget也可以,但是不支https
wget http://[你的服务地址]?addr=$1:$2 -O - >> /dev/null

对于所有系统,直接使用 cat > update.sh,输完了 Ctrl+D 即可
(如果系统很好心提供了vi,那就更方便了,比如我的H60G就很良心地提供了busybox vi)

#!/bin/sh
curl https://....?addr=$1:$2 ^D

这样就OK了

考虑:自启动

除非你家的光猫 7x24 小时开机,不然难免会想要自启动
我最开始修改了etc文件夹里的文件,第一台变砖第二台直接还原。
最后很简单,直接暴力干掉插件系统就行了(java...如果你有需要建议留着)

参考了这篇文章,不仅干掉了java插件系统,大幅度优化之外还提供了自启动管理
但是还是不能照抄,因为我们的java挂载不是镜像,而是完整的磁盘分区

Filesystem1K-blocksUsedAvailableUse%Mounted on
/dev/mtdblock1230720144641625647%/usr/local/osgi

那就更好办了,直接find出手找到java文件

~ $ cd /usr/local/osgi/
/usr/local/osgi $ find ./ -name java
  ./local/j2re/bin/java

替换成以下内容就行了
(这里吐槽一下,垃圾光猫权限都不给足,还需要su升权,详情:https://hi.imzlh.top/2024/03/11.cgi

#!/bin/sh

if [ ! -f /tmp/services.log ]
then

        while true
        do
                curl -s http://www.gstatic.com/generate_204 && break
                sleep 10
        done

        echo aDm8H%MdA | su -c "/usr/local/osgi/rc.sh" -l root > /tmp/services.log &

else
        echo "services already started"
fi

exit 1

接下来是自启动脚本 /usr/local/osgi/rc.sh,这个脚本里是有root权限的
这里,我们需要启动nginx和natmap
注意 千万别忘记mkdir /tmp/nginx/,不然nginx会启动报错的

cd /usr/local/osgi/
./natmap -4 -k 8 -s stunserver.stunprotocol.org -h baidu.com -t 192.168.1.2 -p 80 -d -e update.sh
mkdir /tmp/nginx/
./nginx

建议添加一行用来挂载USB磁盘

mount /dev/sda /mnt

保存重启
OK!全文完。

Responses