最近真是越来越懒了,在折腾的路上越走越近,哈哈。
Wifi6上纠结了好久,曾考虑软路由+AP,但看见RT-AX86U开卖了,对比了一下RT-AX88U,这个刀法,我很满意,果断入手。华硕路由还是第一次折腾,还是记录一下吧,省的往后忘记了。
一、安装那个东西
目前RT-AX86U还没有梅林可以用,所以就现先刷了koolshare的官改,然后就是安装你们都懂的辣个东西,不过目前koolshare的软件中心的安装脚本有个关键字检查,带某些关键字的包都无法在网页端上传安装,而命令行安装又过于繁琐,所以干脆把安装脚本改了吧~
找到
/koolshare/scripts/ks_tar_install.sh 打开编辑,脚本中有一个detect_package函数,就是调用这个函数来完成关键字检查的,于是乎,只要找到调用这个函数的地方,将其注释掉即可。以1.6.1版软件中心为例,利用搜索功能,找到第71行和119行两处,开头加个#即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<del>install_tar(){ ##### ##### ##### ##### ##### #detect_package "$soft_name" ##### ##### ##### ##### ##### name=$(echo "$soft_name"|sed 's/.tar.gz//g'|awk -F "_" '{print $1}'|awk -F "-" '{print $1}') INSTALL_SUFFIX=_install</del> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<del>if [ -n "$INSTALL_SCRIPT" -a -f "$INSTALL_SCRIPT" ];then SCRIPT_AB_DIR=$(dirname $INSTALL_SCRIPT) MODULE_NAME=${SCRIPT_AB_DIR##*/} ##### ##### ##### ##### ##### #detect_package "${MODULE_NAME}" ##### ##### ##### ##### ##### echo_date 准备安装${MODULE_NAME}插件! echo_date 找到安装脚本!</del> |
然后就可以愉快的在网页端上传安装包安装了~
直接安装即可,不再需要上述步骤。安装空间如果不够可以先把压缩包里的用不到的bin文件删除。
二、路由器自身走代理
装好以后一同配置猛如虎(这个版本的webgui功能整合的相对不错,dns方面的配置也比较齐全,理解难度也不大,这里我就不讲了)用起来还不错。可是用着用着发现,路由器自身咋没走代理啊,这个有点蛋疼。于是连上SSH研究了一番,发现了解决办法。
在 /koolshare/ss/postscripts/ 目录下新建 /koolshare/ss/postscripts/P01proxyrouterself.sh ,以上面的模板为基础修改即可。做的事情也很简单,给OUTPUT链加一条规则,跳转到SHADOWSOCKS链即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/sh source /koolshare/scripts/ss_base.sh start_proxyrouterself(){ echo_date "add iptables rules to proxy router itself" iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS } stop_proxyrouterself(){ echo_date "stop proxy router itself" iptables -t nat -D OUTPUT -p tcp -j SHADOWSOCKS } #------------------------------------------ case $1 in start) start_proxyrouterself ;; stop) stop_proxyrouterself ;; esac |
停止的时候不用任何动作,因为停的时候,原本的脚本会把SHADOWSOCKS相关的链都给删掉,包括这个脚本加的这条,所以这个后处理脚本无需任何动作。
其中 -m multiport --dport 22:1023 的作用是只有低端口走代理,还可以改成 -m multiport --dport 22,80,443 这样可以只代理SSH、HTTP、HTTPS,如果不需要可以删除
OK,关掉代理再打开,就可以了。测试一下: curl https://wwww.google.com/
三、清理空间
本人用的这个版本是fancyss改的,加了trojan的支持,依然是带了一堆诸如kcp加速、v2ray、trojan-go、ssr等我用不到的,这些很多都是golang写的,编译出来的二进制体积巨大,整个包安完占了30MB左右的空间,遂直接到 /koolshare/bin 目录下把这些个软件的文件直接删除,实测只要你不用到这几个,删除不会造成影响,删完看一下,jffs占用从30多MB降到了13MB,舒服了。后面可以搞一些自己用得到的东西放进去
四、搞个Let’s Encrypt证书
koolshare的软件中心是有这个软件的,直接安装就行了,软件后端用的是开源shell脚本程序:acme.sh
然而发现koolshare的这个版本把dns api的支持阉割了,少了很多;我用的是dnsimple,这里面是没有的,于是再次连上SSH开始研究。
找到 /koolshare/webs/Module_acme.asp 打开编辑,找到下面的部分,高亮的行里的文本添加了DNSimple的相关内容。DNSimple的API key只有一个,填写是网页中填在第一个位置即可,第二个位置留空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
//仅列出了部分行,有修改的是高亮的行 <script> var x = 6; var basic_action; var _responseLen; var noChange = 0; var httpd_cert_info = [ <% httpd_cert_info(); %> ][0]; var db_acme = {} var params_input = ["acme_subdomain", "acme_domain", "acme_provider", "acme_ali_arg1", "acme_ali_arg2", "acme_dp_arg1", "acme_dp_arg2", "acme_xns_arg1", "acme_xns_arg2", "acme_cf_arg1", "acme_cf_arg2", "acme_gd_arg1", "acme_gd_arg2", "acme_ds_arg1", "acme_ds_arg2"]; var params_check = ["acme_enable"]; //中间省略若干行 function update_visibility(r) { trs= ["", "ali", "dp", "xns", "cf", "gd", "ds"]; pvd= E("acme_provider").value; for (var i = 1; i < trs.length; i++) { if(pvd == i){ E("acme_" + trs[i] + "_arg1_tr").style.display = ""; E("acme_" + trs[i] + "_arg2_tr").style.display = ""; }else{ E("acme_" + trs[i] + "_arg1_tr").style.display = "none"; E("acme_" + trs[i] + "_arg2_tr").style.display = "none"; } } } //中间省略若干行 function save(){ if(!E("acme_subdomain").value){ alert("字域名不能为空!"); return false; } if(!E("acme_domain").value){ alert("主域名不能为空!"); return false; } if(E("acme_provider").value == "1"){ if(!E("acme_ali_arg1").value || !E("acme_ali_arg2").value){ alert("输入框不能为空!"); return false; } } else if (E("acme_provider").value == "2"){ if(!E("acme_dp_arg1").value || !E("acme_dp_arg2").value){ alert("输入框不能为空!"); return false; } } else if (E("acme_provider").value == "3"){ if(!E("acme_xns_arg1").value || !E("acme_xns_arg1").value){ alert("输入框不能为空!"); return false; } } else if (E("acme_provider").value == "4"){ if(!E("acme_cf_arg1").value || !E("acme_cf_arg1").value){ alert("输入框不能为空!"); return false; } } else if (E("acme_provider").value == "5"){ if(!E("acme_gd_arg1").value || !E("acme_gd_arg1").value){ alert("输入框不能为空!"); return false; } } else if (E("acme_provider").value == "6"){ if(!E("acme_ds_arg1").value){ alert("输入框不能为空!"); return false; } } for (var i = 0; i < params_input.length; i++) { if(E(params_input[i])){ db_acme[params_input[i]] = E(params_input[i]).value } } for (var i = 0; i < params_check.length; i++) { db_acme[params_check[i]] = E(params_check[i]).checked ? '1' : '0'; } push_data(db_acme, 1); } //中间省略若干行 <tr> <th>DNS服务商</th> <td> <select name="acme_provider" id="acme_provider" class="input_option" onchange="update_visibility();"> <option value="1">阿里DNS(万网)</option> <option value="2">Dnspod</option> <option value="3">CloudXNS</option> <option value="4">CloudFlare</option> <option value="5">GoDaddy</option> <option value="6">DNSimple</option> </select> </td> </tr> //中间省略若干行 <tr id="acme_gd_arg2_tr" style="display: none;"> <th>GoDaddy Secret</th> <td> <input type="password" class="input_ss_table" id="acme_gd_arg2" name="acme_gd_arg2" autocomplete="new-password" autocorrect="off" autocapitalize="off" maxlength="100" value="" onBlur="switchType(this, false);" onFocus="switchType(this, true);"> </td> </tr> <tr id="acme_ds_arg1_tr" style="display: none;"> <th>DNSimple OAuth Key</th> <td> <input type="password" class="input_ss_table" id="acme_ds_arg1" name="acme_ds_arg1" autocomplete="new-password" autocorrect="off" autocapitalize="off" maxlength="100" value="" onBlur="switchType(this, false);" onFocus="switchType(this, true);"> </td> </tr> <tr id="acme_ds_arg2_tr" style="display: none;"> <th>Leave Empty</th> <td> <input type="password" class="input_ss_table" id="acme_ds_arg2" name="acme_ds_arg2" autocomplete="new-password" autocorrect="off" autocapitalize="off" maxlength="100" value="" onBlur="switchType(this, false);" onFocus="switchType(this, true);"> </td> </tr> |
asp只是web界面,传递参数给后端,后端是shell脚本,还是要修改的,找到 /koolshare/scripts/acme_config.sh 编辑,添加高亮的部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
start_issue(){ case "${acme_provider}" in 1) # ali_dns echo_date "使用Aliyun dns接口申请证书..." sed -i '/Ali_Key/d' /koolshare/acme/account.conf sed -i '/Ali_Secret/d' /koolshare/acme/account.conf echo -e "Ali_Key='${acme_ali_arg1}'\nAli_Secret='${acme_ali_arg2}'" >> /koolshare/acme/account.conf dnsapi=dns_ali ;; 2) # dnspod echo_date "使用Dnspod接口申请证书..." sed -i '/DP_Id/d' /koolshare/acme/account.conf sed -i '/DP_Key/d' /koolshare/acme/account.conf echo -e "DP_Id='${acme_dp_arg1}'\nDP_Key='${acme_dp_arg2}'" >> /koolshare/acme/account.conf dnsapi=dns_dp ;; 3) # cloudxns echo_date "使用CloudXNS接口申请证书..." sed -i '/CX_Key/d' /koolshare/acme/account.conf sed -i '/CX_Secret/d' /koolshare/acme/account.conf echo -e "CX_Key='${acme_xns_arg1}'\nCX_Secret='${acme_xns_arg2}'" >> /koolshare/acme/account.conf dnsapi=dns_cx ;; 4) # cloudflare echo_date "使用CloudFlare接口申请证书..." sed -i '/CF_Key/d' /koolshare/acme/account.conf sed -i '/CF_Email/d' /koolshare/acme/account.conf echo -e "CF_Key='${acme_cf_arg1}'\nCF_Email='${acme_cf_arg2}'" >> /koolshare/acme/account.conf dnsapi=dns_cf ;; 5) # godaddy echo_date "使用GoDaddy接口申请证书..." sed -i '/GD_Key/d' /koolshare/acme/account.conf sed -i '/GD_Secret/d' /koolshare/acme/account.conf echo -e "GD_Key='${acme_gd_arg1}'\nGD_Secret='${acme_gd_arg2}'" >> /koolshare/acme/account.conf dnsapi=dns_gd ;; 6) # dnsimple echo_date "使用DNSimple接口申请证书..." sed -i '/DNSimple_OAUTH_TOKEN/d' /koolshare/acme/account.conf echo -e "DNSimple_OAUTH_TOKEN='$acme_ds_arg1'" >> /koolshare/acme/account.conf dnsapi=dns_dnsimple ;; esac sleep 1 cd ${acme_root} #./acme.sh --home "$acme_root" --issue --dns $dnsapi -d $acme_domain -d $acme_subdomain.$acme_domain --use-wget --log-level 2 --debug ./acme.sh --home "${acme_root}" --issue --dns ${dnsapi} -d ${acme_subdomain}.${acme_domain} --use-wget --insecure } |
然后还需要到acme.sh的github repo,把dnsimple的dns api脚本文件下载下来放到 /koolshare/acme/dnsapi 目录下
最后运行一下看不报错就行,最后证书会放在 /koolshare/acme/你的域名/ 目录下。
五、跑个trojan服务端
嗯,因为个人需求,需要路由器上跑个服务端,然而这个fancyss偏偏没这个功能。ss-server直接没有二进制文件,本人又暂时没搞定asuswrt的交叉编译,遂放弃。转trojan吧,这个服务端客户端都是同一个文件。由于系统的自启还没太搞清楚,遂直接利用前面提到的postscripts功能,让fancyss帮我启动trojan服务端。(其实只是跑服务端的话,用不到下载改版的fancyss,直接到这里下编译好的trojan即可:https://github.com/hq450/fancyss/tree/master/trojan)
在 /koolshare/configs 目录下建立trojan的服务端配置文件 trojan-server.json ,注意修改一下cert、key文件的位置,local_port改成你希望的端口号,password改成你的密码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
{ "run_type": "server", "local_addr": "0.0.0.0", "local_port": 8088, "remote_addr": "127.0.0.1", "remote_port": 80, "password": [ "nidemima" ], "log_level": 2, "ssl": { "cert": "/koolshare/acme/你的域名/fullchain.cer", "key": "/koolshare/acme/你的域名/你的域名.key", "key_password": "", "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384", "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", "prefer_server_cipher": true, "alpn": [ "h2", "http/1.1" ], "alpn_port_override": { "h2": 81 }, "reuse_session": true, "session_ticket": false, "session_timeout": 600, "plain_http_response": "", "curves": "", "dhparam": "" }, "tcp": { "prefer_ipv4": false, "no_delay": true, "keep_alive": true, "reuse_port": false, "fast_open": false, "fast_open_qlen": 20 }, "mysql": { "enabled": false, "server_addr": "127.0.0.1", "server_port": 3306, "database": "trojan", "username": "trojan", "password": "", "key": "", "cert": "", "ca": "" } } |
由于我客户端时windows连的,fast-open的支持是个问题,所以服务端干脆也不开了。
最后是自启动,新建 /koolshare/ss/postscripts/P02trojanserver.sh 写入如下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#!/bin/sh start_trojanserver(){ start-stop-daemon -S -q -b -m \ -p /tmp/var/trojan-server.pid \ -x /koolshare/bin/trojan \ -- -c /koolshare/configs/trojan-server.json iptables -I INPUT -p tcp --dport 8088 -j ACCEPT iptables -I INPUT -p udp --dport 8088 -j ACCEPT } stop_trojanserver(){ iptables -D INPUT -p tcp --dport 8088 -j ACCEPT iptables -D INPUT -p udp --dport 8088 -j ACCEPT kill -TERM `cat /tmp/var/trojan-server.pid` } case $1 in start) start_trojanserver ;; stop) stop_trojanserver ;; esac |
start命令使用start-stop-daemon管理程序后台运行,并添加防火墙规则,允许端口传入,stop命令则是删除iptables规则并杀掉进程
端口号暂时硬写到代码里了,以后有如果有精力再改写成参数化,从配置文件读取吧
最后就是重启一下fancyss,netstat -lnp看一下trojan成功运行就可以了,最后上客户端连一下试试就行了
13 条评论