sing-box 管理脚本详细教程:安装、节点配置、订阅与安全更新

sing-box 管理脚本详细教程:安装、节点配置、订阅与安全更新
落魄君子sing-box 管理脚本详细教程:安装、节点配置、订阅与安全更新
在 Linux VPS 上维护 sing-box,不只是写一份 JSON:内核、systemd、端口、证书、客户端参数和更新兼容性,任何一项没对上,都可能让节点无法连接。
本文介绍我的 LuoPoJunZi/sing-box 管理脚本。项目原名 Sing-box-EV,现已更名为 sing-box,服务器上的快捷命令仍然是 sb。它提供终端菜单与命令行两种入口,将节点创建、链接导出、诊断、备份和组件更新集中管理。
2026-10-01 更新:本文按仓库
main分支的脚本版本v26.9.25整理。当前项目推荐 sing-box 稳定内核1.14.2,不再沿用“1.14 仍是 alpha”的旧说明。脚本版本、内核版本和客户端版本是三回事,正式发布与后续变更以 项目 Releases 和 更新记录 为准。
请仅在自己拥有或获得授权的服务器、网络中使用,并遵守适用规定和服务商条款。本文示例不包含真实密码、UUID、私钥或 Tunnel Token,实际使用时以自己的节点输出为准。
一、先分清项目、内核与客户端
| 名称 | 作用 |
|---|---|
LuoPoJunZi/sing-box |
本文的 Bash 安装与节点管理项目 |
SagerNet/sing-box |
上游通信内核,不是本文脚本仓库 |
sb |
安装本项目后使用的管理命令 |
| v2rayN / Sing-box 图形客户端等 | 在电脑或手机上导入节点并发起连接 |
本项目不是 SagerNet 官方客户端,也不是浏览器 Web 管理面板。它基于 233boy 生态做重构与扩展,按职责拆分源码;开源协议为 GPL-3.0。
项目能力
- 安装和更新管理脚本、sing-box 内核,以及按需使用的 Caddy/cloudflared。
- 添加、修改、删除和查看节点,支持 20 多种协议及传输组合。
- 输出分享链接、本地二维码、Base64 订阅和临时 Web 订阅。
- 管理 Reality 域名池,按健康状态、权重和区域选择 SNI。
- 控制服务、日志、自动维护任务和 DNS。
- 用
doctor检查环境、配置、监听、证书固定和兼容风险。 - 在关键变更前创建配置快照,提供手动备份、回滚与 dry-run 预演。
- 用安装清单查看脚本管理的文件、服务和端口。
自动诊断与回滚用于降低维护风险,不是“更新绝不会失败”的保证,也不能替代异机备份和客户端实际连接检查。
二、安装前准备
本文命令在 Linux VPS 的 Bash 终端执行,不是在本地 Windows 的 Hexo 博客目录中执行。
<配置名>、<端口>等为说明占位符,不能把尖括号原样粘贴到 Shell。
1. 系统、架构与权限
需要:
- root 权限;
- 能正常使用的 systemd;
x86_64或arm64架构;- 能访问 GitHub API、Release、Raw 及依赖软件源;
- 可用的服务器网络、DNS 和客户端连接路径。
README 列出了 Ubuntu 20.04+、Debian 11+、CentOS 7+ 等环境,这是项目的兼容说明,不等于这些旧发行版仍适合新装。新服务器优先选择仍在安全维护期内的发行版。
当前安装器实际识别 apt-get、yum、zypper。只有其他包管理器、没有 systemd 的容器或精简系统,不要直接套用;先确认脚本是否支持自己的环境。系统时间也应正确:
1 | timedatectl status |
2. 不要与已有安装混用
建议在用途清晰的 VPS 上部署。已有 sing-box、Caddy、cloudflared 或其他代理脚本时,先检查命令路径、配置和服务,避免覆盖:
1 | command -v sb |
本项目默认将 /usr/local/bin/sing-box 和 /usr/local/bin/sb 指向管理入口,真实内核位于 /etc/sing-box/bin/sing-box。不要只看到命令名称相同,就认为它与系统软件包安装的上游程序是同一个入口。
3. 端口、防火墙与云安全组
云安全组与 VPS 防火墙是两层配置。服务正在监听,不代表公网已经放通。
| 场景 | 需要关注的协议/端口 |
|---|---|
| VLESS Reality、TCP 类节点 | 实际导出端口的 TCP 入站 |
| Hysteria2、TUIC、VMess-QUIC | 实际导出端口的 UDP 入站 |
| 域名 TLS / Caddy | 实际 HTTPS 入站及证书挑战所需的 TCP 80/443 |
| CFtunnel | VPS 到 Cloudflare 的出站及本机源站映射,不是直接开放同一 UDP 节点 |
| SSH 管理 | 保留自己的 SSH TCP 端口 |
自动端口由脚本分配,不要假设所有节点都使用 443。创建后从 sb info 获取实际地址和端口,再设置云安全组。
例如自己的 Reality 节点使用 TCP 45625,在 UFW 中可放行:
1 | ufw allow 45625/tcp |
Hysteria2 使用相同数字的 UDP 端口时,规则是:
1 | ufw allow 45625/udp |
按实际节点选择,不必把两种协议都放行,也不要为了省事开放所有端口。脚本可能处理本机规则,但不会替你修改云厂商安全组。
4. 哪些场景需要自己的域名
- Reality:通常不需要拥有域名,但仍需要合适的握手目标和可达的 TCP 网络。
- Hysteria2/TUIC 自签路线:可以直接使用 IP,客户端要保留对应证书固定值。
- 带域名的 VLESS/VMess/Trojan TLS 组合:准备正确解析到服务器的域名,并满足证书申请条件。
- CFtunnel:准备 Cloudflare 账户、相应域名、Tunnel Token 和公开主机名映射。
NAT/内网 VPS 使用直接节点时,还需要正确的公网地址与端口映射。脚本显示一个 IP,并不证明该 IP 对客户端可达。
三、安装:首次会自动创建 Reality 节点
1. 下载并阅读安装器
登录 VPS,取得 root 权限。使用一个未被其他文件占用的保存路径:
1 | curl -fL https://raw.githubusercontent.com/LuoPoJunZi/sing-box/main/install.sh -o /root/sb-install.sh |
确认来源后,也可以使用一键方式,二选一:
1 | bash <(curl -fsSL https://raw.githubusercontent.com/LuoPoJunZi/sing-box/main/install.sh) |
GitHub 备用入口:
1 | bash <(curl -fsSL https://github.com/LuoPoJunZi/sing-box/raw/main/install.sh) |
缺少 curl 时先通过本机包管理器补齐。备用链接同样依赖 GitHub,不代表 GitHub 完全不可达时仍能使用。
安装入口来自 main,当前在线安装流程会获取正式 Release 的脚本包和上游内核,并检查下载摘要与包结构。先阅读入口不等于已经审核后续下载的全部代码,仍要确认来源与终端报错。行为见 安装器源码。
2. 安装器完成哪些工作
当前安装器会:
- 检查 root、架构、systemd 和依赖。
- 下载、校验内核及管理脚本发布包。
- 安装脚本和命令链接,初始化主配置与服务。
- 自动创建首个 VLESS Reality 节点,输出连接信息。
- 初始配置生成或校验失败时报告安装未完成,不再直接提示成功。
因此首次安装完成后,应先查看已经创建的节点,不必立刻再运行 sb add reality 创建第二个节点。
3. 查看安装结果
1 | sb version |
多节点环境可在提示中选择,或指定实际配置名。后文还有 sb all,用于集中显示全部链接。
如果 sb 不存在,先看安装是否中途失败,再检查命令链接;必要时重新登录 SSH。不要把重复执行安装器当作无影响的“更新脚本”方式,已有环境更新应使用后面的 sb update。
首次成功后的最短路线:
1 | 安装器自动创建节点 |
四、菜单与 CLI 命令速查
直接执行 sb 进入菜单。当前主菜单按节点、系统和高级工具分组:
1 | 节点管理 |
“进阶选项”包含订阅、全部节点、日志、DNS、手动更新、doctor、快照、回滚和安装清单等工具。编号以后可能变动,按实际菜单与 sb help 为准。
| 命令 | 用途 |
|---|---|
sb help |
查看当前命令与参数 |
sb version / sb status |
版本与服务状态 |
sb add <协议> ... / sb a ... |
新增节点 |
sb info <配置名> / sb i ... |
节点信息与兼容提示 |
sb url <配置名> |
分享链接及证书固定提示 |
sb all / sb sub |
全部链接 / 订阅聚合 |
sb change <配置名> ... / sb c ... |
修改节点 |
sb del <配置名> / sb d ... |
删除节点 |
sb doctor / sb log |
诊断 / 日志 |
sb backup list / sb rollback |
快照列表 / 回滚 |
sb dry-run <命令> ... |
预演支持的操作 |
sb manifest summary |
安装清单摘要 |
配置名来自脚本列出的节点名称,不是客户端备注或 UUID。多个节点时,先在菜单或 /etc/sing-box/conf/ 中确认实际文件名,再操作。
不同协议的参数位置不完全相同,例如 Reality 使用端口、UUID、SNI,Hysteria2 使用端口、密码。新手直接用菜单添加,更不容易把参数填错。
五、新增 Reality 节点与域名池
1. 需要第二个节点时再新增
自动选择端口、UUID 和 SNI:
1 | sb add reality auto auto --auto-sni |
需要指定端口时,例如:
1 | sb add reality 45625 auto --auto-sni |
两条是不同方案,不是要连续运行。端口 45625 必须未被占用,并在安全组中开放 TCP。
脚本生成 Reality 密钥、UUID 和 Short ID。当前新建节点使用 8 位十六进制 Short ID,导出链接包含 sni、pbk、sid 和 fp;不要漏掉这些参数。
2. 对照监听与客户端
1 | sb status |
端口按实际值替换,核对 TCP 监听、安全组及客户端参数。Reality 不需要自己的 CA 域名证书,并不意味着 SNI 或握手目标可以随便填写。
3. 管理 Reality 域名池
1 | sb domain list |
list:查看内置、自定义与禁用条目。test:做 DNS/TCP443/TLS 健康检查并更新缓存。pick:预览当前选择结果,不会自动把所有已有节点都切换成这个 SNI。
添加自定义目标,权重与区域为可选参数:
1 | sb domain add www.cloudflare.com 12 global |
区域支持项目定义的 us、eu、apac、global,按自己的实际使用场景选择。这些标签是选择策略,不是自动测定的服务器物理位置。
删除自定义域名或禁用内置域名:
1 | sb domain del www.cloudflare.com |
以上是功能示例,不是建议同时添加再删除。内置条目被删除时会进入禁用清单,不会修改源码。
池数据默认保存在 /etc/sing-box/sh/:
1 | domain_custom.list |
自动健康检查只能降低选择成本,不能保证某个目标在所有地区、线路和客户端上一直适用。已有节点更换 SNI 后,需要重新导出并更新客户端。
六、其他协议怎么选
1. 协议与传输组合
项目菜单目前提供以下组合:
- QUIC/UDP:Hysteria2、TUIC、VMess-QUIC。
- VMess:WS、TCP、HTTP,以及 H2-TLS、WS-TLS、HTTPUpgrade-TLS。
- VLESS:H2-TLS、WS-TLS、HTTPUpgrade-TLS、REALITY、HTTP2-REALITY。
- Trojan:基础节点,以及 H2-TLS、WS-TLS、HTTPUpgrade-TLS。
- 其他:Shadowsocks、AnyTLS、CFtunnel、Socks。
“菜单里有”不等于“所有客户端都支持”。旧传输、新内核和导入字段之间仍可能存在兼容差异;尤其 VMess-QUIC,项目也提示它属于兼容风险较高的旧路线,新建节点不要只看协议数量。
2. Hysteria2 / TUIC
Hysteria2 示例,端口和密码自动生成:
1 | sb add hysteria2 auto auto |
TUIC 示例,自动生成所需参数:
1 | sb add tuic auto auto |
都需要放行实际节点的 UDP 端口,并按 sb info 的当前提示处理自签证书固定。
这里的 Hysteria2 由 sing-box 内核提供,与 hy2ctl 管理的独立 Hysteria2 程序不同。不要混用服务名、配置路径或内核版本;同一 VPS 同时部署两套工具时,也不能占用同一个 UDP 监听端口。
3. 域名 TLS 组合
通过菜单选择 VLESS/VMess/Trojan 的 TLS 传输组合,开始前确认:
- 域名 A/AAAA 指向当前服务器,错误的 AAAA 不应保留。
- 域名解析已生效,证书申请路径可达。
- TCP 80/443 与实际公开 TLS 端口按配置放通。
- Caddy 没有与已有 Web 服务冲突。
- 客户端域名、SNI、路径与传输方式一致。
本项目通常让 Caddy 提供公开 TLS 入口,sing-box 节点监听本机内部端口。内部监听端口可能与客户端连接的 HTTPS 端口不同,以导出结果为准,不要把内部端口直接拿来连接公网。
4. Shadowsocks 与 SOCKS
需要明确了解密码、加密方式及客户端支持情况。SOCKS 命令格式示意:
1 | sb add socks auto '替换为用户名' '替换为强随机密码' |
不能原样使用示例凭据。SOCKS 用户名/密码并不让 SOCKS 传输自动变成 TLS,限制来源地址,不要把它当作可无保护开放的公网加密节点。
七、客户端导入:链接、二维码与证书固定
1. 导出单节点和全部节点
1 | sb info |
sb info 查看完整信息及兼容片段,sb url 获取单节点分享链接,sb all 集中显示有效链接。多个节点时指定实际配置名,可以减少选错节点的机会。
优先复制完整链接到客户端导入,然后核对实际使用的内核。导入成功只说明客户端接受了文本,不证明字段映射、证书验证和通信都正确。
2. 按协议保留固定字段
| 节点路线 | 当前导出方式 |
|---|---|
| Reality | 明确导出 sni、pbk、sid、fp |
| 自签 Trojan / VMess-QUIC | 使用 pcs 固定证书,不再导出旧的跳过验证字段 |
| 自签 Hysteria2 | 官方 URI 组合 insecure=1 + pinSHA256 |
| TUIC 通用链接 | insecure=1 + pcs,另提供 Sing-box 公钥固定提示 |
| 域名 CA TLS | 正确 SNI 与证书链验证,不应随意关闭验证 |
以上是本项目策略,不是所有图形客户端都能自动正确转换这些字段。详情见 证书固定输出源码。
无法计算证书指纹时,项目会拒绝输出该节点的链接、二维码或订阅条目。不要添加 allowInsecure 来绕过,应先修复证书文件、匹配的私钥及 OpenSSL 环境。
3. Sing-box 公钥指纹不能用 pcs 代替
pinSHA256/pcs:这里是整张证书的 SHA-256 指纹。certificate_public_key_sha256:证书公钥的 SHA-256,使用 Base64 编码。
不是同一个值,也不是换一个字段名就能互用。部分图形客户端不会把 pcs 转成 Sing-box 所需的公钥字段,所以项目在 sb info 中另外给出 TLS 片段。
按本项目当前输出,自签 Sing-box 客户端片段示意为:
1 | "tls": { |
这是需要嵌入相应 outbound 的片段,不是完整 JSON 配置。Hysteria2/TUIC 还应保留输出中的 alpn 等实际参数,不要照抄占位值。字段要求参考 Sing-box TLS 文档。
4. 客户端版本与证书变更
项目给出的旧版安全/兼容下限包含 v2rayN 7.24.9 和 Xray-core 26.7.11,不能把它们当作长期停留旧版的理由。
截至本文更新日,v2rayN 7.25.4 正式版 已说明支持 sing-box 1.14。原文的“1.14 仍未稳定”和旧客户端建议不再适用,但仍需检查图形客户端实际选择和安装的内核。
修改 UUID、密码、端口、SNI 或重新生成证书后,客户端里已经保存的节点不会自动变化。重新导出并覆盖旧配置;重新签发自签证书时,证书/公钥固定值也可能变化。
5. 二维码的隐私边界
使用 sb qr 可在装有 qrencode 的终端中显示二维码。二维码内容与完整节点链接一样包含凭据。
项目还会给出在线二维码生成地址。在浏览器打开第三方二维码链接,会将完整节点 URL 提交给该服务。优先使用本地终端二维码或直接复制链接,不要把凭据交给不信任的在线转换网站。
八、订阅导出与临时 Web 服务
进入菜单的订阅功能,或运行:
1 | sb sub |
1. Base64 剪贴板订阅
脚本收集有效分享链接,再编码为一段 Base64,可在支持这种格式的客户端中从剪贴板导入。
Base64 只是编码,不是加密。订阅里包含密码、UUID 和连接地址;泄露这一段文本,等同于泄露其中的节点链接。
这种聚合不是 Sing-box 完整 JSON,也不是 Clash/Mihomo 配置。客户端必须支持这类链接订阅,不能因为名字都叫“订阅”就直接互用。
2. 临时 Web 订阅的实际行为
当前实现检测到 Python3 时,还会启动:
1 | 文件目录:/tmp/sb_sub/ |
它使用 Python HTTP 服务,没有 TLS、没有登录认证,路径也不是随机秘密地址。脚本还会尝试结束占用 9866/TCP 的进程,因此该端口已有其他业务时不要使用这条路径。
建议优先使用剪贴板方案。确实使用临时 Web 方式时:
- 先确认端口空闲,仅允许可信客户端访问,不要为它长期开放公网。
- 不经明文网络传递敏感订阅,优先采用受控安全通道。
- 导入后按回车结束临时服务,并确认监听关闭。
- 不把该地址当作永久订阅;临时服务关闭后,客户端自动刷新会失败。
- SSH 中断或进程异常时,不要假设服务已被清理。
查看是否仍有监听:
1 | ss -lntp 'sport = :9866' |
具体行为见 订阅实现。界面的成功提示不应被理解为对所有网络条件的安全保证。
九、日常管理、日志与 DNS
1. 服务控制
按需选择命令,不要把启动、停止、重启当作必须连续执行的一组:
1 | sb start |
使用 Caddy 时可单独操作:
1 | sb restart caddy |
部分服务控制在后台发起,执行后再看实际状态。CFtunnel 的状态还需要查看对应 cftunnel-端口.service,sb status 不是所有相关服务的完整清单。
2. 日志
1 | sb log |
当前命令跟踪 /var/log/sing-box/access.log;按 Ctrl+C 结束。文件不存在或服务启动阶段失败时,查看 systemd 日志:
1 | journalctl -u sing-box.service --no-pager -n 100 |
提高日志等级会修改配置并重启,不是只读查看:
1 | sb log debug |
排查完成后按需恢复 info,避免长时间记录过多内容。sb log none 和 sb log del 有关闭日志或删除日志的效果,保留需要的故障证据后再操作。
3. 修改与删除节点
先备份,再使用:
1 | sb change <配置名> |
例如只预演端口变化:
1 | sb dry-run change <配置名> port auto |
确认影响后再执行真实修改,同步云安全组和客户端。删除节点、换端口后,也要检查是否仍保留不需要的防火墙放行规则。
4. DNS 设置
1 | sb dns |
这里主要处理 sing-box 配置中的 DNS,不等于修改了所有应用的系统 DNS。既有配置应先备份,出现新版兼容提示时按文件定位问题,不要为了消除警告随意删掉 DNS 规则。
十、doctor 能检查什么,不能证明什么
遇到问题先运行:
1 | sb doctor |
当前诊断涵盖:
- 发行版、架构、权限、systemd、基础依赖;
- 终端颜色、磁盘、安装清单与快照状态;
- 相关服务、节点端口、主配置与节点 JSON;
- Reality 的身份字段、TCP 监听和握手参数;
- 自签证书、公钥固定与客户端兼容风险;
- sing-box 版本及旧 DNS/规则字段;
- Caddy 自定义配置的已知风险组合;
- 受管 cloudflared 隧道的重启次数与最近日志。
1. 当前版本基线
项目区分 sing-box 最低兼容值 1.13.19 与推荐稳定值 1.14.2。达到最低值不代表已经采用推荐版本,达到推荐值也不表示配置无需迁移。上游稳定补丁可对照 sing-box 1.14.2 发布页。
2. 诊断不是外部连接测试
doctor 在服务器本机检查,不会替你完整验证:
- 云安全组是否对实际客户端开放;
- 客户端网络是否允许 TCP/UDP;
- 图形客户端是否把 URI 正确转成相应内核配置;
- 端到端证书握手、DNS、路由与实际业务流量。
所以“服务 running”和“doctor 没有阻断项”仍需要客户端实际连接确认。
3. 无色模式与保存结果
1 | NO_COLOR=1 sb doctor |
当前实现会在 NO_COLOR 非空、TERM=dumb 或非 TTY 输出时关闭颜色,这是正常的纯文本模式。
需要检查终端是否支持 ANSI 色彩时,可运行:
1 | printf '\033[36m青色标题\033[0m\n\033[32m绿色成功\033[0m\n\033[33m黄色提醒\033[0m\n\033[31m红色错误\033[0m\n' |
诊断输出不会自动等同于已经脱敏。对外分享前检查 IP、域名、配置名、UUID、密码和日志内容,不要上传整套配置或 Token。
十一、备份、回滚、dry-run 与安装清单
1. 手动快照
1 | sb backup create "升级前备份" |
默认快照目录是 /etc/sing-box/sh/backups/。当前实现保存主配置 config.json、节点目录 conf/,以及适用时脚本自己的 Caddy 配置片段和版本元信息。
只保留最近 20 个快照。关键操作前创建有说明的手动快照更容易辨认,但不能把它当作永久历史记录。
2. 快照不是整机备份
当前配置快照不包含所有内容,例如:
/etc/sing-box/bin/中的内核和共享自签证书/私钥;- 全部 Caddy 数据及 ACME 账户、证书缓存;
- 全部系统服务定义、Tunnel Token、二进制;
- 云安全组和完整系统防火墙状态。
重要节点应另行备份证书、匹配的私钥、必要的服务配置及环境记录,并保存到服务器或安装目录之外。Reality 私钥也可能存于节点 JSON 中,快照同样属于敏感文件。
快照范围以 当前实现 为准。
3. 回滚配置
选择快照:
1 | sb rollback |
指定快照 ID:
1 | sb rollback <snapshot_id> |
可先预演:
1 | sb dry-run rollback <snapshot_id> |
sb rollback 主要恢复配置,不会按元信息里的版本号自动降级内核、脚本或恢复所有外部资源。它也可能覆盖当前节点目录;确认所选快照后再执行。
回滚后检查:
1 | sb status |
再用客户端连接,必要时重新导出旧参数。不能因为命令打印“回滚完成”就认定服务健康和公网连接都已恢复。
4. dry-run 的边界
常用预演:
1 | sb dry-run change <配置名> port auto |
当前版本对未支持详细预演的命令会明确提示未执行,不会直接落入真实操作。预演用于看操作范围,不是配置实际生效、服务可用或网络连接成功的证明;执行真实操作前仍要备份。
5. 安装清单
1 | sb manifest summary |
清单默认位于 /etc/sing-box/sh/.install_manifest。它记录脚本管理的文件、目录、服务、计划任务和端口,不是所有共享组件的完整依赖分析。
raw 适合排障,但原始记录同样可能包含不想公开的路径或配置信息,对外分享前检查。
十二、组件更新与 sing-box 1.14 迁移
1. 四种更新目标
| 命令 | 更新对象 |
|---|---|
sb update core |
sing-box 内核 |
sb update sh |
本项目管理脚本 |
sb update caddy |
已安装的 Caddy |
sb update cloudflared |
已安装的 cloudflared |
默认内核更新跟随上游正式 Release,不自动追随预发布版本。指定版本属于主动选择,应先确认兼容性,不要在生产环境为试用字段切到 alpha。
旧脚本先更新管理代码,再按诊断结果决定内核升级:
1 | sb backup create "管理脚本更新前" |
确认兼容问题处理好后,再安排内核维护:
1 | sb backup create "内核升级前" |
2. 更新保护机制与边界
当前更新流程会:
- 使用 HTTPS 下载并检查 GitHub Release 提供的 SHA-256;
- 校验信息缺失或不匹配时拒绝替换;
- 对内核、Caddy 先运行候选文件并验证适用配置;
- 替换后检查服务,异常时尝试恢复旧二进制与适用配置;
- 更新脚本时保留清单、快照与 Reality 域名数据;
- 更新 cloudflared 时检查受管且原先运行中的 Tunnel 服务。
这些检查不能覆盖所有故障;恢复命令自身也可能失败。配置快照与更新器的临时二进制恢复是不同机制,不要以为 sb rollback 能替代任何组件的版本回退。
3. 旧 DNS 不能只换一个字段名
当前升级检查会扫描主配置和节点目录里的旧格式:
dns.servers[].address;- 特殊旧 DNS server、FakeIP;
- DNS outbound/strategy、旧响应匹配规则;
- 缓存字段和内联 ACME;
- 远程规则集
download_detour; - 未显式配置 HTTP client 的规则下载方式。
普通主配置的旧 DNS address 可以生成候选 type/server 配置,只有候选内核验证通过才提交。特殊 DNS、节点目录中的旧格式及冲突规则,可能要求先手动迁移。
不是所有 WARN 都会自动迁移,也不是把 address 一律替换成 server 就完成了升级。按 sb doctor 列出的具体文件处理,再参考 sing-box 官方迁移文档。
计划在后续版本移除的弃用字段,可以现在逐步整理;不要为消除提醒直接删除仍承担分流或解析功能的规则。
4. JSONC 与证书对
当前项目要求其管理流程中的配置是标准 JSON。手工加入注释的 JSONC,先转换为标准 JSON,不要粗暴删除所有包含 // 的文本,以免破坏 URL 等字段。
已有证书不会仅因打开菜单或查询而自动重签。只剩证书或私钥时,应恢复匹配的一对文件;随意重新签发会改变客户端固定值。
5. Caddy 与 cloudflared 提示
当前脚本会拒绝更新到 cloudflared 2026.8.0/2026.8.1,并对受管隧道的频繁重启、Docker bridge/QUIC 崩溃特征及未回退 HTTP/2 的日志给出提示。检查没发现特征,不等于所有版本、容器网络都已兼容。
Caddy 自定义配置组合 forward_auth 与 reverse_proxy 时,有已公开的上游错连风险;官方公告列出修复版本 2.11.5。以当前正式 Release 和实际配置核对,不要把脚本里某个稳定基线数字当作全面安全保证。
本项目默认配置并不使用 forward_auth,doctor 的提醒不会自动替你改 Caddy 配置或修复服务。
十三、域名 TLS 与 Cloudflare Tunnel
1. 域名 TLS 的完整链路
客户端连接的是公开 TLS 入口,Caddy 再转发到本机 sing-box 对应传输。排查时同时看:
1 | getent ahosts node.example.com |
node.example.com 替换为自己的域名。核对 DNS、公开 HTTPS 端口、证书、SNI、WebSocket/HTTP 路径和内部端口。
脚本在 80/443 被占用时可能提示改用非标准本机端口,但这不自动改变 CA 从公网访问的挑战端口要求。没有正确转发或其他验证方式时,自动分配一个端口不能保证证书申请成功。
与已有网站共用 Caddy 时,先保存站点配置,确认导入片段与监听没有冲突,不要为了节点安装覆盖网站。
2. CFtunnel 的配置顺序
本项目的 CFtunnel 场景使用 VLESS/WebSocket,经 Cloudflare 公开 HTTPS 主机名转发到本机源站。它不是把任意 Hysteria2/TUIC UDP 端口塞进普通 HTTP Tunnel。
- 在 Cloudflare 创建 Tunnel,取得 Token。
- 在
sb菜单选择 CFtunnel,输入对应 Token 和准备用于节点的域名。 - 记录生成的内部端口、UUID 与 WebSocket 路径。
- 在 Cloudflare 配置相同的公开主机名,源站服务指向正确的本机 HTTP 地址,例如
http://127.0.0.1:内部端口。 - 查看 cloudflared 服务,确认 Tunnel 在线后,再导出客户端链接。
源站地址是格式示意,不是可原样执行的 Shell 命令。公开域名、客户端 SNI/Host 和 WebSocket 路径要对应。协议与源站映射参考 Cloudflare 发布应用说明。
项目创建的服务名通常为 cftunnel-端口.service:
1 | systemctl list-unit-files 'cftunnel-*.service' |
再对实际服务使用 systemctl status、journalctl -u。Token 会用于服务配置,服务文件、命令输出和备份都可能包含它;不要把 systemctl cat 的完整 Tunnel 输出公开。
十四、重要路径与故障排查
1. 路径速查
| 默认路径 | 用途 |
|---|---|
/usr/local/bin/sb |
管理快捷命令 |
/usr/local/bin/sing-box |
本项目管理入口链接 |
/etc/sing-box/bin/sing-box |
上游内核二进制 |
/etc/sing-box/config.json |
主配置 |
/etc/sing-box/conf/ |
节点配置目录 |
/etc/sing-box/bin/tls.cer / tls.key |
共享自签证书/私钥 |
/etc/sing-box/sh/ |
管理脚本与模块 |
/etc/sing-box/sh/backups/ |
配置快照 |
/var/log/sing-box/access.log |
文件日志 |
/etc/caddy/Caddyfile |
Caddy 主配置 |
/etc/caddy/LuoPoJunZi/ |
本项目 Caddy 片段 |
默认服务会同时加载主配置与节点目录,不是只读取一个 JSON 文件。系统服务单元还可能有覆盖项,用 systemctl cat sing-box.service 看实际定义。
2. Hysteria2 可用,Reality 不可用
先看监听协议:Hysteria2 是 UDP,Reality 是 TCP。放行 UDP 不代表 TCP 已放行。
1 | sb status |
再核对 Reality 的实际 TCP 端口、UUID、SNI、Public Key、Short ID 与客户端传输。不要直接换密码或重装整套脚本。
3. 客户端导入成功,但不能连接
- 使用服务器当前
sb info/sb url重新核对。 - 检查实际内核及证书固定字段映射。
- 确认 IP、端口、协议和 TCP/UDP 放行一致。
- 查看客户端日志与服务端日志。
- 修改了凭据或重签证书时,再覆盖旧节点。
服务端没有日志不一定证明完全没收到网络数据,可能只是日志等级或输出位置不同;不要把单一现象当作结论。
4. 证书指纹缺失,链接被拒绝
检查 tls.cer 是否存在、是否能由 OpenSSL 读取、私钥是否匹配。查询不会替你自动补证书。
先保存当前文件并检查备份,恢复匹配证书对;确需重签时按项目流程操作,随后更新所有使用这份证书的客户端。不要通过关闭验证绕过导出保护。
5. 更新后服务仍然失败
1 | sb status |
优先查看第一处有效错误:配置字段、配置目录、文件权限、二进制或服务恢复。配置问题可选择适用快照回滚;二进制或外部组件问题,需要对应的版本恢复,不能只运行 sb rollback 就假设全恢复。
6. 临时订阅无法访问或刷新
检查本次是否真的启动 Python 服务、9866 是否被占用、云安全组是否允许可信来源、客户端拿到的地址是否可达。临时服务关闭后不能刷新是预期行为,不要为了修复订阅把无认证 HTTP 服务长期留在公网。
7. 提交 Issue 前保存信息
提供操作系统、脚本/内核/客户端版本、协议与传输方式、复现步骤及脱敏的诊断/日志。不要上传完整订阅、私钥、Tunnel Token 或包含认证信息的二维码。
问题入口:项目 Issues。
十五、完整卸载:先确认共享组件
先查看范围并预演:
1 | sb manifest summary |
有保留需求时,先创建快照,并把重要配置、证书和备份复制到安装目录之外。本机快照位于 /etc/sing-box/sh/backups/,卸载安装目录时也会一起删除。
真正卸载:
1 | sb uninstall |
卸载不会自动先创建快照。清理范围包含安装目录、日志、命令链接、服务、定时任务、Tunnel 和相关防火墙记录。
更重要的是,当前兼容清理逻辑还可能删除整个 /etc/caddy、Caddy 二进制、cloudflared,以及匹配的 cftunnel-*.service,不是只逐条删除清单中已确认独占的资源。同一 VPS 上有网站或其他隧道共用这些组件时,不要直接执行完整卸载。
清理端口规则也可能影响使用相同端口的其他服务。云安全组和 Cloudflare 控制台配置不一定随本机卸载一起删除,应另行按实际用途处理。
范围依据见 卸载源码。卸载后不能靠已经删除的本机快照恢复。
十六、开发与发布说明
1. 按职责修改源码
1 | install.sh 安装入口 |
新增字段时同步修改输入/写入、查询导出、校验和帮助;不要只改 JSON,不改分享链接。
2. 开发环境命令
1 | git clone https://github.com/LuoPoJunZi/sing-box.git |
默认测试以隔离环境为主,真实内核与 VPS 验收是单独入口:
1 | # 会访问 GitHub Release,下载并检查真实内核 |
这些命令是开发说明,不是让已有生产节点全部照做。旧教程中位于 scripts/ 的部分 smoke/regression 入口,已经迁到 tests/e2e/。
3. 版本与发布
脚本版本来源于 src/init.sh 的 is_sh_ver,使用日期格式,如 v26.9.25。GitHub Actions 从 RELEASE_NOTES.md 提取对应的“主要变化”,并等待相应检查后发布。
发布成功、模拟测试通过都不等于所有真实 VPS 的安装、重启、共享服务卸载和公网客户端已经验证。参考 架构文档 与 VPS 回归清单。
结语
首次部署,先使用安装器自动创建的 Reality 节点,核对端口、放行安全组,再导入客户端;需要其他节点时再新增。
日常维护记住四件事:修改前备份、异常先诊断、更新区分组件、客户端同步参数。订阅、证书和快照都属于敏感内容,预演和自动回滚不能替代对操作范围的确认。





