• 折腾指南: 将光猫改造成你的NAS,WebDAV+网页文件管理器vList5+natmap


    原文:https://hi.imzlh.top/2024/07/18.cgi (预发布)

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

    为什么会有这篇文章?

    关于为什么我会想到折腾光猫,见 https://hi.imzlh.top/2024/03/02.cgi
    这篇文章本来应该在4个月前就完成了,但是我一直都在折腾NAS软件
    其中我也尝试了很多方法,奈何时间不足断断续续的

    • WebList,前身叫做 weborf,是一个小巧的支持简单的WebDAV的程序
      我修改了一下UI和认证部分,改动不多但是性能不强,且只能服务静态文件,很快抛弃
    • MomentPHP,前身是PHPMVC,经过两个月的扩充,已经很全能了
      可惜不知道是什么原因,总是莫名其妙出点问题性能也不可乐观,上个月后就抛弃了
    • vList5,前身是vList3,同样是为了Nginx设计,只不过改成了njs作为平台
      继承了NGINX超强并发,使用了VUE绝对响应式,在昨天正式完成主要功能

    至于为什么会这么折腾,完全是因为光猫限制比较大。详细的内容看原文即可,我们现在开始吧

    准备一台光猫

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

    为光猫解锁telnet

    为什么是telnet呢

    • telnet方便,可以远程管理
    • 有些机器甚至tty串口都锁死了,只能破解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

    • 首先看 processor,有两个,是古董级双核处理器
    • 再看 model name,是Armv7l,ARM的最后一代32位处理器
    • 最后是 Features,没有vfp,就是 arm-eabi,有vfp那就是arm-eabihf
    • 最后可以了解一下CPU,通过 Hardware 可以了解,比如我这一块CPU就是

      ZX279128S是一款功能强大的SoC(System on Chip)芯片。芯片内嵌ARM Cortex A9双核处理器 以及丰富的外设,使用AXI高性能总线实现互联,CPU的频率达到1000MHz,可实现复杂协议报文的处理。

    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 -k | gunzip - > aria2
    # nginx
    curl https://hi.imzlh.top/usr/uploads/2024/07/1871251897.gz -k | gunzip - > nginx
    # natmap
    curl https://hi.imzlh.top/usr/uploads/2024/07/1468987588.gz -k | gunzip - > natmap

    配置nginx

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

    curl -Lk 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 -Lk | tar xz
    mkdir .static
    cd .static
    curl https://hi.imzlh.top/usr/uploads/2024/07/2093537519.gz -k | 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
    argv1: Public address (IPv4/IPv6)
    argv2: Public port
    argv3: IP4P
    argv4: Bind port (private port)
    argv5: Protocol (TCP/UDP)
    argv6: Private address (IPv4/IPv6)

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

    #!/bin/sh
    # 换成自己的动态重定向服务,如我的是redirect.php
    curl https://[你的服务地址]?addr=$1:$2 -k
    # 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 -k ^D

    这样就OK了

    考虑:自启动

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

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

    Filesystem 1K-blocks Used Available Use% Mounted on
    /dev/mtdblock12 30720 14464 16256 47% /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 -sk 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!全文完。

  • 相关阅读:
    【leetcode刷题记录】js-两数之和
    蓝牙学习四(广播)
    Spring Boot简介
    MySQL进阶教程汇总
    [附源码]Python计算机毕业设计Django教学辅助系统
    音视频安卓主板记录仪手持终端定制开发_基于MT6762平台解决方案
    两化融合企业申报奖励制度
    网络协议:HTTPS
    企业微信自建应用开发流程
    “时尚设计 时尚原创”首届广州(三元里)时尚设计大赛正式起航
  • 原文地址:https://www.cnblogs.com/imzlh/p/18307425