两分钟搞定:一键部署 Gost + Clash 订阅(SOCKS5)
2025/09/30

两分钟搞定:一键部署 Gost + Clash 订阅(SOCKS5)

用 Docker 两分钟搭建 SOCKS5 代理,并发布 Clash 订阅。


如果你想快速整一个 SOCKS5 代理,还能顺手给 Clash 出个订阅,其实很简单。 下面这套流程照着敲就行:Docker 跑 Gost 当代理核心,再用 Nginx 把订阅文件对外发布。新手也能一次过。

1. 先装下 Docker(没装的话)

sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 加入 docker 用户组,避免每次用 sudo
sudo usermod -aG docker $USER
exit   # 退出一次再重新 ssh 进来,让权限生效

2. 起个 Gost 容器(SOCKS5)

监听 1080 端口,账号 myuser,密码 mypass,一条命令搞定:

docker run -d --name gost --restart unless-stopped \
  -p 1080:1080 \
  gogost/gost:latest \
  -L=socks5://myuser:mypass@:1080

参数解释:

  • -d:后台跑,省心
  • --restart unless-stopped:开机自己起来
  • -p 1080:1080:把 1080 暴露出来
  • -L:告诉 Gost 用 SOCKS5 监听

3. 防火墙 / 安全组

把这两个端口放行就行:

  • 22/tcp:仅限你自己的公网 IP(用于 SSH 登录)
  • 1080/tcp:允许中继服务器或需要访问代理的机器 IP

AWS 的话,入站规则里这么配就好:

  • 类型: SSH / 端口: 22 / 来源: 你的公网 IP
  • 类型: 自定义 TCP / 端口: 1080 / 来源: 使用代理的服务器公网 IP

4. 试一下代理有没有跑起来

在服务器本机试:

curl -x socks5h://myuser:[email protected]:1080 https://api.ipify.org

换到另一台机器(比如中继服务器)再试:

curl -x socks5h://myuser:mypass@<你的服务器公网IP>:1080 https://api.ipify.org

👉 能看到这台 VPS 的公网 IP,就说明 OK 了。


5. 发一个 Clash 订阅

5.1 装个 Nginx

sudo apt install -y nginx

5.2 丢个订阅文件进去

sudo tee /var/www/html/clash-sub.yaml >/dev/null <<'EOF'
proxies:
  - name: "my-socks5"
    type: socks5
    server: <你的服务器公网IP>
    port: 1080
    username: "myuser"
    password: "mypass"

proxy-groups:
  - name: "Proxy"
    type: select
    proxies:
      - my-socks5
      - DIRECT

rules:
  - MATCH,Proxy
EOF

验证代理截图

5.3 在浏览器 / Clash 客户端里用订阅

http://<你的服务器公网IP>/clash-sub.yaml

刷新后就能看到节点 my-socks5

Clash节点截图

🔐 小提醒:把示例账号密码换成强随机密码1080/tcp 只给可信 IP 放行,会更稳。


在 AI 时代,把这些重复、规范、可脚本化的工作交给 AI,是最高效也最省心的方式。下面这段提示词你只需要原样粘贴给任意主流模型(如 GPT、Claude),它就会一步到位地帮你把 SOCKS5 和 Clash 订阅搭好,还会给出自检与回滚命令。

一键搭建 AI 提示词(原样粘贴给 AI 即可)

我要在一台**全新 Ubuntu(20.04/22.04/24.04)**服务器上,自动部署一个 SOCKS5 代理(Gost)并发布一个 Clash 订阅。
请你按如下要求执行,一步到位:

需求与约束
	•	SOCKS5 运行在 TCP 1080 端口
	•	代理支持认证(默认开启,账户:myuser,密码:mypass);如需关闭认证,只要把 USE_AUTH=false
	•	Nginx 对外发布 /clash-sub.yaml(URL:http://<服务器公网IP>/clash-sub.yaml)
	•	所有命令幂等、可重复执行,失败时应立即退出
	•	最后输出验证命令与清理回滚命令
	•	如果系统启用了 UFW,请自动放行 80/1080(若未启用则跳过)

请以 root 身份执行下面这份脚本(或在每行前面补上 sudo):#!/usr/bin/env bash
set -euo pipefail

############################
# 可调参数
############################
SOCKS_PORT=1080
USE_AUTH=true              # 需要认证:true;不要认证:false
S5_USER="myuser"
S5_PASS="mypass"

SUB_FILE="/var/www/html/clash-sub.yaml"

############################
# 准备与通用
############################
export DEBIAN_FRONTEND=noninteractive

echo "[1/7] 更新包索引(不做发行版升级)"
apt-get update -y

############################
# 安装 Docker(官方仓库)
############################
echo "[2/7] 安装 Docker 依赖与仓库"
apt-get install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg

UBU_CODENAME="$(. /etc/os-release && echo "${VERSION_CODENAME}")"
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ${UBU_CODENAME} stable" \
  > /etc/apt/sources.list.d/docker.list

apt-get update -y
apt-get install -y docker-ce docker-ce-cli containerd.io

systemctl enable --now docker

############################
# 启动/更新 Gost(Docker)
############################
echo "[3/7] 部署/更新 Gost 容器(SOCKS5 端口: ${SOCKS_PORT})"
docker rm -f gost 2>/dev/null || true

if [ "${USE_AUTH}" = "true" ]; then
  GOST_CMD="-L=socks5://${S5_USER}:${S5_PASS}@:$(printf '%d' "${SOCKS_PORT}")"
else
  GOST_CMD="-L=socks5://:$(printf '%d' "${SOCKS_PORT}")"
fi

docker run -d --name gost --restart unless-stopped \
  --pull=always \
  -p "${SOCKS_PORT}:${SOCKS_PORT}" \
  gogost/gost:latest ${GOST_CMD}

echo "Gost 已启动:"
docker ps --filter name=gost --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}"

