云服务器搭建个人代理:部署、分流与订阅配置

吃猫的鱼
2026-10-11 / 0 评论 / 7 阅读 / 正在检测是否收录...
文末有可以直接交给 AI 的 Skill(提示词)。把它和服务器连接信息交给能执行 SSH 命令的 AI,并提供操作权限,就能让它完成部署和检查。

这套代理我挺早之前就搭过,最近换了台机器,又从头折腾了一遍,顺手把部署、分流和订阅配置整理出来。

用途很简单:让指定请求经过自己的服务器。比如想从北京的网络访问某个服务,就用北京的服务器做出口。

一、部署准备

我用的是 2 核 2GB 的 Ubuntu 服务器,能通过 SSH 登录,并有 sudo 权限。电脑上可以提前装好 Clash Verge。

服务器上的 Shadowsocks 负责转发请求,Python 服务提供订阅文件;Clash Verge 导入订阅后,按规则选择网络出口。

二、搭建步骤

1. 检查系统和端口

SSH 登录后,先看系统、内存和端口占用:

cat /etc/os-release
free -h
sudo ss -lntup

本文使用 TCP 80、TCP 443 和 UDP 443。如果端口已被网站等服务占用,先调整本次部署端口,后面的配置也要同步修改。

2. 安装并配置代理服务

安装 Shadowsocks 和订阅服务需要的 Python:

sudo apt update
sudo apt install -y shadowsocks-libev python3

先生成节点密码,再编辑 /etc/shadowsocks-libev/config.json:

python3 -c 'import secrets; print(secrets.token_urlsafe(32))'
sudo install -d -m 755 /etc/shadowsocks-libev
sudo touch /etc/shadowsocks-libev/config.json
sudo chmod 600 /etc/shadowsocks-libev/config.json
sudoedit /etc/shadowsocks-libev/config.json

填入刚才生成的随机密码,不要复用 SSH 密码:

{
  "server": "0.0.0.0",
  "server_port": 443,
  "password": "这里替换成独立生成的随机密码",
  "timeout": 300,
  "method": "aes-256-gcm",
  "mode": "tcp_and_udp",
  "fast_open": false
}

再创建 systemd 覆盖配置,通过 LoadCredential 加载这个私有文件:

sudo install -d -m 755 /etc/systemd/system/shadowsocks-libev.service.d
sudoedit /etc/systemd/system/shadowsocks-libev.service.d/self-proxy.conf
[Service]
LoadCredential=ss-config:/etc/shadowsocks-libev/config.json
ExecStart=
ExecStart=/usr/bin/ss-server -c %d/ss-config
Restart=on-failure
RestartSec=5s

这里沿用 Ubuntu 软件包的服务;其他系统先用 systemctl cat shadowsocks-libev 核对。空的 ExecStart= 用来清除原启动命令。

保存以后启动:

sudo systemctl daemon-reload
sudo systemctl enable --now shadowsocks-libev
# 已经运行过的服务,要重启才会读取新配置。
sudo systemctl restart shadowsocks-libev

3. 放行防火墙端口

在云控制台的「防火墙」或「安全组」中放行以下端口:

用途协议、端口说明
登录管理TCP 22能固定管理来源时,限制到自己的来源 IP
下载订阅TCP 80对应本文的 HTTP 订阅服务
代理连接TCP 443网页等 TCP 请求会用到
UDP 转发UDP 443需要 UDP 时单独放行

腾讯云防火墙规则

TCP、UDP 443 分别添加。控制台的“HTTPS”只是 TCP 443 的规则模板,这里跑的仍是 Shadowsocks。

用 sudo ufw status 检查系统防火墙;若已启用,也要放行这些端口,并保留 SSH 规则。

4. 配置客户端和分流规则

准备下面这份 client.yaml,填入服务器地址和节点密码。下一步会用它生成订阅;“北京节点”可以改成自己的名称。

mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
ipv6: false

proxies:
  - name: 北京节点
    type: ss
    server: YOUR_SERVER_IP
    port: 443
    cipher: aes-256-gcm
    password: "与服务端完全一致的节点密码"
    udp: true

proxy-groups:
  - name: 个人代理
    type: select
    proxies:
      - 北京节点
      - DIRECT

