From 28fd8a4c2a977bfac8284c4afdd7a300d5b36c1c Mon Sep 17 00:00:00 2001 From: mango Date: Sat, 14 Feb 2026 20:49:56 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ss-rust=20=E4=B8=80=E9=94=AE=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 +++++++ ss-rust.sh | 326 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 369 insertions(+) create mode 100644 README.md create mode 100644 ss-rust.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..86a3bd6 --- /dev/null +++ b/README.md @@ -0,0 +1,43 @@ +# SS-Rust 一键安装脚本 + +一键安装 shadowsocks-rust,自动配置 ss2022 双节点,生成订阅链接 + Surge/Clash 配置。 + +## 一键安装 + +```bash +curl -sL https://raw.githubusercontent.com/mango082888-bit/ss-rust/main/ss-rust.sh -o ss-rust.sh && chmod +x ss-rust.sh && ./ss-rust.sh +``` + +## 功能 + +- 🚀 安装 shadowsocks-rust 最新版 +- 🔐 ss2022 (AES-256-GCM) + ss2022 (AES-128-GCM) 双节点 +- 🎲 随机端口 + 随机密钥 +- ⏰ 自动 NTP 时间同步 +- 📋 自动生成 SS 订阅链接 / Surge 配置 / Clash 配置 +- 🔄 systemd 管理,开机自启 + +## 输出文件 + +| 文件 | 说明 | +|------|------| +| `/etc/shadowsocks-rust/config.json` | 服务端配置 | +| `/etc/shadowsocks-rust/subscribe/subscribe.txt` | Base64 订阅 | +| `/etc/shadowsocks-rust/subscribe/surge.conf` | Surge 配置 | +| `/etc/shadowsocks-rust/subscribe/clash.yaml` | Clash 配置 | +| `/etc/shadowsocks-rust/subscribe/info.txt` | 节点信息汇总 | + +## 管理 + +```bash +systemctl start ss-rust # 启动 +systemctl stop ss-rust # 停止 +systemctl status ss-rust # 状态 +journalctl -u ss-rust -f # 日志 +``` + +## 卸载 + +```bash +./ss-rust.sh uninstall +``` diff --git a/ss-rust.sh b/ss-rust.sh new file mode 100644 index 0000000..04bb078 --- /dev/null +++ b/ss-rust.sh @@ -0,0 +1,326 @@ +#!/bin/bash +# SS-Rust 一键安装脚本 (ss2022 + aes-128-gcm) +# 自动生成订阅链接 + Surge 配置 +# Usage: curl -sL | bash + +set -e + +# ============ 颜色 ============ +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' + +info() { echo -e "${GREEN}[INFO]${NC} $1"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } + +# ============ 检测系统 ============ +check_root() { + [[ $EUID -ne 0 ]] && error "请使用 root 用户运行" +} + +check_os() { + if [[ -f /etc/debian_version ]]; then + PKG="apt" + elif [[ -f /etc/redhat-release ]]; then + PKG="yum" + else + error "不支持的系统" + fi +} + +# ============ 时间同步 ============ +sync_time() { + info "同步系统时间..." + if command -v timedatectl &>/dev/null; then + timedatectl set-ntp true 2>/dev/null || true + fi + if command -v ntpdate &>/dev/null; then + ntpdate -u pool.ntp.org 2>/dev/null || true + elif command -v chronyd &>/dev/null; then + chronyc makestep 2>/dev/null || true + else + $PKG install -y chrony &>/dev/null + systemctl enable --now chronyd 2>/dev/null || true + chronyc makestep 2>/dev/null || true + fi + info "当前时间: $(date '+%Y-%m-%d %H:%M:%S %Z')" +} + +# ============ 安装 ss-rust ============ +install_ssrust() { + info "安装 shadowsocks-rust..." + + ARCH=$(uname -m) + case $ARCH in + x86_64) ARCH_NAME="x86_64-unknown-linux-gnu" ;; + aarch64) ARCH_NAME="aarch64-unknown-linux-gnu" ;; + *) error "不支持的架构: $ARCH" ;; + esac + + # 获取最新版本 + LATEST=$(curl -sL https://api.github.com/repos/shadowsocks/shadowsocks-rust/releases/latest | grep tag_name | head -1 | grep -oP 'v[\d.]+') + [[ -z "$LATEST" ]] && LATEST="v1.21.2" + info "版本: $LATEST" + + URL="https://github.com/shadowsocks/shadowsocks-rust/releases/download/${LATEST}/shadowsocks-${LATEST}.${ARCH_NAME}.tar.xz" + + cd /tmp + curl -sL "$URL" -o ss-rust.tar.xz || error "下载失败" + tar xf ss-rust.tar.xz + cp -f ssserver sslocal ssurl /usr/local/bin/ 2>/dev/null || cp -f ss* /usr/local/bin/ + chmod +x /usr/local/bin/ss* + rm -f ss-rust.tar.xz + + info "shadowsocks-rust 安装完成" +} + +# ============ 生成密钥 ============ +gen_key_128() { + openssl rand -base64 16 +} + +gen_key_256() { + openssl rand -base64 32 +} + +# ============ 获取公网IP ============ +get_ip() { + IP=$(curl -s4 ip.sb 2>/dev/null || curl -s4 ifconfig.me 2>/dev/null || curl -s4 ipinfo.io/ip 2>/dev/null) + [[ -z "$IP" ]] && error "无法获取公网IP" + echo "$IP" +} + +# ============ 生成配置 ============ +gen_config() { + SERVER_IP=$(get_ip) + + # ss2022 端口和密钥 + PORT_2022=$((RANDOM % 10000 + 20000)) + PORT_128=$((RANDOM % 10000 + 30000)) + KEY_2022=$(gen_key_256) + KEY_128=$(gen_key_128) + + METHOD_2022="2022-blake3-aes-256-gcm" + METHOD_128="2022-blake3-aes-128-gcm" + + mkdir -p /etc/shadowsocks-rust + + # 多端口配置 + cat > /etc/shadowsocks-rust/config.json << EOF +{ + "servers": [ + { + "server": "0.0.0.0", + "server_port": ${PORT_2022}, + "method": "${METHOD_2022}", + "password": "${KEY_2022}", + "timeout": 300, + "fast_open": true + }, + { + "server": "0.0.0.0", + "server_port": ${PORT_128}, + "method": "${METHOD_128}", + "password": "${KEY_128}", + "timeout": 300, + "fast_open": true + } + ] +} +EOF + + info "配置文件: /etc/shadowsocks-rust/config.json" +} + +# ============ systemd 服务 ============ +setup_service() { + cat > /etc/systemd/system/ss-rust.service << 'EOF' +[Unit] +Description=Shadowsocks-Rust Server +After=network.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/ssserver -c /etc/shadowsocks-rust/config.json +Restart=on-failure +RestartSec=5 +LimitNOFILE=65535 + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + systemctl enable --now ss-rust + sleep 1 + + if systemctl is-active --quiet ss-rust; then + info "ss-rust 服务启动成功" + else + error "ss-rust 服务启动失败,请检查日志: journalctl -u ss-rust" + fi +} + +# ============ 生成订阅 ============ +gen_subscribe() { + SERVER_IP=$(get_ip) + SUB_DIR="/etc/shadowsocks-rust/subscribe" + mkdir -p "$SUB_DIR" + + # SS URI 格式: ss://method:password@host:port#name + # ss2022 用 SIP008 格式 + URI_2022="ss://$(echo -n "${METHOD_2022}:${KEY_2022}" | base64 -w0)@${SERVER_IP}:${PORT_2022}#SS2022-256" + URI_128="ss://$(echo -n "${METHOD_128}:${KEY_128}" | base64 -w0)@${SERVER_IP}:${PORT_128}#SS2022-128" + + # Base64 订阅 + echo -e "${URI_2022}\n${URI_128}" | base64 -w0 > "$SUB_DIR/subscribe.txt" + + # Surge 配置 + cat > "$SUB_DIR/surge.conf" << EOF +# Surge SS 配置 +# 生成时间: $(date '+%Y-%m-%d %H:%M:%S') +# 服务器: ${SERVER_IP} + +[Proxy] +SS2022-256 = ss, ${SERVER_IP}, ${PORT_2022}, encrypt-method=${METHOD_2022}, password=${KEY_2022} +SS2022-128 = ss, ${SERVER_IP}, ${PORT_128}, encrypt-method=${METHOD_128}, password=${KEY_128} + +[Proxy Group] +Proxy = select, SS2022-256, SS2022-128, DIRECT +EOF + + # Clash 配置 + cat > "$SUB_DIR/clash.yaml" << EOF +# Clash SS 配置 +# 生成时间: $(date '+%Y-%m-%d %H:%M:%S') + +proxies: + - name: SS2022-256 + type: ss + server: ${SERVER_IP} + port: ${PORT_2022} + cipher: ${METHOD_2022} + password: "${KEY_2022}" + + - name: SS2022-128 + type: ss + server: ${SERVER_IP} + port: ${PORT_128} + cipher: ${METHOD_128} + password: "${KEY_128}" +EOF + + # 纯文本信息 + cat > "$SUB_DIR/info.txt" << EOF +======================================== + Shadowsocks-Rust 节点信息 + 生成时间: $(date '+%Y-%m-%d %H:%M:%S') + 服务器IP: ${SERVER_IP} +======================================== + +【节点1】SS2022-AES-256 + 地址: ${SERVER_IP} + 端口: ${PORT_2022} + 加密: ${METHOD_2022} + 密码: ${KEY_2022} + +【节点2】SS2022-AES-128 + 地址: ${SERVER_IP} + 端口: ${PORT_128} + 加密: ${METHOD_128} + 密码: ${KEY_128} + +【SS 订阅链接】 + ${URI_2022} + ${URI_128} + +【Surge 配置】 + SS2022-256 = ss, ${SERVER_IP}, ${PORT_2022}, encrypt-method=${METHOD_2022}, password=${KEY_2022} + SS2022-128 = ss, ${SERVER_IP}, ${PORT_128}, encrypt-method=${METHOD_128}, password=${KEY_128} + +======================================== +EOF +} + +# ============ 输出结果 ============ +show_result() { + echo "" + echo -e "${CYAN}════════════════════════════════════════${NC}" + echo -e "${CYAN} 🚀 Shadowsocks-Rust 安装完成${NC}" + echo -e "${CYAN}════════════════════════════════════════${NC}" + echo "" + echo -e "${GREEN}【节点1】SS2022-AES-256${NC}" + echo -e " 地址: ${SERVER_IP}" + echo -e " 端口: ${YELLOW}${PORT_2022}${NC}" + echo -e " 加密: ${METHOD_2022}" + echo -e " 密码: ${YELLOW}${KEY_2022}${NC}" + echo "" + echo -e "${GREEN}【节点2】SS2022-AES-128${NC}" + echo -e " 地址: ${SERVER_IP}" + echo -e " 端口: ${YELLOW}${PORT_128}${NC}" + echo -e " 加密: ${METHOD_128}" + echo -e " 密码: ${YELLOW}${KEY_128}${NC}" + echo "" + echo -e "${CYAN}────────────────────────────────────────${NC}" + echo -e "${GREEN}【Surge 格式】${NC}" + echo -e " SS2022-256 = ss, ${SERVER_IP}, ${PORT_2022}, encrypt-method=${METHOD_2022}, password=${KEY_2022}" + echo -e " SS2022-128 = ss, ${SERVER_IP}, ${PORT_128}, encrypt-method=${METHOD_128}, password=${KEY_128}" + echo "" + echo -e "${CYAN}────────────────────────────────────────${NC}" + echo -e "${GREEN}【SS 链接】${NC}" + echo -e " ${URI_2022}" + echo -e " ${URI_128}" + echo "" + echo -e "${CYAN}────────────────────────────────────────${NC}" + echo -e "${GREEN}【文件位置】${NC}" + echo -e " 配置: /etc/shadowsocks-rust/config.json" + echo -e " 订阅: /etc/shadowsocks-rust/subscribe/subscribe.txt" + echo -e " Surge: /etc/shadowsocks-rust/subscribe/surge.conf" + echo -e " Clash: /etc/shadowsocks-rust/subscribe/clash.yaml" + echo -e " 信息: /etc/shadowsocks-rust/subscribe/info.txt" + echo "" + echo -e "${CYAN}【管理命令】${NC}" + echo -e " 启动: systemctl start ss-rust" + echo -e " 停止: systemctl stop ss-rust" + echo -e " 状态: systemctl status ss-rust" + echo -e " 日志: journalctl -u ss-rust -f" + echo -e "${CYAN}════════════════════════════════════════${NC}" +} + +# ============ 卸载 ============ +uninstall() { + warn "卸载 shadowsocks-rust..." + systemctl stop ss-rust 2>/dev/null + systemctl disable ss-rust 2>/dev/null + rm -f /etc/systemd/system/ss-rust.service + rm -f /usr/local/bin/ss{server,local,url} + rm -rf /etc/shadowsocks-rust + systemctl daemon-reload + info "卸载完成" + exit 0 +} + +# ============ 主流程 ============ +main() { + case "${1:-}" in + uninstall|remove) + check_root + uninstall + ;; + *) + check_root + check_os + sync_time + install_ssrust + gen_config + setup_service + gen_subscribe + show_result + ;; + esac +} + +main "$@"