AnyTLS 部署指南(sing-box)
AnyTLS 占用 TCP 443。证书用 ACME(推荐,要域名)或自签名。ACME 使用 certificate_providers,需要 sing-box 1.14.0 及以上。不要改回已废弃的 tls.acme,它会在 1.16.0 移除。入站占着 443,不能用 TLS-ALPN,只用 HTTP-01(TCP 80)或 DNS-01。域名为 IP 时,Let's Encrypt 会自动使用 shortlived profile,所以推荐域名。字段见 AnyTLS inbound。
准备
- 带 systemd 的 Linux VPS,有 root 或
sudo;官方安装脚本覆盖 deb、rpm、Arch、OpenWrt。 - 一个解析到该 VPS 的域名,以及可收信的邮箱。
- 安全组和本机防火墙放行 TCP
443;HTTP-01 还要放行 TCP80。443 不能被 Nginx 或 Caddy 占用。 - 一个足够长的随机密码。
安装
curl -fsSL https://sing-box.app/install.sh | sh
sing-box version版本必须 ≥ 1.14.0,否则不认识 certificate_providers。
证书
ACME 按下一节配置,sing-box 会申请并续期。自签名则不要长期开 insecure:
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.crtCN=bing.com 只是示例名。导入客户端并严格校验时,SAN 必须与 server_name 一致。密钥用 P-256,不要改成 Ed25519。自签名时删掉 certificate_providers,把 tls 换成:
"tls": {
"enabled": true,
"certificate_path": "/etc/sing-box/server.crt",
"key_path": "/etc/sing-box/server.key"
}服务端
写入 /etc/sing-box/config.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)下。省略时数据跟着 sing-box 用户的 HOME 走,重启后可能写不进去。YOUR_DOMAIN 在 domain[0] 和 tls.server_name 两处必须一致,并且已经解析到这台 VPS。
| 配置项 | 修改为 |
|---|---|
certificate_providers[0].domain[0] |
解析到该 VPS 的域名 |
certificate_providers[0].email |
邮箱 |
users[0].password |
长随机密码 |
tls.server_name |
与证书域名相同 |
listen |
禁用 IPv6 时改为 0.0.0.0 |
padding_scheme 留空即用内置默认值,客户端不用配。users[].name 只用于日志。不要设置 client_metadata:1.13.16 起默认留空,加回去没有协议用途。
sudo chmod 600 /etc/sing-box/config.json
sudo sing-box check -c /etc/sing-box/config.json
sudo systemctl enable sing-box
sudo systemctl restart sing-box日志:sudo journalctl -u sing-box -e。
客户端
本机代理是 127.0.0.1:1080。ACME 证书不要加 insecure。自签名应导入证书,而不是打开 insecure。
{
"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"
}
}
]
}排查
- 443 被占用时看
sudo ss -lntp | grep ':443',停掉冲突服务或改listen_port。禁用 IPv6 时不要听::。 - ACME 失败时核对解析、
domain[0]与server_name、TCP 80,以及data_directory是否为/var/lib/sing-box/certmagic。不要用 TLS-ALPN。 - 客户端密码与
users[0].password一致,安全组放行 TCP 443。日志里不应有认证失败或证书错误。
安全
密码用长随机值。config.json 和 server.key 权限 600。优先 ACME。不要自定义 client_metadata。升级后重新执行 sing-box check。