rules:
  # 本机、局域网照常直连。
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  # 把 example.com 换成你真正需要指定出口的业务域名。
  - DOMAIN-SUFFIX,example.com,个人代理
  # 这一条用于后面的出口检查;不需要时可以删除。
  - DOMAIN,api.ipify.org,个人代理
  - MATCH,DIRECT

规则从上往下匹配:指定域名走服务器,其余直连。缺少的业务域名,可以从 Clash Verge 的「连接」页面查找、补充。

5. 生成订阅地址

订阅链接指向的就是上面的 YAML。我用了一个 Python 小服务,只响应一条随机路径,其他地址返回 404。

保存订阅配置

把上一节的 YAML 存到服务器的 /root/proxy-client/client.yaml:

sudo install -d -m 700 /root/proxy-client
sudoedit /root/proxy-client/client.yaml
sudo chmod 600 /root/proxy-client/client.yaml

首次部署时,生成独立的随机订阅路径:

sudo python3 - <<'PY'
import json
import os
import secrets
from pathlib import Path

# 创建文件时就限制权限,避免先写入密码再修改权限。
os.umask(0o077)
# 这是首次初始化;已有配置时停止,避免意外更换订阅地址。
folder = Path('/etc/self-proxy')
folder.mkdir(mode=0o700, exist_ok=True)
folder.chmod(0o700)
target = folder / 'subscription.json'
if target.exists():
    raise SystemExit('订阅配置已存在,请按更新流程处理。')

settings = {
    'path': '/s/' + secrets.token_urlsafe(32) + '/config.yaml',
    'yaml': Path('/root/proxy-client/client.yaml').read_text(),
}
target.write_text(json.dumps(settings, ensure_ascii=False))
target.chmod(0o600)
print('订阅配置已生成。')
PY

创建订阅服务

把下面的程序保存到 /usr/local/lib/self-proxy/subscription_server.py:

sudo install -d -m 755 /usr/local/lib/self-proxy
sudoedit /usr/local/lib/self-proxy/subscription_server.py
sudo chmod 644 /usr/local/lib/self-proxy/subscription_server.py
import hmac
import json
import os
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path

# 配置含节点密码,由 systemd 按服务身份提供私有副本。
credential = Path(os.environ['CREDENTIALS_DIRECTORY']) / 'subscription'
settings = json.loads(credential.read_text())
allowed_path = settings['path'].encode('utf-8')
body = settings['yaml'].encode('utf-8')


class Handler(BaseHTTPRequestHandler):
    server_version = 'Subscription'
    sys_version = ''

    def setup(self):
        super().setup()
        self.connection.settimeout(10)

    def log_message(self, *_args):
        # URL 中包含访问凭据,不写入访问日志。
        pass

    def respond(self, include_body):
        valid = hmac.compare_digest(self.path.encode('utf-8'), allowed_path)
        payload = body if valid else b'Not found\n'
        self.send_response(200 if valid else 404)
        content_type = 'text/yaml; charset=utf-8' if valid else 'text/plain'
        self.send_header('Content-Type', content_type)
        self.send_header('Content-Length', str(len(payload)))
        self.send_header('Cache-Control', 'no-store')
        self.send_header('X-Content-Type-Options', 'nosniff')
        self.end_headers()
        if include_body:
            self.wfile.write(payload)

    def do_GET(self):
        self.respond(True)

    def do_HEAD(self):
        self.respond(False)


server = ThreadingHTTPServer(('0.0.0.0', 80), Handler)
server.daemon_threads = True
server.serve_forever()

设置开机启动

保存服务单元 /etc/systemd/system/self-proxy-subscription.service:

sudoedit /etc/systemd/system/self-proxy-subscription.service
[Unit]
Description=Personal proxy subscription
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
DynamicUser=true
LoadCredential=subscription:/etc/self-proxy/subscription.json
ExecStart=/usr/bin/python3 /usr/local/lib/self-proxy/subscription_server.py
Restart=on-failure
RestartSec=5s
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictSUIDSGID=true
RestrictAddressFamilies=AF_INET AF_INET6
TasksMax=64
MemoryMax=128M

[Install]
WantedBy=multi-user.target

