CN_SZTL's Blog

A blog created by CN_SZTL.


Explore Me
CN_SZTL's Blog
A blog created by CN_SZTL.
5
7
10

准备

  • 一台搭载了 OpenWrt 系统的无线路由器(下称路由 A)
  • 红米 AX3000 (aka. AX6)(下称路由 B)
  • 一台支持网线连接的电脑(下称电脑)
  • 完整的 shell-script/unlock-redmi-ax3000 源码(下称源码)

步骤

1. 登入路由 B 后台,检查固件版本。
推荐的版本号为:MiWiFi 稳定版 1.0.18(点此下载),本教程仅保证在该版本下有效
若版本号不匹配,请先升级 / 降级固件。

2. 将电脑与路由 A 通过有线连接
进入源码目录,假设路由 A 地址为 192.168.1.1,在电脑上执行命令:

scp wireless.sh root@192.168.1.1:/root/wireless.sh

scp transfer wireless.sh script
然后通过 SSH 连接,执行下面的命令(按回车确认):
警告: 执行本脚本会更改您的网络和无线设定,执行之前请务必备份相关数据

sh /root/wireless.sh

execute wireless.sh

3. 将电脑与路由 A 断开,转接到路由 B
登入路由器后台,获取 STOK
http://192.168.31.1/cgi-bin/luci/;stok=xxx 其中的 xxx 即为 STOK)
然后 依次 访问下面的 URL(STOK 不含尖括号):
注意:这可能需要花费一点时间,并且有几率失败,请多尝试几次

http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/extendwifi_connect?ssid=MEDIATEK-ARM-IS-GREAT&password=ARE-YOU-OK

如出现 connect success 则代表路由 B 已成功连接到路由 A,可以继续访问下一个 URL:
routerB connect success

http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/xqsystem/oneclick_get_remote_token?username=xxx&password=xxx&nonce=xxx

如出现下图中的内容,则代表 SSH 开启成功
enable ssh on routerB successfully

4. 将必要文件传输至路由 B
刷新路由 B 后台界面,此时 5GHz 无线连接密码已经被自动更改为 SSH 登录密码
ssh pwd
进入源码目录,在电脑上执行下列命令:

scp ax3000.sh root@192.168.31.1:/etc/ax3000.sh
scp fuckax3000 root@192.168.31.1:/etc/fuckax3000

然后通过 SSH 连接,执行下列命令:

sh /etc/ax3000.sh dump

ax3000 dump
脚本会自动导出备份数据,请通过下面的地址保存以防万一:

http://192.168.31.1/backup/log/bdata_mtd9.img

5. 固化 Telnet/SSH 访问权限
默认情况下,当路由器恢复出厂设置或者升级后,相关权限将会丢失,因此我们需要额外的操作以保留它们
通过 SSH 连接路由 B,执行下面的命令:

sh /etc/ax3000.sh unlock
路由器会自行重启,重启后执行
sh /etc/ax3000.sh hack

6. 挂载 overlay 空间
方便安装各种软件包和你想要的一些功能
通过 SSH 连接路由 B,执行下面的命令:

sh /etc/ax3000.sh mount
自行重启路由器,然后执行
sh /etc/ax3000.sh keep

7. (可选)更换 dists 源
小米固件内的 dists 源已经非常老旧且不推荐使用,更换到最新源即可享受在线安装 xray-core 等权利
将路由 B 的 /etc/opkg/distfeeds.conf 文件更改为如下内容:

src/gz openwrt_base http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/base
src/gz openwrt_luci http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing http://downloads.openwrt.org/snapshots/packages/aarch64_cortex-a53/routing

运行 opkg update 后即可愉快食用。


引用

safe-rm 是一个开源软件用来替代不太安全的 rm

$ rm -rf /etc/
safe-rm: skipping /etc/


safe-rm 项目地址:http://freecode.com/projects/safe-rm

CentOS: 请自行通过源码安装。

Debian / Ubuntu 可通过apt进行安装:

$ sudo apt install safe-rm

安装完毕后,由于 safe-rm 并不会主动替换原 rm 文件,且在 $PATH 中存在优先级问题,因此我们需要手动更改文件位置以确保其生效

