# 单个 AnyTLS / Trojan 节点使用 SOCKS5 出站

## 适用版本与作用范围

适用于 oo v1.0.16-dev.20260925 及包含同项功能的后续版本。本教程使用机器模式、singbox 内核，示例节点 ID 为 237，入口为 node.example.com:11449。示例域名、IP、账号密码均需替换，不是可直接使用的线路。

客户端仍连接原来的 AnyTLS 或 Trojan 入口。只有选中的子节点把用户代理流量转交给 SOCKS5，其他子节点、面板地址、用户认证、证书和 Nginx 路由不因此改变。

```text
客户端 → AnyTLS 节点 237 :11449 → SOCKS5 出口 → 目标网站
原 AnyTLS 节点 :11443       → 保持原出口
原 Trojan 节点 :443        → 保持原出口
```

范围由“机器实例目录 + 节点 ID”共同确定。两个面板即使节点 ID 相同，只要使用不同实例目录，也不会互相覆盖。

目前这是配置文件功能，没有新增“SOCKS5 设置”菜单。不要把出站配置写到整个实例的公共 kernel.custom_config 中，否则该实例下的其他节点也可能继承它。

## 第一步：升级并确认版本

旧版本不认识单节点覆盖文件，可能继续直连。先升级，再配置；不要降级后继续启用带专用出口的节点。

```bash
curl -fL https://node.xboardnext.com/oo/dev/install.sh -o /tmp/oo-install.sh && sudo bash /tmp/oo-install.sh upgrade --version v1.0.16-dev.20260925
sudo oo version
```

首次升级旧命名安装，请使用上面的完整安装器升级命令，不要仅替换核心或使用旧版菜单里的下载地址。升级器会检查旧服务、备份并迁移到 oo.service；发现两套安装或自定义服务时会停止，需先核对。

升级会重启共享节点进程，现有连接会短暂重连。配置、凭据、证书、单节点覆盖文件和既有共享 Nginx 配置应保留；先备份并安排合适的更新时间。

## 第二步：在面板创建独立入口

新节点绑定后可能立即按原出口启动。完成停用、配置、恢复和出口 IP 验证之前，不要分发或使用这个新节点。

在现有机器下新增 AnyTLS 节点，选择该机器 ID；设置正确的 TLS 域名，并使用尚未占用的服务端口。例如已有 AnyTLS 使用 11443，新节点就使用 11449。直接监听时，连接端口与服务端口均填写 11449，同时放行服务器防火墙和云安全组的 TCP 11449。

同一机器实例、相同域名、自动 ACME 模式可以复用已有有效证书，不需要为了新增端口另申请证书。不同机器实例、手工证书和不同域名不保证共享。证书正常不代表代理流量已可用，仍要完成后面的认证访问测试。

新增独立 AnyTLS 端口不需要让 Nginx 再占用这个端口，也不要停用其他网站使用的 Nginx。节点入口协议仍是 AnyTLS，不要为了配置 SOCKS5 出口把入口协议改成 socks。

## 第三步：找到正确的机器实例和节点

```bash
sudo oo list
sudo oo nodes list
```

记下目标节点对应的完整 INSTANCE 值。节点 ID 不是机器 ID，也不是监听端口。

同时在节点启动日志中确认 effective_kernel=singbox；若显示 xray，不能直接使用本页 JSON。尤其是曾经手动指定 Xray 的 Trojan 实例，不要仅根据协议名称判断内核。

在 /etc/oo/config.yml 中找到该实例已有的 kernel.config_dir。默认形如 /etc/oo/instances/INSTANCE_ID，但以实际配置为准。不要覆盖或公开这个主配置文件，它可能引用敏感凭据。

单节点覆盖文件的固定位置是：

```text
<该实例的 kernel.config_dir>/node-237/kernel.override.json
```

例如默认目录结构下：

```text
/etc/oo/instances/INSTANCE_ID/node-237/kernel.override.json
```

下面命令中的 INSTANCE_ID 必须替换为实际完整实例名称；节点 ID 和端口也要按自己的部署修改。先以 root 权限备份目标实例目录，备份保存在网站目录以外，不要上传到公开托管。

## 第四步：只停用待配置的子节点

```bash
sudo oo nodes delete --instance INSTANCE_ID --node-id 237 --yes
sudo ss -lntp 'sport = :11449'
```

这里的 delete 表示仅本机停用，保留面板数据和本地配置；不是 purge，不会删除实例。等待节点停止，确认 11449 已无监听后再修改。如果仍有监听，应核对进程与端口，不要继续覆盖配置。不要使用 --all。

## 第五步：填写 SOCKS5 出口

确认上述实际节点目录存在，使用编辑器创建 kernel.override.json。例如默认目录下可使用：

```bash
sudo nano /etc/oo/instances/INSTANCE_ID/node-237/kernel.override.json
```

粘贴以下完整 JSON，并替换 SOCKS5 地址、端口、账号和密码。192.0.2.10 是文档示例 IP，不能作为真实出口。

```json
{
  "outbounds": [
    {
      "type": "socks",
      "tag": "node-237-socks",
      "server": "192.0.2.10",
      "server_port": 1080,
      "version": "5",
      "username": "CHANGE_ME_USER",
      "password": "CHANGE_ME_PASSWORD"
    }
  ],
  "route": {
    "final": "node-237-socks"
  }
}
```