启动服务并设为开机启动:

sudo systemctl daemon-reload
sudo systemctl enable --now self-proxy-subscription

获取订阅地址

订阅链接的格式是:

http://YOUR_SERVER_IP/s/YOUR_TOKEN/config.yaml

读取 /etc/self-proxy/subscription.json 的 path 字段,前面加上服务器的 HTTP 地址,就是完整链接。它能下载节点密码,不要公开。

HTTP 会明文传输订阅,随机路径只能防猜测。长期使用建议配域名和证书,改成 HTTPS;TCP 443 已被代理占用,需要另行安排端口。

6. 导入订阅并验证连接

在 Clash Verge 的「订阅」页粘贴地址,点击「导入」并启用。在「代理」页选中节点,再开启系统代理和规则模式。

Clash Verge 订阅入口

在本机下载订阅文件,用 Mihomo 检查:

mihomo -t -f client.yaml

没有 mihomo 命令时,换成 Clash Verge 内置核心的路径。检查通过后,测试实际请求:

curl --proxy http://127.0.0.1:7890 https://api.ipify.org

确认分组中选中了服务器。上面的规则会让这个请求走代理,返回的出口应与服务器一致。

服务器上也复查一下服务状态和监听端口:

systemctl is-active shadowsocks-libev self-proxy-subscription
systemctl is-enabled shadowsocks-libev self-proxy-subscription
sudo ss -lntup

OrcaTerm 实际检查结果

这次两个服务均为 active、enabled;订阅 GET、HEAD 返回 200,根路径返回 404。已配置开机启动,未重启机器验证。

7. 更新订阅配置

修改 /root/proxy-client/client.yaml 后,用下面的命令同步内容并重启服务,订阅链接不变:

sudo python3 - <<'PY'
import json
import os
import tempfile
from pathlib import Path

# 只更新 YAML,保留原来的随机订阅路径。
os.umask(0o077)
target = Path('/etc/self-proxy/subscription.json')
settings = json.loads(target.read_text())
settings['yaml'] = Path('/root/proxy-client/client.yaml').read_text()
# 在同一目录写临时文件,完成后原子替换,避免留下半份配置。
temporary = None
try:
    with tempfile.NamedTemporaryFile(mode='w', encoding='utf-8',
                                     dir=target.parent, delete=False) as f:
        temporary = Path(f.name)
        temporary.chmod(0o600)
        json.dump(settings, f, ensure_ascii=False)
    os.replace(temporary, target)
finally:
    if temporary is not None:
        temporary.unlink(missing_ok=True)
PY
sudo systemctl restart self-proxy-subscription

最后在 Clash Verge 中刷新订阅。

三、踩坑记录

问题原因和处理
服务运行正常,连接却超时腾讯云防火墙漏放了 443。服务监听正常,不代表公网能连进来;云防火墙和系统防火墙要分别检查。
配置文件的读取权限软件包启用了 DynamicUser,不能直接读 root 的 600 文件。用 LoadCredential 交给服务,无需放宽密码文件权限。

UDP 要单独测试。这次五次转发测试成功三次、超时两次,当时能通但不稳定。网页能打开,只能说明 TCP 这一路正常。

四、20Mbps 与 200Mbps 套餐对比

这次重新部署,还有个原因:旧机器用的是入门型套餐,标称带宽 20Mbps;新买的锐驰型写着 200Mbps 峰值带宽。我平时主要看网页、用 AI 工具,想知道换机器后能不能明显顺畅一些。

所以搭好之后,我用同一台电脑、同一个网络,对两台机器做了一轮短时测试:

测试项目旧入门型:20Mbps新锐驰型:200Mbps 峰值
TCP 443 连接耗时中位数,10 次约 621ms约 616ms
HTTPS 小请求成功次数7/88/8

TCP 耗时测的是连接服务器端口,两台很接近。新机这轮 HTTPS 请求全部成功,但样本太少,不能据此判断长期稳定性。

文件下载试了几轮,都没在超时前完成,没有得到可靠的吞吐速度,不能给两台排快慢。200Mbps 是峰值,也不代表每次都能跑满。

