原文: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:熱門機型直接找
這一步就需要大家熟練使用搜尋引擎了。
型號很好找,直接開啟 管理頁面,去網上搜尋就輕鬆找到
case2:找不到或失敗
可以嘗試一些工具,比如 針對ZTE機型的爆破工具
這裡就不重點介紹了,感興趣的自己研究
連線到光貓
下載 putty,telnet連線到192.168.1.1
賬號密碼就是上一步爆破得來的,直接輸入就行了
有的畜生光貓預設給的許可權不是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 : 1processor : 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 : 1Hardware : 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/
準備軟體
- aria2 https://hi.imzlh.top/2024/03/09.cgi
用於下載磁力、HTTP、FTP等,支援WebUI操作 clash https://hi.imzlh.top/2024/03/03.cgi
用於掛梯子代理,這裡由於與主題無關請自己折騰weblist https://hi.imzlh.top/2024/03/31.cgi已經捨棄
用於Web的遠端訪問,與natmap搭配使用moment https://hi.imzlh.top/2024/04/21.cgi已經捨棄
用於動態執行PHP指令碼和搭建網盤,體積不大於200kfrpc https://github.com/fatedier/frp/releases建議使用ddns+ipv6或natmap
將HTTP穿透出去,方便遠端訪問秘製版ctrl https://hi.imzlh.top/2024/03/23.cgi
管理程序,方便自啟動和管理任務- nginx+njs+vlist5 https://hi.imzlh.top/2024/07/17.cgi
不只是服務檔案,還可以自由擴充套件(自行編譯php-fpm) - natmap https://hi.imzlh.top/2024/05/17.cgi
IPV4打洞,搭配一個轉發服務,這不比付費的frpc穿透香?
想要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!全文完。