无需认证的 SOCKS5 可以删除 username 与 password 两行，注意 JSON 最后一项不能保留多余逗号。含双引号或反斜杠的密码要使用正确的 JSON 转义。不要把真实密码放进命令参数、公开教程或截图。

限制文件权限并检查 JSON 语法：

```bash
sudo chmod 600 /etc/oo/instances/INSTANCE_ID/node-237/kernel.override.json
sudo python3 -m json.tool /etc/oo/instances/INSTANCE_ID/node-237/kernel.override.json > /dev/null
```

python3 检查只验证 JSON 语法，不验证出口是否在线，也不替代内核配置检查。该文件不能是符号链接。实例若已有公共 kernel.custom_config，新文件会被拒绝而不是静默覆盖；需先整理原有定制配置。

这个文件使用 singbox 原生格式，不能直接用于 Xray。不要修改运行时自动生成的 config.json，也不要在此文件中添加入站或证书设置。

## 第六步：恢复选中的节点

```bash
sudo oo nodes restore --instance INSTANCE_ID --node-id 237 --yes
sudo ss -lntp 'sport = :11449'
sudo journalctl -u oo.service -n 80 --no-pager
```

管理进程会读取覆盖文件并重新启动该子节点。不需要为这一步重启所有实例；其他子节点保持运行。仅保存文件不会可靠地让一个已经运行的节点重新加载，所以每次修改都应先停用该节点、确认停止、再编辑和恢复。

若使用 sudo systemctl restart oo.service，则会重启共享进程，所有 oo 实例会短暂重连。这不是日常修改单节点出口的首选方式。

## 第七步：验证实际出口，而不只看端口

用支持对应协议的客户端连接新节点。客户端填写的是 AnyTLS 的域名、端口和面板下发的用户密码，不是 SOCKS5 的账号密码。

在确认浏览器流量经过该节点的情况下访问出口 IP 查询网站，并访问实际 HTTPS 网站；出口 IP 应与 SOCKS5 服务商提供的出口一致。再切回原 AnyTLS、Trojan 节点，确认它们仍使用原出口。

https://api.ipify.org

服务器直接运行 curl 查看的是服务器自己的出口，不能据此判断子节点是否走了 SOCKS5。服务器直连 Google 成功也不代表客户端 → AnyTLS → SOCKS5 的完整链路成功。

面板的“机器在线”和“节点在线”是不同状态。机器在线不代表所有子节点都启动成功；新节点还需成功拉取用户、上报状态。访问测试后等待一次上报周期再刷新面板，不要仅凭红、黄、绿圆点判断线路是否可用。

## 分流、DNS 与 UDP 注意事项

route.final 只指定未被其他规则匹配的默认出口。已有面板直连规则或其他出站规则仍然优先。需要该节点的公网代理流量全部走 SOCKS5 时，必须先检查并清理不符合目标的分流规则；不要添加位于私网保护之前的粗暴全匹配规则。

此配置不改变服务器的面板 API、证书申请、其他进程的系统流量，也不保证全部 DNS 查询通过 SOCKS5。普通 SOCKS5 链路本身不提供 TLS 加密，请使用可信的出口服务和网络。

TCP 可用不代表 UDP 可用。UDP 还需要 SOCKS5 服务端支持 UDP 转发并开放相应网络；不要把开关或 UDP over TCP 当成上游自动具备的能力。本教程的 HTTPS 验证仅证明 TCP 链路。

## 常见问题

端口冲突：新增节点不能使用已有服务的监听端口。面板改好端口后，如节点之前已经启动失败，需要仅停用并恢复该子节点；不应删除其他服务来腾出端口。

JSON 或覆盖配置被拒绝：查看 oo 日志，检查文件位置、权限、JSON 格式、是否误用了 Xray 字段、是否与公共 custom_config 冲突。选中节点应停止，不要为了“变绿”移除专用出口后继续直连。

SOCKS5 连接失败或认证失败：核对地址、端口、账号密码、出口白名单与上游状态。先确认节点服务器能访问上游，再测试完整代理链路。

网站能访问但出口仍是服务器 IP：检查是否升级到支持本功能的版本、文件是否放在正确实例的正确子节点目录、是否完成子节点重启、客户端是否真的使用该节点，以及有无优先匹配的直连规则。

证书错误：检查域名解析、证书有效期、TLS/SNI 和现有续期入口。修改 SOCKS5 出站不需要删除证书或重装 Nginx。

文件在运行期间被移走或破坏：本功能不是持续的防篡改或强制断网保护。已有原生配置加载器在后续重建时可能跳过丢失文件；务必先停用子节点，再编辑或移动文件。备份恢复、回收站恢复后也需重新验证出口。

## 恢复原出口（仅在确实希望取消 SOCKS5 时）

先停用目标子节点并确认端口停止。把该节点的 kernel.override.json 移到实例外的私有备份目录，然后恢复这个子节点。不要删除整个 node-237 目录、证书或父实例，也不要直接删除 SOCKS5 出站却保留指向它的 route.final。

移走整个单节点覆盖文件后，该节点回到继承的原配置；只有原配置没有其他出站或分流定制时，才等于直连。恢复后重新核对出口 IP，其他节点不应改变。

若配置失败，请让该节点保持停用。不要通过降级到不支持覆盖文件的旧核心来排错，否则该节点可能意外恢复直连。

## 返回安装与升级指南

https://node.xboardnext.com/oo/