这轮也没有覆盖不同运营商和全天时段。对我这样的日常用途,还是得看常用网络下的体验,不能只按套餐数字判断提升。

附:交给 AI 执行的 Skill

把下面整段交给能执行 SSH 命令的 AI,补充服务器连接方式和目标域名。登录凭据单独提供。

Skill 新部署使用 self-proxy-ss 服务,配置集中在 /etc/self-proxy/,从 state.json 更新;正文沿用发行版服务,两套路径不要混用。已有部署会先检查并保留原密码、订阅地址。

---
name: deploy-private-shadowsocks
description: 在用户授权的 Linux 服务器部署个人 Shadowsocks 节点及可导入 Clash/Mihomo 的私密订阅,适用于首次部署、修复和同步已有配置。
---

# 个人 Shadowsocks 与私密订阅

使用现有 SSH、文件传输和命令执行工具完成部署;本文件自包含,按以下结构生成所需脚本,不依赖另一个 Skill。

## 输入与授权
1. 收集必填项:SSH 主机、端口、账户和认证方式;root 或 sudo 权限;实际公网 IP;使用目的、需要代理的域名及最终兜底策略。
2. 可选项:节点名、SS 端口(默认 TCP 443)、是否启用 UDP、订阅域名/证书/端口。拒绝把文档示例地址、私网地址或占位值用于公网部署。
3. 先核对已有授权,复用用户明确同意的安装、服务调整和端口开放范围;只询问真正缺失且影响执行的信息,不重复索要确认。
4. SSH 密钥优先;核验已知主机密钥,首次连接通过用户或云控制台可信指纹核对。指纹变化先停止,不以关闭校验绕过。
5. SSH 密码只交给安全输入通道,不写脚本、命令参数、日志或交付文件;SS 密码单独随机生成,绝不复用登录密码。
6. 订阅协议不明确时优先使用带受信证书的 HTTPS;可以使用域名证书,也可以使用客户端信任且覆盖公网 IP 的证书。
7. 无可用 HTTPS 时,说明 HTTP 会明文传送订阅内容,其中包含节点地址和密码;随机路径不能加密传输。取得或复用明确的 HTTP 授权后才开放公网 HTTP。
8. 没有安装客户端测试工具的授权时,使用已有工具或把测试标记为待完成,不擅自给另一台设备安装软件。

## 只读检查与变更边界
- 检查系统版本、`ss-server`、Python 3、systemd、sudo、磁盘空间及已有代理/网站/防火墙配置;查看 `ss -lntup` 中 TCP/UDP 80、443 和拟用端口。
- 已实测组合是 Ubuntu 26.04、发行版 `shadowsocks-libev` 3.3.5、`aes-256-gcm`;其他版本先验证软件参数与 systemd 功能,不把这一组合当通用保证。
- TCP HTTPS 443 与同一地址上的 TCP SS 443 会冲突:选择不同端口或地址。已有网站占用 80 时,采用经授权的反向代理路径或另选端口,不能停掉网站腾位。
- 使用发行版包管理器安装缺失依赖。若新装软件包自动启动了默认代理服务,只在确认它是本次新增且未承载用户业务后停止、禁用该默认实例。
- 修改前保存受影响文件、权限、服务 active/enabled 状态及防火墙规则到 `/root/self-proxy-backup/TIMESTAMP/`(目录 0700,秘密文件 0600)。不用清空防火墙或覆盖整站配置。
- 云安全组与主机防火墙分别检查;保留 SSH,仅开放选定的 SS TCP、已授权的 SS UDP 和订阅入口。没有云控制权就列出用户待操作项,不声称已开放。
- 变更失败即停止连续重试,保留诊断并还原本次配置和防火墙增量;恢复 active/enabled 状态,原本运行的受影响服务需重启以刷新凭据快照,原本停用的保持停用;清理本次新增单元并复核线上结果。
- 发现端口/服务归属不明、指纹变化或授权不足时停止相关变更,继续独立的只读检查。

