Snell v6 部署指南(sing-box)

Snell 为 sing-box 1.14.0 新增。请安装 1.14.0 及以上,并在写入配置前用 sing-box version 确认。字段说明见 Snell inboundoutbound

一、Snell v6 简介

Snell v6 使用预共享密钥(PSK)派生协议画像,并通过 mode 控制流量整形方式。不同 PSK 会产生不同的部署特征,因此不要在多个服务之间重复使用同一个 PSK。

常用模式:

模式 说明
default 默认流量整形模式,适合生产环境
unshaped 不应用流量整形,回退到 v4 风格的随机数据流特征
unsafe-raw 明文调试模式,不提供加密能力,禁止用于生产环境

二、部署前准备

  • 一台使用 systemd 的 Linux VPS,具备 root 或 sudo 权限;官方安装脚本覆盖 deb / rpm / Arch / OpenWrt,不是任意发行版;
  • 云安全组和本机防火墙(ufw / firewalld / nftables)都放行 TCP 443,且未被其他程序占用——只改安全组不够;
  • 准备一串长度为 12–255 字节的随机 PSK。

三、安装 sing-box

bash
curl -fsSL https://sing-box.app/install.sh | sh
sing-box version

输出中的版本号必须 ≥ 1.14.0,否则入站类型 snell 无法识别。若要钉死版本:

bash
curl -fsSL https://sing-box.app/install.sh | sh -s -- --version 1.14.0

脚本会下载 sing-box、安装 systemd 服务(以 sing-box 用户运行,配置目录 /etc/sing-box/)。

四、生成 PSK

PSK 的字符串长度必须在 12–255 字节之间。推荐用 sing-box 自带命令生成 32 字节随机值的 Base64 编码(44 个字符,稳定落在范围内):

bash
sing-box generate rand --base64 32

复制输出结果,稍后填入配置中的 psk。也可以用 OpenSSL 生成同样长度的随机值:

bash
openssl rand -base64 32

长度按 Base64 文本本身计算:原始随机值不要超过 189 字节(Base64 后约 252 个字符),超出 255 字节上限会导致配置校验失败。不要使用短密码、可猜测字符串或多个服务器共用的 PSK。

五、写入服务端配置

将以下配置写入 /etc/sing-box/config.json

json
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "snell",
      "listen": "::",
      "listen_port": 443,
      "version": 6,
      "psk": "CHANGE_THIS_TO_A_GENERATED_PSK"
    }
  ],
  "outbounds": [
    {
      "type": "direct"
    }
  ]
}

必须修改的字段

配置项 说明
inbounds[0].psk 替换为刚刚生成的随机 PSK(长度 12–255 字节,按字符串本身计)
inbounds[0].listen_port 服务端监听端口,默认 443
inbounds[0].listen 默认 ::(IPv6 + IPv4)。机器禁用 IPv6、启动报 cannot assign requested address 时改为 0.0.0.0

mode 默认为 default(流量整形),推荐保持默认,仅在明确了解影响时修改。可选 "reuse": true 启用连接复用(Snell v2 CONNECT),一般保持默认即可。

设置配置文件权限(官方服务以 sing-box 用户运行,600、属主 root 即可):

bash
sudo chmod 600 /etc/sing-box/config.json

六、多用户配置(可选)

如果需要为不同用户设置独立密钥,可以使用 users。顶层 psk 作为服务器密钥,每个用户使用自己的 userkey

json
{
  "inbounds": [
    {
      "type": "snell",
      "listen": "::",
      "listen_port": 443,
      "version": 6,
      "psk": "SERVER_PSK",
      "users": [
        {
          "name": "user1",
          "userkey": "USER1_KEY"
        },
        {
          "name": "user2",
          "userkey": "USER2_KEY"
        }
      ]
    }
  ],
  "outbounds": [
    {
      "type": "direct"
    }
  ]
}

