AnyTLS 部署指南(sing-box)

证书两种方案任选其一:ACME 自动申请(推荐,需域名)或自签名证书。ACME 使用 certificate_providers 写法,需要 sing-box 1.14.0+。AnyTLS 占用 TCP 443,不能用 TLS-ALPN 挑战(会与入站抢端口),用 HTTP-01(TCP 80)或 DNS-01。用 IP 申请会自动套用 Let's Encrypt shortlived 短期证书(约 6 天有效期、续期频繁),故推荐域名。自签名方案不要把 insecure 当默认。字段说明见 AnyTLS inbound

一、部署前准备

确认以下条件:

  • VPS 使用 Debian、Ubuntu 等带 systemd 的 Linux 发行版,具备 root 或 sudo 权限;官方安装脚本覆盖 deb / rpm / Arch / OpenWrt
  • 一个已解析到该 VPS 的域名,以及可接收邮件的邮箱(ACME 申请用);
  • 云安全组和本机防火墙放行 TCP 443,且未被 Nginx、Caddy 等占用;ACME HTTP-01 还需放行 TCP 80——只改安全组不够;
  • 准备一个足够复杂的连接密码。

二、安装 sing-box

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

输出中的版本号必须 ≥ 1.14.0,否则不认识 certificate_providers。若要钉死版本:

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

脚本会下载 sing-box、安装 systemd 服务(以 sing-box 用户运行)并创建 /etc/sing-box/

三、生成证书(二选一)

方案 A:ACME 自动申请(推荐,使用域名)

把域名解析到 VPS 后按第四章配置,sing-box 会自动完成证书签发与续期。挑战只能走 HTTP-01(TCP 80)或 DNS-01,不要用 TLS-ALPN

方案 B:自签名证书

bash
sudo openssl ecparam -name prime256v1 -genkey -noout \
  -out /etc/sing-box/server.key

sudo openssl req -x509 -nodes \
  -key /etc/sing-box/server.key \
  -out /etc/sing-box/server.crt \
  -subj "/CN=bing.com" \
  -addext "subjectAltName=DNS:bing.com" \
  -days 825

sudo chmod 600 /etc/sing-box/server.key
sudo chmod 644 /etc/sing-box/server.crt

CN=bing.com 只是示例伪装名,不代表证书由 Bing 签发。-addext 给证书附加 subjectAltName(SAN)——把证书导入客户端信任列表并启用严格校验时,SAN 必须与 server_name 一致。有效期用 825 天,避免部分客户端拒绝「过长有效期」的证书。密钥用 P-256,不要改成 Ed25519。

使用此方案时删除 certificate_providers 段,tls 段改为:

json
"tls": {
  "enabled": true,
  "certificate_path": "/etc/sing-box/server.crt",
  "key_path": "/etc/sing-box/server.key"
}

客户端应导入该证书并保持 insecure 为关闭。"insecure": true 等于放弃证书校验,任意中间人可冒充服务端,只适合临时排障。

四、写入服务端配置

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

json
{
  "log": {
    "level": "info",
    "timestamp": true
  },
  "certificate_providers": [
    {
      "type": "acme",
      "tag": "acme_cert",
      "domain": [
        "YOUR_DOMAIN"
      ],
      "email": "YOUR_EMAIL@example.com",
      "data_directory": "/var/lib/sing-box/certmagic"
    }
  ],
  "inbounds": [
    {
      "type": "anytls",
      "listen": "::",
      "listen_port": 443,
      "users": [
        {
          "password": "CHANGE_THIS_TO_A_STRONG_PASSWORD"
        }
      ],
      "tls": {
        "enabled": true,
        "server_name": "YOUR_DOMAIN",
        "certificate_provider": "acme_cert"
      }
    }
  ],
  "outbounds": [
    {
      "type": "direct"
    }
  ]
}

data_directory 必须落在官方服务的 StateDirectory/var/lib/sing-box)下。省略时 ACME 数据跟 sing-box 用户的 HOME 走,重启后可能丢证书或写不进去。

必须修改的字段

配置项 修改为
certificate_providers[0].domain[0] 你的域名(需解析到该 VPS)
certificate_providers[0].email 你的邮箱地址
inbounds[0].users[0].password 高强度连接密码
inbounds[0].tls.server_name 与证书所用的域名相同
inbounds[0].listen 默认 ::。机器禁用 IPv6 时改为 0.0.0.0

YOUR_DOMAIN 必须在 domain[0]tls.server_name 两处保持一致,且已解析到当前 VPS;密码不要继续使用示例值。

建议限制配置文件权限:

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

可选字段说明

  • padding_scheme:服务端填充方案,客户端无需配置;留空时使用内置默认方案,一般无需修改;
  • users[].name:可选字段,仅用于日志中区分用户。

客户端不要设置 client_metadata。1.13.16 起默认留空,避免被对端画像;不要为了「完整」把它加回去。

五、检查并启动

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": "anytls",
      "tag": "anytls-out",
      "server": "YOUR_SERVER_IP",
      "server_port": 443,
      "password": "CHANGE_THIS_TO_A_STRONG_PASSWORD",
      "tls": {
        "enabled": true,
        "server_name": "YOUR_DOMAIN"
      }
    }
  ]
}

本机 SOCKS / HTTP 代理为 127.0.0.1:1080

要点:

客户端字段 说明
server VPS 公网 IP
password 与服务端 users[0].password 完全一致
tls.server_name 与服务端 tls.server_name 一致,即证书申请所用的域名

服务端使用 ACME 签发的公网受信证书时,客户端不要设置 insecure。使用自签名证书(方案 B)时,把服务端证书导入客户端信任列表,而不是打开 insecure

八、故障排查

1. 443 端口无法监听

检查端口占用:

bash
sudo ss -lntp | grep ':443'

如果已有 Nginx、Caddy 或其他 sing-box 实例监听 443,需要停止冲突服务,或修改 listen_port。禁用 IPv6 时把 listen 改为 0.0.0.0

2. ACME 证书申请失败

重点检查:

  • 域名是否已解析到该 VPS(可用 dig +short 你的域名 确认);
  • domain[0]tls.server_name 是否一致;
  • TCP 80 是否放行、是否被占用(HTTP-01);不要指望 TLS-ALPN,443 已被 AnyTLS 占用;
  • data_directory 是否为 /var/lib/sing-box/certmagic
  • 系统时间是否准确;
  • 日志中是否出现证书申请或验证错误。

3. 修改配置后服务无法启动

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

4. 客户端无法连接

依次确认:

  1. systemctl statusactive (running)
  2. VPS 防火墙和云安全组放行 TCP 443
  3. 客户端密码与 users[0].password 完全一致;
  4. 服务端日志中没有认证失败或证书错误。

九、安全建议

  • 密码用长随机值,不要示例字符串;
  • config.jsonserver.key 权限 600
  • 优先 ACME 公网证书;自签要导入证书,不要长期开 insecure
  • 不要自定义 client_metadata
  • 定期升级 sing-box,升级后重新执行 sing-box check