## 固定文件结构与幂等生成
- `/etc/self-proxy/`:root:root、0700;`state.json`、`ss.json`、`client.yaml`、`subscription.json` 均 root:root、0600。
- `/usr/local/lib/self-proxy/subscription_server.py`:root:root、0644;生成前确认该路径没有其他任务的文件。
- `/etc/systemd/system/self-proxy-ss.service`、`self-proxy-subscription.service`:root:root、0644。
- `state.json` 是生成源:保存 `public_ip`、`ss_port`、`node_name`、`method`、`password`、`udp`、`proxy_domains`、`fallback`、`subscription_path`、`subscription_url`、`listen_host`、`listen_port`。
- 首次用 Python `secrets.token_urlsafe(32)` 分别生成独立密码和 token;路径固定为 `/s/TOKEN/config.yaml`。重跑读取现有状态,除非明确要求轮换,否则保持密码、token 和用户配置。
- 生成脚本设 `umask(0o077)`,使用 JSON 序列化和 YAML 安全引用;可用 `json.dumps` 生成 YAML 字符串。临时文件在同目录写完、校验、chmod 后 `os.replace` 原子替换。
- 若只有旧配置,先读取并迁移实际参数;不能因缺少状态文件而自动重置凭据。秘密只在内存或受保护文件间流转,关闭命令回显,不打印配置全文。

`ss.json` 结构如下,替换所有大写占位值;UDP 未授权时 `mode` 使用 `tcp_only`:
~~~json
{"server":"0.0.0.0","server_port":SS_PORT,"password":"SS_PASSWORD","method":"aes-256-gcm","timeout":300,"mode":"tcp_and_udp","fast_open":false}
~~~

## 客户端配置与分流
按用户用途生成完整可独立导入的 `client.yaml`;节点参数与 `ss.json` 同源,`udp` 与实际开放情况一致:
~~~yaml
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
ipv6: false
proxies:
  - name: "NODE_NAME"
    type: ss
    server: "YOUR_SERVER_IP"
    port: SS_PORT
    cipher: aes-256-gcm
    password: "SS_PASSWORD"
    udp: UDP_ENABLED
proxy-groups:
  - name: "个人代理"
    type: select
    proxies: ["NODE_NAME"]
rules:
  - DOMAIN-SUFFIX,TARGET_DOMAIN,个人代理
  - IP-CIDR,127.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
  - IP-CIDR,172.16.0.0/12,DIRECT,no-resolve
  - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
  - MATCH,FALLBACK
~~~
- `proxy_domains` 每项生成明确的 `DOMAIN` 或 `DOMAIN-SUFFIX` 规则;这些规则优先于地域和兜底规则。没有明确目标域名时先补齐用途,不能凭空猜测。
- `FALLBACK` 仅取用户选择的 `DIRECT` 或 `个人代理`。北京等中国大陆出口场景不得以宽泛 `GEOIP,CN,DIRECT` 使目标绕过代理;服务器所在地区决定出口地区,分流规则不能改变它。
- 有地域直连需求时,在目标域名规则之后添加并验证;同时说明 GeoIP 数据文件/下载依赖,不让隐式数据下载成为未披露的运行条件。
- 客户端若不能向内核提供域名,域名规则可能无法命中;结合实际客户端 DNS/嗅探/TUN 设置检查,不能仅凭配置顺序宣称分流已生效。

## 订阅服务实现规范
生成标准库 Python 服务:用 `BaseHTTPRequestHandler` 与 `ThreadingHTTPServer`,禁止目录服务、文件路径拼接和写入接口。
- 从 `Path(os.environ["CREDENTIALS_DIRECTORY"])/"subscription"` 读取 JSON,结构为 `{"path":"/s/TOKEN/config.yaml","yaml":"完整 client.yaml 文本","listen_host":"0.0.0.0","listen_port":80}`。
- 启动时把 YAML 编码为 UTF-8 字节快照;使用 `hmac.compare_digest` 比较原始请求路径与固定路径,查询参数、尾斜线、编码变体均不归一化放行。
- 正确路径的 GET 返回 200 和完整 YAML;HEAD 返回相同状态及长度但不发正文。其余 URL 返回 404;POST/PUT/DELETE 等非读取方法统一拒绝且不产生写入。
- 返回 `Content-Type: text/yaml; charset=utf-8`、准确 `Content-Length`、`Cache-Control: no-store`、`X-Content-Type-Options: nosniff`;错误响应使用纯文本。
- 覆盖 `log_message` 禁止记录请求路径,避免 token 进入访问日志;设置连接超时及守护工作线程。日志仅保留不含 URL、密码和 YAML 的启动/错误摘要。
- 获准 HTTP 时默认绑定 `0.0.0.0:80`。HTTPS 反向代理时绑定 `127.0.0.1:未占用端口`,只在受信 TLS 入口公开固定路径,入口与上游均禁用含 token 的访问日志和缓存。
- HTTPS 证书覆盖实际订阅主机;检查完整证书链和续期。不得用 `curl -k` 或关闭客户端校验冒充受信 HTTPS 验收。