# 更改原 rm 程序位置
$ sudo mv -f "/bin/rm" "/bin/rm-orig"
# 定义 rm 程序位置(请自行将 /usr/bin/safe-rm 改为 safe-rm 真实所在位置)
$ sudo sed -i "s#my \$real_rm = '/bin/rm';#my \$real_rm = '/bin/rm-orig';#g" "/usr/bin/safe-rm"
# 添加删除确认参数(请自行将 /usr/bin/safe-rm 改为 safe-rm 真实所在位置)
$ sudo sed -i "s/my \$status = system \$real_rm, @allowed_args;/my \$status = system \$real_rm, '-i', @allowed_args;/g" "/usr/bin/safe-rm"
# 建立软链接,使用 safe-rm 代替 rm(请自行将 /usr/bin/safe-rm 改为 safe-rm 真实所在位置)
$ sudo ln -sf "/usr/bin/safe-rm" "/bin/rm"

你可以在 ~/.config/safe-rm/etc/safe-rm.conf 中配置路径黑名单,定义哪些不能被 safe-rm 删除

$ cat "~/.config/safe-rm"
/home/CN_SZTL/project
/home/CN_SZTL/source
...

$ cat "/etc/safe-rm.conf"
/
/bin
...

最后,该程序并非万无一失,你可以配合其他程序(如 trash-cli 等)混合使用,以进一步提高安全性。


参考来源

运维管理之防止"rm -rf /" 误删除
重命名rm命令,防止误删

前言

实现方法来自GitHub:yangchuansheng/love-gfw

love-gfw中提供了很多种智能分流方法,但使用gotun2socks算是其中较为方便的一种,因为在之前尝试使用其他方法都失败了
本文采用Shadowsocks实现与外网通讯,如有需要,你也可以换成其他的软件,例如Gost/ShadowsocksR/V2Ray等。
本教程基于Debian10 x86_64环境建立,其他环境大同小异。


1.切换至ROOT用户(已是ROOT用户请无视)

sudo su

2.更新系统环境&校对时间

apt-get update -y && apt-get upgrade -y && apt-get dist-upgrade -y
apt-get install -y ca-certificates wget curl vim nano ntpdate git golang haveged proxychains
cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && ntpdate time.nist.gov

3.安装shadowsocks-libev

apt-get install shadowsocks-libev -y
systemctl stop shadowsocks-libev && systemctl disable shadowsocks-libev
rm -f /lib/systemd/system/shadowsocks-libev.service
systemctl daemon-reload

4.配置shadowsocks-libev

cd /etc/shadowsocks-libev && vim /etc/shadowsocks-libev/config.json