############################
# 安装 Nginx 并发布 Clash 订阅
############################
echo "[4/7] 安装 Nginx 并发布 Clash 订阅"
apt-get install -y nginx
systemctl enable --now nginx

# 计算公网 IP(供订阅里引用)
PUB_IP="$(curl -fsS https://api.ipify.org || true)"
if [[ -z "${PUB_IP}" ]]; then
  echo "无法获取公网 IP,订阅将暂时写入 127.0.0.1;可手动替换。"
  PUB_IP="127.0.0.1"
fi

install -d -m 0755 /var/www/html

cat > "${SUB_FILE}" <<'YAML'
# 这是自动生成的最小 Clash 配置(可按需扩展)
mixed-port: 7890
allow-lan: true
mode: Rule
log-level: info

proxies:
  - name: "aws-socks5"
    type: socks5
    server: __PUB_IP__
    port: __SOCKS_PORT__
__AUTH_BLOCK__

proxy-groups:
  - name: "Select"
    type: select
    proxies:
      - aws-socks5
      - DIRECT

rules:
  - GEOIP,CN,DIRECT
  - MATCH,Select
YAML

# 按开关拼接认证段
if [ "${USE_AUTH}" = "true" ]; then
  AUTH_BLOCK="    username: ${S5_USER}\n    password: ${S5_PASS}"
else
  AUTH_BLOCK=""
fi

# 变量替换
sed -i \
  -e "s/__PUB_IP__/${PUB_IP}/g" \
  -e "s/__SOCKS_PORT__/${SOCKS_PORT}/g" \
  -e "s|__AUTH_BLOCK__|${AUTH_BLOCK}|g" \
  "${SUB_FILE}"

# 权限
chown www-data:www-data "${SUB_FILE}"
chmod 0644 "${SUB_FILE}"

# 本机验证
curl -fsSI "http://127.0.0.1/$(basename "${SUB_FILE}")" >/dev/null \
  && echo "Nginx 已能访问本地订阅文件。" \
  || (echo "Nginx 访问订阅失败,请检查。"; exit 1)

############################
# UFW(如启用则放行 80/1080)
############################
echo "[5/7] 如 UFW 已启用,则开放 80 与 ${SOCKS_PORT}"
if ufw status 2>/dev/null | grep -q "Status: active"; then
  ufw allow 80/tcp || true
  ufw allow "${SOCKS_PORT}"/tcp || true
fi

############################
# 可选:开启 BBR(提升长距离吞吐)
############################
echo "[6/7] (可选)启用 BBR 拥塞控制"
if ! sysctl net.ipv4.tcp_congestion_control | grep -q bbr; then
  {
    echo "net.core.default_qdisc=fq"
    echo "net.ipv4.tcp_congestion_control=bbr"
  } >> /etc/sysctl.conf
  sysctl -p >/dev/null || true
fi

echo "当前拥塞控制:$(sysctl -n net.ipv4.tcp_congestion_control)"

############################
# 最终信息与校验
############################
echo "[7/7] 自检与使用说明"

echo
echo "=== 自检(SOCKS5 -> 公网 IP) ==="
if [ "${USE_AUTH}" = "true" ]; then
  echo "curl -x 'socks5h://${S5_USER}:${S5_PASS}@${PUB_IP}:${SOCKS_PORT}' -sS https://api.ipify.org && echo"
else
  echo "curl -x 'socks5h://${PUB_IP}:${SOCKS_PORT}' -sS https://api.ipify.org && echo"
fi

echo
echo "=== 自检(Clash 订阅 URL) ==="
echo "curl -I http://${PUB_IP}/$(basename "${SUB_FILE}")"

echo
echo "=== 清理/回滚(如需) ==="
cat <<'CLEAN'
# 停用并移除 Gost 容器与镜像
docker rm -f gost 2>/dev/null || true
docker image prune -f 2>/dev/null || true

# 移除订阅文件(如需)
rm -f /var/www/html/clash-sub.yaml

# (可选)恢复拥塞控制为 cubic
sed -i '/^net.core.default_qdisc=fq$/d' /etc/sysctl.conf
sed -i '/^net.ipv4.tcp_congestion_control=bbr$/d' /etc/sysctl.conf
sysctl -p || true
CLEAN

echo
echo "=== 完成!请在云控制台安全组放行:22/tcp、80/tcp、${SOCKS_PORT}/tcp(1080 仅放给需要访问的来源 IP 更安全)。===" 

我期望的输出
	•	显示 Docker 与 Gost 容器运行状态
	•	输出 Nginx 就绪、订阅文件可访问
	•	提供自检命令(SOCKS5 经 curl 返回公网 IP;订阅 URL 能 200)
	•	若有错误,请给出原因与修复建议