name 仅用于日志标识,可以省略;userkey 用于对应用户认证。

对应用户的客户端出站需要同时填写服务端顶层 psk 和该用户的 userkey

json
"psk": "SERVER_PSK",
"userkey": "USER1_KEY"

七、检查并启动

bash
sudo sing-box check -c /etc/sing-box/config.json
sudo systemctl enable sing-box
sudo systemctl restart sing-box
sudo systemctl status sing-box --no-pager

check 没有输出且退出码为 0 表示配置通过。status 应为 active (running);否则查看日志:

bash
sudo journalctl -u sing-box --output cat -e

八、服务管理

操作 命令
查看状态 sudo systemctl status sing-box --no-pager
启动 sudo systemctl start sing-box
停止 sudo systemctl stop sing-box
重启 sudo systemctl restart sing-box
禁用开机自启 sudo systemctl disable sing-box
查看最近日志 sudo journalctl -u sing-box --output cat -e
实时查看日志 sudo journalctl -u sing-box --output cat -f

九、客户端配置参考

下面是一份可直接 sing-box check 的最小客户端配置:本地 mixed 入站 + 一个出站。出站必须放在 outbounds 数组里,不能把出站对象单独当成完整配置文件。

json
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "mixed",
      "listen": "127.0.0.1",
      "listen_port": 1080
    }
  ],
  "outbounds": [
    {
      "type": "snell",
      "tag": "snell-out",
      "server": "YOUR_SERVER_IP",
      "server_port": 443,
      "psk": "CHANGE_THIS_TO_A_GENERATED_PSK",
      "version": 6
    }
  ]
}

本机 SOCKS / HTTP 代理为 127.0.0.1:1080

要点:

客户端字段 说明
server VPS 公网 IP
server_port 与服务端 listen_port 一致
psk 始终填服务端顶层 psk;服务端启用多用户时,还需填写属于该用户的 userkey
version 与服务端 version 一致,Snell v6 为 6

Snell 协议自带加密,没有 TLS 层。把服务开在 443 能过防火墙,但流量不像 HTTPS,按需换端口或接受可探测性。v6 的 mode 需要两端一致:客户端默认为 default,与服务端默认相同;服务端改用 unshaped 时客户端也要同步修改(unsafe-raw 仅供调试)。客户端同样需要 sing-box 1.14.0+。

十、故障排查

1. 服务启动失败

bash
sudo sing-box check -c /etc/sing-box/config.json
sudo journalctl -u sing-box -n 100 --no-pager

重点排查:

  • sing-box version 是否 ≥ 1.14.0;
  • version 是否写为数字 6
  • PSK 是否为空或长度不在 12–255 字节范围内;
  • 443 端口是否被其他程序占用(sudo ss -lntp | grep ':443');
  • 禁用 IPv6 的机器是否仍在听 ::(改为 0.0.0.0)。

2. 客户端无法连接

依次确认:

  1. systemctl statusactive (running)
  2. 客户端地址、端口和 PSK 完全一致;
  3. 云安全组和系统防火墙放行 TCP 443;
  4. 两端 mode 是否一致(默认均为 default);
  5. 多用户时客户端填对应 userkey
  6. 服务端日志中没有认证失败或协议版本错误。

3. 是否应该使用 unsafe-raw

不应该。unsafe-raw 仅适合本地调试、流量不加密;生产环境应使用 default,或在了解兼容性影响后使用 unshaped

4. 如何确认版本兼容性

出现 unknown inbound typeunsupported version 等错误时,说明当前版本不支持 Snell v6,升级到 1.14.0+ 后重试。

十一、安全建议

  • PSK 用生成命令出,长度落在 12–255 字节,不要短口令、不要多机复用;
  • config.json 权限 600
  • 不要在生产环境使用 unsafe-raw
  • 443 上无 TLS,被主动探测时特征与 HTTPS 不同;
  • 定期升级 sing-box,升级后重新执行 sing-box check