从零搭梯子接入手册
自建代理服务架构蓝图
这个系列是什么:完整的技术 runbook——直接交给 Claude Code 执行就行。复制手册、替换占位符(
YOUR_VPS_IP、your.domain.com等),发给 Agent,让它按步骤来。背后的故事在实战录同名篇。
自建代理服务完全指南:从零到能用
一套完整的自建代理方案,涵盖 VPS 选择、协议配置、SSL 证书、订阅服务器到客户端配置的全流程。需要一定 Linux 基础。
目录
- VPS 选择与初始配置
- 第一次踩坑:Shadowsocks 被封的教训
- 正确方案:sing-box 多协议部署
- BBR 网络加速
- SSL 证书申请与配置
- 订阅服务器搭建(nginx)
- 节点名称整理与配置优化
- Clash Verge 客户端配置(macOS)
- 踩坑记录
- 验证清单
1. VPS 选择与初始配置
1.1 选 VPS 看什么
几个核心指标:
- IP 质量:静态住宅 IP(residential IP)比数据中心 IP 抗封性强很多。Atlas Networks 提供西雅图和洛杉矶的住宅 IP,值得考虑。
- 线路质量:国内访问美国的线路,9929(AS9929)和 CN2 GIA 是最优选,延迟低、绕过骨干拥堵。普通 AS4837 差很多。
- 带宽和月流量:至少 100Mbps,月流量 1TB 起步。
- SSH 端口:部分服务商默认非标准端口(如
YOUR_SSH_PORT),注意查收开机邮件。
本文使用的 VPS 配置:
| 参数 | 值 |
|---|---|
| 服务商 | Atlas Networks |
| 位置 | 洛杉矶,9929 网络 |
| IP | YOUR_VPS_IP |
| SSH 端口 | YOUR_SSH_PORT |
| 系统 | Ubuntu 24.04.1 LTS |
| 月流量限额 | 3TB |
1.2 初始 SSH 登录
ssh root@YOUR_VPS_IP -p YOUR_SSH_PORT
登录后先做几件基础工作:
# 更新系统
apt-get update && apt-get upgrade -y
# 安装常用工具
apt-get install -y curl wget vim git unzip net-tools
# 设置时区为 UTC(保持一致性)
timedatectl set-timezone UTC
# 确认系统版本
lsb_release -a
1.3 安全加固(推荐)
# 修改 SSH 配置,禁用密码登录(建议先配好公钥再操作)
vim /etc/ssh/sshd_config
# 确保以下两行存在:
# PasswordAuthentication no
# PubkeyAuthentication yes
# 重启 SSH 服务
systemctl restart sshd
# 开启防火墙(ufw),只放行需要的端口
ufw allow YOUR_SSH_PORT/tcp # SSH
ufw allow 80/tcp # HTTP(acme 验证 / nginx)
ufw allow 443/tcp # HTTPS(nginx)
ufw allow 16796/tcp # VLESS-Reality
ufw allow 18877/udp # Hysteria2
ufw allow 31227/udp # TUIC-v5
ufw allow 2082/tcp # Vmess-WS(可选)
ufw enable
ufw status
VPS 服务商的坑:部分服务商默认关闭了
PubkeyAuthentication。如果复制了公钥但密钥登录不生效,先检查这个:grep PubkeyAuthentication /etc/ssh/sshd_config # 如果显示 "no",改掉: sed -i 's/^PubkeyAuthentication no/PubkeyAuthentication yes/' /etc/ssh/sshd_config systemctl restart sshd
2. 血的教训:Shadowsocks 几小时就被封
2.1 当时怎么部署的
最初用 Docker 部署了 shadowsocks-rust:
docker run -d \
--name ss-rust \
--restart always \
-p 8388:8388/tcp \
-p 8388:8388/udp \
-e PASSWORD="your_password" \
ghcr.io/shadowsocks/ssserver-rust:latest \
ssserver -s "0.0.0.0:8388" -m "aes-256-gcm" -k "your_password" --udp-only false
配置参数:
- 端口:8388
- 加密方式:aes-256-gcm
2.2 结果
几小时内 IP 就被 GFW 封了。
端口连接直接超时,从国内完全无法访问。
2.3 为什么
Shadowsocks(以及未经混淆的 VMess、普通 Socks5)是"裸协议"。GFW 的流量探针会:
- 对可疑端口发送主动探测包
- 分析流量的熵值(加密流量熵值很高)
- 通过流量特征识别代理协议
- 封锁对应 IP 的端口甚至整个 IP
核心教训:面向国内的 IP,不能裸跑 SS/VMess/Socks5。必须用有流量混淆能力的现代协议。
3. 正确姿势:sing-box 多协议部署
3.1 为什么选 sing-box
sing-box 是目前最成熟的多协议代理内核,支持:
- VLESS + Reality:借用真实网站的 TLS 指纹,GFW 无法区分代理流量和正常 HTTPS 流量,抗封性极强
- Hysteria2:基于 QUIC/UDP,速度快,适合高带宽场景
- TUIC v5:同样基于 UDP,低延迟
3.2 一键脚本安装
# 一键安装
bash <(wget -qO- https://raw.githubusercontent.com/yonggekkk/sing-box-yg/main/sb.sh)
脚本首次运行后保存到 /root/sb.sh,之后可以直接运行 sb 快捷命令进入管理菜单。
3.3 安装过程
运行脚本后会出现选项菜单。先选择选项 1(安装),然后按 Enter 使用默认配置即可。
脚本会自动完成:
- 安装 sing-box 服务
- 生成 5 个协议的配置
- 写入 systemd 服务
- 启动服务
注意:sing-box 安装脚本可能会在安装过程中移除
ufw。如果安装 sing-box 前配置了防火墙规则,安装后需要验证规则是否还在。默认 iptables 策略是 ACCEPT(无防火墙),专用代理 VPS 可以接受,但别忘了检查。
3.4 5 个协议一览
| 协议 | 默认端口 | 传输层 | 抗封性 | 备注 |
|---|---|---|---|---|
| VLESS-Reality-Vision | (随机) | TCP | ★★★★★ | 首选,伪装成 HTTPS 流量 |
| Vmess-WebSocket | (随机) | TCP | ★★ | 最弱,不建议日常用 |
| Hysteria2 | (随机) | UDP | ★★★★ | 速度最快 |
| TUIC-v5 | (随机) | UDP | ★★★★ | 低延迟 |
| Anytls | (随机) | TCP | ★★★★ | TLS 伪装,较新协议 |
注意:脚本每次安装会随机分配端口,不要照搬旧教程的端口号。安装完成后查看输出确认实际端口。
3.5 查看配置文件
# 所有配置文件在此
ls /etc/s-box/
# Clash Mihomo 客户端配置(包含所有节点)
cat /etc/s-box/clmi.yaml
# sing-box 客户端配置
cat /etc/s-box/sbox.json
3.6 验证服务状态
# 查看 sing-box 服务状态
systemctl status sing-box
# 查看实时日志
journalctl -u sing-box -f
# 确认 TCP 端口监听
ss -tlnp | grep -E "16796|2082"
# Hysteria2 和 TUIC 是 UDP,用 -u
ss -ulnp | grep -E "18877|31227"
3.7 常用管理命令
# 启动/停止/重启
systemctl start sing-box
systemctl stop sing-box
systemctl restart sing-box
# 查看服务端配置
cat /etc/s-box/sb.json
# 进入管理菜单
sb
4. BBR 网络加速
BBR 是 Google 的 TCP 拥塞控制算法,能显著提升跨国连接的吞吐量。Linux 4.9+ 内核已内置。
4.1 通过脚本启用
# 进入管理菜单
sb
# 选择选项 11(BBR 加速)
4.2 手动启用
# 检查内核版本(必须 >= 4.9)
uname -r
# 编辑 sysctl 配置
cat >> /etc/sysctl.conf << 'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
# 应用
sysctl -p
# 验证
sysctl net.ipv4.tcp_congestion_control
# 应该输出:net.ipv4.tcp_congestion_control = bbr
# 确认 BBR 模块已加载
lsmod | grep bbr
5. SSL 证书申请与配置
Reality 协议本身不需要 SSL 证书,但 Hysteria2 和 TUIC 需要,nginx 订阅服务器也需要 HTTPS。
5.1 DNS 配置
在 Cloudflare 给域名添加 A 记录:
类型: A
名称: sub(或你想要的子域名)
IPv4 地址: YOUR_VPS_IP
代理状态: 仅 DNS(灰色云朵)— 初始证书申请用
重要:初始申请 SSL 证书时用灰色云朵(仅 DNS)。订阅服务器配好后(第 6 节),改成橙色云朵(开启 Cloudflare 代理)。原因:
- 国内用户无法直接访问 VPS IP 来获取订阅 URL
- Cloudflare CDN 在国内可访问,可以中转订阅请求
- 代理连接(VLESS、Hysteria2、TUIC 等)使用的是配置文件里硬编码的 VPS IP,不走域名,所以 Cloudflare 代理不影响
- 只有订阅的 HTTP 请求走 Cloudflare,实际的代理流量直连 VPS
简单说:申请证书时灰色云朵 → 订阅服务器配好后改橙色云朵。代理协议直连 IP,不受影响。
5.2 获取 Cloudflare API Token
- 登录 Cloudflare Dashboard
我的个人资料→API 令牌→创建令牌- 用模板:
编辑区域 DNS - 区域资源:选你的域名
- 创建并保存 Token(只显示一次)
5.3 安装 acme.sh
# 安装(如果 sb.sh 还没装的话)
curl https://get.acme.sh | sh -s email=[email protected]
# 激活环境变量
source ~/.bashrc
# 或直接用完整路径
~/.acme.sh/acme.sh --version
5.4 清理 acme.sh 缓存(重要!)
这是一个关键坑。
sb.sh 脚本运行时会调用 acme.sh 并写入一个错误的邮件地址到账户缓存。不清理的话后续会报错。
# 清理错误的账户缓存
rm -rf ~/.acme.sh/ca/ ~/.acme.sh/*.json
# 确认清理完毕
ls ~/.acme.sh/
5.5 申请证书
# 设置 Cloudflare API Token
export CF_Token="你的Cloudflare_API_Token"
# 申请 ECC 证书(比 RSA 更小更快)
~/.acme.sh/acme.sh --issue \
--dns dns_cf \
-d your.domain.com \
--ecc \
--server letsencrypt \
--accountemail "[email protected]" \
--force
# 完成后显示证书路径,类似:
# /root/.acme.sh/your.domain.com_ecc/your.domain.com.cer
# /root/.acme.sh/your.domain.com_ecc/your.domain.com.key
# /root/.acme.sh/your.domain.com_ecc/fullchain.cer
参数说明:
--dns dns_cf:用 Cloudflare DNS API 验证,不用开 80 端口--ecc:椭圆曲线证书--server letsencrypt:Let's Encrypt CA--force:强制重新申请
5.6 安装证书到指定路径
# 创建目标目录
mkdir -p /root/ygkkkca
# 安装证书,设置自动重载
~/.acme.sh/acme.sh --install-cert \
-d your.domain.com \
--ecc \
--cert-file /root/ygkkkca/cert.crt \
--key-file /root/ygkkkca/private.key \
--fullchain-file /root/ygkkkca/fullchain.crt \
--reloadcmd "systemctl restart sing-box"
这还会设置自动续期:证书到期前 30 天自动申请新证书并执行 --reloadcmd 重启服务。
5.7 复制证书到 sing-box 目录
# 复制到 sing-box 读取的路径
cp /root/ygkkkca/fullchain.crt /etc/s-box/cert.pem
cp /root/ygkkkca/private.key /etc/s-box/private.key
# 设置权限
chmod 600 /etc/s-box/private.key
# 重启 sing-box
systemctl restart sing-box
# 验证
systemctl status sing-box
5.8 验证证书
# 查看证书信息
openssl x509 -in /root/ygkkkca/fullchain.crt -noout -text | grep -E "Subject:|Not After"
# 查看 acme.sh 管理的证书列表
~/.acme.sh/acme.sh --list
6. 订阅服务器搭建(nginx)
客户端不用每次手动更新节点配置。通过 nginx 提供订阅 URL,Clash/sing-box 客户端一键更新。
6.1 安装 nginx
apt-get install -y nginx
# 启动并设置开机自启
systemctl enable nginx
systemctl start nginx
systemctl status nginx
6.2 生成随机订阅 Token
Token 就是订阅 URL 的路径,相当于密码。
# 生成 16 位随机 token
TOKEN=$(cat /proc/sys/kernel/random/uuid | tr -d "-" | head -c 16)
echo "你的 Token 是: $TOKEN"
# 保存 token
echo $TOKEN > /etc/s-box/.sub_token
cat /etc/s-box/.sub_token
6.3 修正 Clash 配置文件
在通过 nginx 提供配置之前,先修正证书验证设置:
# 编辑 Clash Mihomo 客户端配置
vim /etc/s-box/clmi.yaml
找到并修改:
# 修改前:
skip-cert-verify: true
# 修改后:
skip-cert-verify: false
# 同时找到 sni 字段,改为你的真实域名:
sni: your.domain.com
用 sed 批量替换更方便:
# 关闭跳过证书验证
sed -i 's/skip-cert-verify: true/skip-cert-verify: false/g' /etc/s-box/clmi.yaml
# 检查
grep "skip-cert-verify" /etc/s-box/clmi.yaml
6.4 配置 nginx
TOKEN=$(cat /etc/s-box/.sub_token)
cat > /etc/nginx/sites-available/sub << EOF
server {
listen 80;
listen 443 ssl;
server_name your.domain.com;
ssl_certificate /root/ygkkkca/fullchain.crt;
ssl_certificate_key /root/ygkkkca/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location /${TOKEN} {
alias /etc/s-box/clmi.yaml;
default_type "text/plain; charset=utf-8";
}
location /singbox/${TOKEN} {
alias /etc/s-box/sbox.json;
default_type "application/json; charset=utf-8";
}
location / {
return 404;
}
}
EOF
6.5 启用站点
# 创建软链接
ln -sf /etc/nginx/sites-available/sub /etc/nginx/sites-enabled/sub
# 删除默认站点(避免冲突)
rm -f /etc/nginx/sites-enabled/default
# 测试配置
nginx -t
# 重载
systemctl reload nginx
6.6 流量统计
Clash 和 sing-box 客户端能显示上传/下载用量和剩余配额,前提是订阅响应包含 Subscription-Userinfo 头。
安装 vnstat
apt-get install -y vnstat
systemctl enable vnstat
systemctl start vnstat
# 查看网卡名称
vnstat --iflist
# 通常是 ens3、eth0 之类,记住它
创建流量统计脚本
cat > /etc/s-box/update_traffic.sh << 'SCRIPT'
#!/bin/bash
IFACE="ens3" # 替换为你的网卡名
MONTHLY_LIMIT_GB=3000 # 月流量限额(GB),3000 = 3TB
MONTHLY_LIMIT_BYTES=$((MONTHLY_LIMIT_GB * 1073741824))
STATS=$(vnstat -i "$IFACE" --json m 2>/dev/null)
if [ -z "$STATS" ]; then
UPLOAD=0
DOWNLOAD=0
else
UPLOAD=$(echo "$STATS" | python3 -c "
import sys, json
data = json.load(sys.stdin)
months = data.get('interfaces', [{}])[0].get('traffic', {}).get('month', [])
print(months[-1].get('tx', 0) if months else 0)
" 2>/dev/null || echo 0)
DOWNLOAD=$(echo "$STATS" | python3 -c "
import sys, json
data = json.load(sys.stdin)
months = data.get('interfaces', [{}])[0].get('traffic', {}).get('month', [])
print(months[-1].get('rx', 0) if months else 0)
" 2>/dev/null || echo 0)
fi
EXPIRE=$(date -d "$(date +%Y-%m-01) +1 month" +%s 2>/dev/null || date -d "next month" +%s)
cat > /etc/s-box/.traffic_header.conf << EOF
add_header Subscription-Userinfo "upload=${UPLOAD}; download=${DOWNLOAD}; total=${MONTHLY_LIMIT_BYTES}; expire=${EXPIRE}";
EOF
SCRIPT
chmod +x /etc/s-box/update_traffic.sh
bash /etc/s-box/update_traffic.sh
设置定时任务
# 每 5 分钟更新一次
(crontab -l 2>/dev/null; echo "*/5 * * * * /bin/bash /etc/s-box/update_traffic.sh > /dev/null 2>&1") | crontab -
更新 nginx 配置
在每个订阅 location 块里加 include /etc/s-box/.traffic_header.conf;:
TOKEN=$(cat /etc/s-box/.sub_token)
cat > /etc/nginx/sites-available/sub << EOF
server {
listen 80;
listen 443 ssl;
server_name your.domain.com;
ssl_certificate /root/ygkkkca/fullchain.crt;
ssl_certificate_key /root/ygkkkca/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location /${TOKEN} {
alias /etc/s-box/clmi.yaml;
default_type "text/plain; charset=utf-8";
add_header Content-Disposition "inline";
include /etc/s-box/.traffic_header.conf;
}
location /singbox/${TOKEN} {
alias /etc/s-box/sbox.json;
default_type "application/json; charset=utf-8";
include /etc/s-box/.traffic_header.conf;
}
location / {
return 404;
}
}
EOF
nginx -t && systemctl reload nginx
客户端刷新订阅后会显示流量使用进度条。
6.7 验证订阅 URL
TOKEN=$(cat /etc/s-box/.sub_token)
echo "Clash 订阅 URL: https://your.domain.com/${TOKEN}"
echo "Sing-box 订阅 URL: https://your.domain.com/singbox/${TOKEN}"
# 本地测试
curl -s "https://your.domain.com/${TOKEN}" | head -20
7. 节点名称整理
7.1 问题
sb.sh 脚本生成的节点名称会带机器 ID 后缀:
vless-reality-vision-C20260225127975
hysteria2-C20260225127975
在客户端里看着很丑,也不直观。
7.2 重命名
# 备份
cp /etc/s-box/clmi.yaml /etc/s-box/clmi.yaml.bak
# 用 sed 替换
sed -i "s/vless-reality-vision-C[0-9A-Za-z]*/⭐ VLESS-Reality 首选/g" /etc/s-box/clmi.yaml
sed -i "s/hysteria2-C[0-9A-Za-z]*/🚀 Hysteria2 快速/g" /etc/s-box/clmi.yaml
sed -i "s/tuic-C[0-9A-Za-z]*/⚡ TUIC-v5 低延迟/g" /etc/s-box/clmi.yaml
sed -i "s/vmess-ws-C[0-9A-Za-z]*/🔸 Vmess-WS 备用/g" /etc/s-box/clmi.yaml
sed -i "s/anytls-C[0-9A-Za-z]*/🔒 Anytls 隐匿/g" /etc/s-box/clmi.yaml
7.3 从自动选择组里移除 Vmess-WS
Vmess-WS 是最弱的协议,容易被 GFW 识别。不该出现在自动选择组里。
# 查看当前配置
grep -A 20 "proxy-groups" /etc/s-box/clmi.yaml | head -30
找到自动选择组:
proxy-groups:
- name: 自动选择
type: url-test
proxies:
- ⭐ VLESS-Reality 首选
- 🚀 Hysteria2 快速
- ⚡ TUIC-v5 低延迟
- 🔸 Vmess-WS 备用 # 删掉这一行
url: http://www.gstatic.com/generate_204
interval: 300
手动编辑删除 Vmess-WS 条目:
vim /etc/s-box/clmi.yaml
验证 YAML 格式:
python3 -c "import yaml; yaml.safe_load(open('/etc/s-box/clmi.yaml'))" && echo "YAML 格式正确"
7.4 让修改生效
改完 nginx 配置文件后,客户端下次更新订阅时会自动获取新配置,不用重启 sing-box。
如果改了 sing-box 相关配置(如端口、证书路径),需要重启:
systemctl restart sing-box
systemctl status sing-box
8. Clash Verge 客户端配置(macOS)
8.1 安装
推荐 Clash Verge Rev 分支(原版已停更)。
- 下载:https://github.com/clash-verge-rev/clash-verge-rev/releases
- macOS 下载
.dmg - Bundle ID:
io.github.clash-verge-rev.clash-verge-rev
配置文件位置:
~/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev/
8.2 导入订阅
- 打开 Clash Verge
- 点顶部
订阅 - 右上角
+ - 输入订阅 URL:
https://your.domain.com/YOUR_TOKEN - 点
导入 - 点击刚导入的配置卡片激活它(卡片有高亮边框 = 已激活)
常见问题:代理页只显示 DIRECT 和 REJECT,没有节点 → 说明配置没激活,重新点击配置卡片。
8.3 基础设置
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| 系统代理 | 开启 | 让系统流量走 Clash |
| 模式 | 规则(Rule) | 按规则分流,国内流量不走代理 |
| TUN 模式 | 可选 | 更彻底的流量接管 |
| 混合端口 | 7897 | HTTP/SOCKS5 混合端口(默认) |
8.4 代理组配置
在代理页面推荐:
- GLOBAL:选
自动选择 - 自动选择(url-test):包含 VLESS-Reality、Hysteria2、TUIC-v5,自动测速选最低延迟
- 手动切换:需要时手动选具体节点
8.5 连接测试
# macOS 终端
curl -x socks5://127.0.0.1:7897 https://www.google.com -I
# 或 HTTP 代理
curl -x http://127.0.0.1:7897 https://ip.me
浏览器访问 https://ip.me 确认显示 VPS 的 IP。
8.6 更新订阅
服务端配置有修改时,在订阅页面点配置卡片右侧的刷新按钮即可。
9. 踩坑记录——每一条都是真金白银
坑 1:SS/裸 VMess 被秒封
现象:部署 SS 后几小时,IP 被封。
原因:GFW 主动探测可疑端口,SS 的流量特征太明显。
解法:改用 VLESS-Reality 或 Hysteria2。
一句话:面向国内的 VPS,裸跑 SS/VMess 就是送人头。
坑 2:acme.sh 账户缓存错误
现象:acme.sh 申请证书报错,邮件不匹配。
原因:sb.sh 脚本调用 acme.sh 时缓存了错误邮件地址。
解法:
rm -rf ~/.acme.sh/ca/ ~/.acme.sh/*.json
然后重新申请时加 --accountemail 和 --force。
坑 3:Cloudflare 橙色云朵的正确时机
现象:申请证书时开了橙色代理,acme.sh 验证失败。
原因:橙色代理会隐藏真实 IP,干扰 acme.sh 的证书验证。
解法:申请证书时用灰色云朵(仅 DNS)。订阅服务器配好后改成橙色云朵,这样国内用户可以通过 Cloudflare CDN 拿到订阅。代理协议用的是配置文件里硬编码的 IP,不受影响。
坑 4:Hysteria2 和 TUIC 是 UDP
现象:用 nc -zv 或 telnet 测端口显示 Connection refused,但服务其实正常。
原因:nc -zv 和 telnet 默认走 TCP。Hysteria2 和 TUIC 是 UDP。
解法:
# UDP 模式测试
nc -zuv YOUR_IP 18877
# 或在服务端查看
ss -ulnp | grep -E "18877|31227"
坑 5:Clash Verge 代理页只显示 DIRECT/REJECT
现象:导入订阅后看不到节点。
原因:订阅导入了但没激活。
解法:回到订阅页,点击配置卡片,出现高亮边框就是激活了。
坑 6:Vmess-WS 不该放在自动选择组
现象:自动选择偶尔切到 Vmess-WS,延迟高且抗封性最弱。
解法:从 url-test 的 proxies 列表里删掉 Vmess-WS,只留 VLESS-Reality、Hysteria2、TUIC-v5。
坑 7:证书路径需要手动同步
现象:acme.sh 续期成功但 sing-box 还在用旧证书。
原因:acme.sh 安装在 /root/ygkkkca/,sing-box 读的是 /etc/s-box/cert.pem,两个路径不同步。
解法:把复制步骤加到 reloadcmd:
~/.acme.sh/acme.sh --install-cert \
-d your.domain.com \
--ecc \
--cert-file /root/ygkkkca/cert.crt \
--key-file /root/ygkkkca/private.key \
--fullchain-file /root/ygkkkca/fullchain.crt \
--reloadcmd "cp /root/ygkkkca/fullchain.crt /etc/s-box/cert.pem && cp /root/ygkkkca/private.key /etc/s-box/private.key && systemctl restart sing-box"
坑 8:Clash Verge 重启后配置丢失
现象:重启后手动编辑的设置没了。
原因:直接在 Clash Verge 里改配置的话,重启可能覆盖。
解法:节点重命名和优化在服务端的 YAML 文件里做,通过订阅 URL 分发。客户端只负责拉取和使用,不要在本地改。
坑 9:PubkeyAuthentication 被服务商关闭
现象:复制了公钥到 VPS,但密钥登录不生效,仍然要求输入密码。
原因:部分 VPS 服务商默认在 sshd_config 里关闭了 PubkeyAuthentication。
解法:
grep PubkeyAuthentication /etc/ssh/sshd_config
# 如果显示 "no":
sed -i 's/^PubkeyAuthentication no/PubkeyAuthentication yes/' /etc/ssh/sshd_config
systemctl restart sshd
坑 10:sing-box 脚本会删除 ufw
现象:安装 sing-box 前配置了 ufw 防火墙规则,安装后 ufw status 报命令不存在。
原因:sb.sh 安装过程中可能卸载 ufw。
解法:安装 sing-box 后重新检查防火墙状态。如果 ufw 被移除,需要重新安装并配置规则。对于专用代理 VPS,默认 iptables ACCEPT 策略也可以接受。
坑 11:国内无法获取订阅 URL
现象:国内用户没有现成 VPN 的话,直接访问 VPS IP 拿不到订阅文件。
原因:VPS IP 可能被墙或者国内网络无法直连。
解法:给订阅域名开 Cloudflare 橙色代理(CDN)。Cloudflare CDN 在国内可访问,可以中转订阅请求。代理配置文件里用的是直连 IP,不受影响。
10. 验证清单
按顺序逐项确认,全部通过说明服务正常。
服务端
# 1. sing-box 运行正常
systemctl is-active sing-box
# 期望:active
# 2. 所有端口监听
ss -tlnp | grep -E "16796|2082" # TCP
ss -ulnp | grep -E "18877|31227" # UDP
# 3. BBR 已启用
sysctl net.ipv4.tcp_congestion_control
# 期望:bbr
# 4. SSL 证书有效
openssl x509 -in /root/ygkkkca/fullchain.crt -noout -dates
# 确认 notAfter 在未来
# 5. nginx 运行正常
systemctl is-active nginx
# 期望:active
# 6. 订阅 URL 可访问
TOKEN=$(cat /etc/s-box/.sub_token)
curl -sk "https://your.domain.com/${TOKEN}" | head -5
# 期望看到 YAML 配置内容
# 7. 证书与私钥匹配
openssl x509 -in /etc/s-box/cert.pem -pubkey -noout | openssl sha256
openssl pkey -in /etc/s-box/private.key -pubout | openssl sha256
客户端
# 确认系统代理
networksetup -getwebproxy Wi-Fi
# 期望:Enabled: Yes, Server: 127.0.0.1, Port: 7897
# 测试代理
curl -x http://127.0.0.1:7897 https://ip.me
# 期望显示 VPS IP
# 测试 Google
curl -x http://127.0.0.1:7897 -I https://www.google.com
# 期望:HTTP/2 200
Clash Verge 界面
| 检查项 | 期望状态 |
|---|---|
| 订阅页 → 配置卡片 | 高亮边框(已激活) |
| 代理页 → 节点列表 | 显示 VLESS-Reality、Hysteria2、TUIC-v5 |
| 设置页 → 系统代理 | 已开启 |
| 设置页 → 代理模式 | 规则(Rule) |
| 代理页 → 延迟测试 | 各节点显示延迟数值 |
自动续期
# 查看定时任务
crontab -l | grep acme
# 干跑续期(不实际更新)
~/.acme.sh/acme.sh --renew -d your.domain.com --ecc --dry-run
附录:快速参考
常用命令
# sing-box 管理
sb # 管理菜单
systemctl restart sing-box # 重启
journalctl -u sing-box -f # 实时日志
# 证书管理
~/.acme.sh/acme.sh --list # 列出所有证书
~/.acme.sh/acme.sh --renew -d your.domain.com --ecc # 手动续期
# 订阅
TOKEN=$(cat /etc/s-box/.sub_token)
echo "Clash 订阅: https://your.domain.com/${TOKEN}"
# nginx
nginx -t # 测试配置
systemctl reload nginx # 热重载
端口总览
注意:sing-box 脚本每次安装会随机分配代理协议端口,下表中标注"随机"的端口以实际安装输出为准。
| 服务 | 端口 | 协议 | 说明 |
|---|---|---|---|
| SSH | YOUR_SSH_PORT | TCP | 服务器管理 |
| nginx HTTP | 80 | TCP | 自动跳转 HTTPS |
| nginx HTTPS | 443 | TCP | 订阅服务器 |
| VLESS-Reality | (随机) | TCP | 主力节点 |
| Vmess-WS | (随机) | TCP | 备用 |
| Hysteria2 | (随机) | UDP | 高速节点 |
| TUIC-v5 | (随机) | UDP | 低延迟节点 |
| Anytls | (随机) | TCP | TLS 伪装节点 |
重要文件
| 文件 | 用途 |
|---|---|
/etc/s-box/sb.json | sing-box 服务端配置 |
/etc/s-box/clmi.yaml | Clash 客户端订阅内容 |
/etc/s-box/sbox.json | sing-box 客户端订阅内容 |
/etc/s-box/.sub_token | 订阅 URL 的访问 Token |
/root/ygkkkca/fullchain.crt | SSL 证书 |
/root/ygkkkca/private.key | SSL 私钥 |
/etc/nginx/sites-available/sub | nginx 站点配置 |
/etc/s-box/update_traffic.sh | 流量统计更新脚本 |
/etc/s-box/.traffic_header.conf | 生成的 nginx 流量统计头 |
~/.acme.sh/ | acme.sh 工作目录 |