不过多解释,懂的人都懂,这里举个简单的例子(实际填写请去除“//”及之后的内容):

{
    "server":"1.1.1.1", // SS服务器IP
    "mode":"tcp_and_udp", // 同时监听TCP&UDP协议
    "server_port":11451, // SS服务器端口
    "local_port":1080, // 本地监听端口
    "password":"GFWNM$L-114514-1919810", // 连接密码
    "timeout":300,
    "fast_open":true, // 启用TCP快速打开(可选)
    "method":"aes-128-gcm" // 加密协议
}

5.配置ss-local

将下面的内容写入到/etc/systemd/system/ss-local.service

[Unit]
Description=Shadowsocks-Libev Client Service
After=network.target

[Service]
User=nobody
Group=nogroup
LimitNOFILE=1048576
CapabilityBoundingSet=~CAP_SYS_ADMIN
ExecStart=/usr/bin/ss-local -u -c /etc/shadowsocks-libev/config.json

[Install]
WantedBy=multi-user.target

然后执行:

systemctl enable ss-local && systemctl start ss-local

现在让我们执行下面这条命令看看效果吧,其中1080为本地监听端口号

> curl -s --socks5 127.0.0.1:1080 google.com

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

如一切无误,此时ss-local已经开始正常工作。

6.安装 gotun2socks

sed -i '/127.0.0.1 9050/d' /etc/proxychains.conf
echo -e "socks5 127.0.0.1 1080" >>/etc/proxychains.conf
proxychains go get github.com/yinghuocho/gotun2socks/bin/gotun2socks
mv -f /root/go/bin/gotun2socks /usr/bin/gotun2socks
rm -rf /root/go

7.获取中国IP段

cd /etc/shadowsocks-libev

将下面的内容写入到 /etc/shadowsocks-libev/get_cn_ip.sh

#!/bin/bash
wget -c https://ftp.apnic.net/stats/apnic/delegated-apnic-latest
cat delegated-apnic-latest | awk -F '|' '/CN/&&/ipv4/ {print $4 "/" 32-log($5)/log(2)}' | cat > /etc/shadowsocks-libev/cn_rules.conf

然后执行

chmod +x /etc/shadowsocks-libev/get_cn_ip.sh && /etc/shadowsocks-libev/get_cn_ip.sh

8.配置路由表启动、删除脚本&环境变量

cd /etc/shadowsocks-libev

将下面的内容写到/etc/shadowsocks-libev/start-socksfwd

#!/bin/bash

source /etc/shadowsocks-libev/socksfwd

ip route add "$SOCKS_SERVER" via "$GATEWAY_IP"

for i in $(cat /etc/shadowsocks-libev/cn_rules.conf)
do
ip route add "$i" via "$GATEWAY_IP"
done

ip route del default
ip route add 0.0.0.0/1 via "$TUN_NETWORK_GATEWAY"
ip route add 128.0.0.0/1 via "$TUN_NETWORK_GATEWAY"

然后执行

chmod +x /etc/shadowsocks-libev/start-socksfwd

将下面的内容写到/etc/shadowsocks-libev/stop-socksfwd

#!/bin/bash

source /etc/shadowsocks-libev/socksfwd

ip route del 128.0.0.0/1 via "$TUN_NETWORK_GATEWAY"
ip route del 0.0.0.0/1 via "$TUN_NETWORK_GATEWAY"
ip route add default via "$GATEWAY_IP"

for i in $(cat /etc/shadowsocks-libev/cn_rules.conf)
do
ip route del "$i" via "$GATEWAY_IP"
done

ip route del "$SOCKS_SERVER" via "$GATEWAY_IP"

然后执行

chmod +x /etc/shadowsocks-libev/stop-socksfwd

将下面的内容写到/etc/shadowsocks-libev/socksfwd,请根据实际情况修改其中的值

# SS服务器IP的地址
SOCKS_SERVER="1.1.1.1"

# SS监听的本地IP地址+端口
SOCKS_ADDRESS="127.0.0.1:1080"

# 网关(路由器)的 IP 地址
# GATEWAY_IP=$(ip route|grep "default"|awk '{print $3}')
GATEWAY_IP="192.168.1.1"

# 选一个不冲突的tun设备号
TUN_NETWORK_DEV="tun0"

# 选一个不冲突的内网IP段的前缀
TUN_NETWORK_PREFIX="12.0.0"
# TUN_NETWORK_GATEWAY="$TUN_NETWORK_PREFIX.1"
TUN_NETWORK_GATEWAY="12.0.0.1"
# TUN_NETWORK_ADDRESS="$TUN_NETWORK_PREFIX.2"
TUN_NETWORK_ADDRESS="12.0.0.2"

9.设置防污染DNS

版本可能有更迭,请自行前往shadowsocks/ChinaDNS获取最新文件

cd ~
wget https://github.com/shadowsocks/ChinaDNS/releases/download/1.3.2/chinadns-1.3.2.tar.gz
tar -zxvf chinadns-1.3.2.tar.gz >/dev/null && rm chinadns-1.3.2.tar.gz
cd ~/chinadns-1.3.2 && ./configure && make
mv -f src/chinadns /usr/bin/chinadns && mv -f chnroute.txt /etc/shadowsocks-libev/chnroute.txt
cd ~ && rm -rf ~/chinadns-1.3.2

将下面的内容写入到/etc/systemd/system/chinadns.service

[Unit]
Description=ChinaDNS Client
After=network.target

[Service]
ExecStart=/usr/bin/chinadns -m -c /etc/shadowsocks-libev/chnroute.txt

[Install]
WantedBy=multi-user.target

然后执行:

systemctl enable chinadns && systemctl start chinadns
echo "nameserver 127.0.0.1" >/etc/resolv.conf && chattr +i /etc/resolv.conf

10.配置gotun2socks启动脚本

将下面的内容写入到/etc/systemd/system/autoproxy.service

[Unit]
Description=Transparent SOCKS5 forwarding
After=network-online.target

[Service]
Type=simple
EnvironmentFile=/etc/shadowsocks-libev/socksfwd
ExecStart=/usr/bin/gotun2socks -tun-device "$TUN_NETWORK_DEV" -tun-address "$TUN_NETWORK_ADDRESS" -tun-gw "$TUN_NETWORK_GATEWAY" -local-socks-addr "$SOCKS_ADDRESS" -tun-dns "127.0.0.1"
ExecStartPost=/etc/shadowsocks-libev/start-socksfwd
ExecStopPost=/etc/shadowsocks-libev/stop-socksfwd
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

然后执行:

systemctl enable autoproxy && systemctl start autoproxy

11.开启流量转发

sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf
sed -i '/net.ipv6.conf.all.forwarding/d' /etc/sysctl.conf
sed -i '/net.ipv4.tcp_syn_retries/d' /etc/sysctl.conf
sed -i '/net.ipv4.tcp_synack_retries/d' /etc/sysctl.conf
echo -e "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
echo -e "net.ipv6.conf.all.forwarding = 1" >>/etc/sysctl.conf
echo -e "net.ipv4.tcp_syn_retries = 5" >>/etc/sysctl.conf
echo -e "net.ipv4.tcp_synack_retries = 5" >>/etc/sysctl.conf
sysctl -p

现在让我们执行下面这两条命令看看效果吧

> curl -s ip.sb
1.1.1.1 # 你的SS服务器IP

> curl -s members.3322.org/dyndns/getip
2.2.2.2 # 你的实际IP

如一切无误,此时gotun2socks已经开始正常工作,并且智能分流已成功实现。
如果局域网内的其他设备也想实现智能分流,将网关和DNS设置为这台设备的IP地址即可。


后话

其实这个方法,不仅可以部署在你自己的Linux设备(包括支持运行OpenWRT/LEDE等固件的路由器)上,也可以部署到国内/国外的VPS上,玩的方法很多,看你怎么玩。

最后顺便吐槽一句,原作者埋下的坑,是真的多!

说明

  1. 如果您使用的是NAT小鸡或者动态IP服务器等,那么可以直接关闭本页面;
  2. 此方法也只是(可能)减少被墙概率,无法做到100%防止,实际上墙不墙真的是看脸2333;
  3. 请确保使用全新的系统;
  4. 推荐使用 CentOS6+ / Ubuntu14+ / Debian7+
  5. 请确保您有一个可以正常使用的域名,并拥有一个有效可信的tls证书(推荐使用freessl.cn签发证书)。

1.更新系统组件

  • CentOS

运行命令:

yum update -y
yum install -y ca-certificates curl ntpdate python vim wget
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && ntpdate time.nist.gov
  • Debian/Ubuntu

运行命令:

apt-get update -y && apt-get upgrade -y
apt-get install -y ca-certificates curl ntpdate python vim wget
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && ntpdate time.nist.gov

2.(可选)更改SSH端口

  • 如果是Debian/Ubuntu,您可以使用由@ctcgfw_shellscript提供的脚本进行一键更换:

运行命令:

bash <(curl -s https://one.script.ctcgfw.generalcdn.top/ssh/change_port_debian_ubuntu.sh)
  • 其他系统请自行Google查找相关教程。

温馨提示:在一些拥有外部防火墙的服务器提供商,您可能需要手动开放相关端口才能够使用。例如阿里云,AWS等。

3.(可选)开启BBR

一些VPS商家的控制面板里已经提供了内置BBR的系统,您可以直接重装使用。

  • Debian9

运行命令:

bash <(curl https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh) start
  • Debian/Ubuntu

运行命令:

bash <(curl https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh)
  • 其他系统请自行Google查找相关教程。

4.安装ShadowsocksR

运行命令:

cd ~ && curl -O https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh && bash ssr.sh

说明:

  1. 端口设置为80;
  2. 密码随意,但不要太简单,建议6位字符以上;
  3. 加密设置为none(即输入1);
  4. 协议设置为auth_chain_a(即输入5);
  5. 混淆设置为http_simple/http_post(即输入2/3);
  6. 设置不兼容混淆插件原版(即输入N);

5.安装Caddy

运行命令:

bash <(curl https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/caddy_install.sh)
  1. 将您的证书上传至 /usr/local/caddy 目录下,并把公钥和私钥分别命名为pem.pemkey.key
  2. 将下面的内容保存至 /usr/local/caddy/Caddyfile(请将 你的域名 替换为您的真实域名),并执行 service caddy restart 使配置生效。
http://你的域名:8088
{
        timeouts none
        gzip
        redir https://你的域名{uri}
}
https://你的域名
{
        timeouts none
        gzip
        proxy / https://www.bing.com
        tls /usr/local/caddy/pem.pem /usr/local/caddy/key.key {
                protocols tls1.2 tls1.3
                ciphers ECDHE-ECDSA-WITH-CHACHA20-POLY1305 ECDHE-RSA-WITH-CHACHA20-POLY1305 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-GCM-SHA256
        }
        header / {
                Strict-Transport-Security "max-age=15768000; preload"
                X-XSS-Protection "1; mode=block"
                X-Content-Type-Options "nosniff"
                X-Frame-Options "DENY"
        }
        proxy /v2ray_websocket localhost:20700 {
                websocket
                header_upstream -Origin
        }
}

6.配置ShadowsocksR

运行命令:

cd ~ && bash ssr.sh

调出SSR脚本,输入8,进入手动编辑配置文件状态,将 "redirect": "", 改为 "redirect": ["*:80#你的域名:8088"],
(请将 你的域名 改为你的真实域名)

7.安装V2Ray

运行命令:

bash <(curl https://install.direct/go.sh)

将下面的内容上传至 /etc/v2ray/config.json(建议更改id为其他的uuid)

{
    "inbounds":[
        {
            "port":20700,
            "listen":"127.0.0.1",
            "protocol":"vmess",
            "settings":{
                "clients":[
                    {
                        "id":"fd1eefe4-3021-11e9-8ce0-00163ce77c06",
                        "alterId":50
                    }
                ]
            },
            "streamSettings":{
                "network":"ws",
                "wsSettings":{
                    "path":"/v2ray_websocket"
                }
            }
        }
    ],
    "outbounds":[
        {
            "protocol":"freedom",
            "settings":{
            }
        }
    ]
}

运行 service v2ray restart 使配置生效。

8.开放端口

运行命令:

iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 8088 -j ACCEPT
  • CentOS
service iptables save
  • Debian/Ubuntu
iptables-save > /etc/iptables.up.rules

温馨提示:在一些拥有外部防火墙的服务器提供商,您可能需要手动开放相关端口才能够使用。例如阿里云,AWS等。

9.检查情况

直接访问 http://你的域名 检查是否能够正常打开并自动跳转至https,如果正常则表明配置成功。


后续说明

  1. SSR的混淆参数设置为你的域名
  2. V2Ray的端口设置为443,加密协议设置为none,底层传输安全设置为tls
  3. 其他的配置信息请自行脑补,不过多赘述。

因为最近入手了一台阿里云VPS,发现目前公布的卸载阿里云监控教程执行起来还是太过繁琐,不太适合像我这种懒人,因此写了一个一键脚本,方便使用。

使用方法:

bash <(curl -s https://raw.githubusercontent.com/shell-script/one-script/master/security/aliyundun_uninstall.sh)

直接复制上面的代码至shell中执行即可

温馨提示:
*仅限CentOS/Debian/Ubuntu使用。
*脚本会删除位于/etc/motd的欢迎信息。
CentOS6及以下&Debian/Ubuntu默认使用iptables进行封禁IP;
CentOS7及以上默认使用firewalld进行封禁IP;
请确保iptables/firewalld处于正常工作状态,否则请手动进行封禁相关IP。

参考:
卸载阿里云盾(安骑士)监控&屏蔽云盾IP