## systemd 单元
SS 单元使用以下核心模板;`ss-server` 的实际路径以安装结果为准:
~~~ini
[Unit]
Description=Personal Shadowsocks
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
DynamicUser=true
LoadCredential=ss-config:/etc/self-proxy/ss.json
ExecStart=/usr/bin/ss-server -c %d/ss-config
Restart=on-failure
RestartSec=5s
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
RestrictSUIDSGID=true
RestrictAddressFamilies=AF_INET AF_INET6
TasksMax=64
MemoryMax=128M
[Install]
WantedBy=multi-user.target
~~~
订阅单元复制上述模板的沙箱、重启及启动依赖,改 `Description`,并将两行替换为:
~~~ini
LoadCredential=subscription:/etc/self-proxy/subscription.json
ExecStart=/usr/bin/python3 /usr/local/lib/self-proxy/subscription_server.py
~~~
`DynamicUser` 不直接读取 root 0600 源文件;systemd 通过 `LoadCredential` 向进程提供只读凭据副本。非特权高端口服务可移除绑定低端口能力。

## 应用、同步与验收
1. 本地检查生成脚本语法、JSON、YAML;运行 `systemd-analyze verify` 检查两个单元。明确区分静态检查与真实联网测试。
2. 先写好 `ss.json`、`client.yaml`,再将同一份 YAML 文本写入 `subscription.json["yaml"]`;校验二者逐字一致,其他字段从状态文件生成。
3. 执行 `systemctl daemon-reload`,再 `systemctl enable --now self-proxy-ss self-proxy-subscription`。已有运行服务仅在内容变化时重启;修改快照后必须 restart 订阅服务,单改 YAML 不会生效。
4. 从服务器外部下载私密订阅,验证 HTTP 状态/HTTPS 证书和 HEAD,并核对响应正文与生成的 `client.yaml` 哈希一致;使用受保护的工具参数或 0600 curl 配置文件避免 URL 进入进程参数、历史和日志。
5. 检查错误 token、`/`、追加查询参数、尾斜线等异常 URL 返回 404;测试非读取方法被拒绝,并确认日志不包含 token。
6. 有已授权的 Mihomo 工具时,在隔离目录执行 `mihomo -t -f client.yaml`;临时启用仅回环监听的客户端,在验证副本中把出口查询目标强制交给 `个人代理`,核对返回 IP 与预期服务器出口。另用原始规则测试用户目标域名,检查实际命中规则。
7. 独立测试 UDP:在验证副本中强制 UDP 测试端点走 `个人代理`,通过支持 SS UDP 的客户端向可控回显端点发送随机负载,或经 SOCKS5 UDP ASSOCIATE 发出真实 DNS 查询并收到匹配响应;记录超时、响应与代理路径证据。TCP 成功不能证明 UDP 可用。
8. 核对两服务 `is-enabled`、`is-active` 和监听端口;没有重启服务器授权时不重启机器,用 enabled 状态说明已配置开机启动,不声称已完成重启验证。
9. 逐项报告:外部订阅下载、Mihomo 语法、实际代理出口、目标分流、真实 UDP 往返、异常 URL、开机启动配置。没有工具/授权的项目写“未验证”和具体缺项,不能把 running 当作可用。
10. 通过用户授权的私密渠道交付订阅 URL、客户端配置和端口/更新方法;公开博客、代码仓库和截图只保留占位符,不公开真实 IP、密码或 token。清理本次临时秘密文件,保留受保护的部署状态及回滚备份。

0

评论 (0)

取消
友情链接 文章阅读: 网站地图