开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


AnyTLS 服务端搭建使用密码认证的 TLS 服务,客户端先验证证书,再传输应用流量。本文采用 两台获授权的 Ubuntu 24.04 LTS amd64 主机及 sing-box 1.14.3,设置回环客户端代理和独立服务端单元。内容依据官方文档,作者未进行完整端到端实测。[1]
关键要点
- 证书验证与用户密码解决不同问题,不能互相替代。
- 建立基线时保留默认填充和空闲会话行为。
- 改凭证后检查新连接,编辑文件本身不是撤销证据。
- 恢复仅涉及本练习的服务、防火墙、证书副本及客户端设置。
你需要能管理自有端点的完整生命周期:证书签发、私钥访问、用户、日志、更新和停用。先按自建责任分配指南确定负责人。若只是需要日常公网出口,先确认托管 VPN 能否省去这些维护。
Trojan 协议介绍提供另一种 TLS 协议背景,不代表可导入 Trojan 配置。VPN 连接覆盖说明帮助区分单应用代理和整机路由。本文只讨论同一核心双端,不覆盖 GUI、面板、REALITY 组合或兼容性矩阵。
独立服务器预留 TCP 24444,客户端预留回环 1080。通过现有 CA 支持的签发和续期流程取得自有域名的有效证书链及匹配私钥。服务器实际本地地址可与外部映射地址不同;只使用有权管理的 NAT 映射。
安装前私下记录软件包版本、服务启用状态、APT 源、相关防火墙规则、地址及解析器设置。测试新的独立 SSH 或服务商控制台通道。下文名称和路径都须未占用;属于现有安装时先与负责人协调,不覆盖。
双端先安装 Ubuntu 的 curl、ca-certificates、openssl,再添加官方稳定 APT 源。选择列表中核心为 1.14.3 的准确 APT 软件包版本。占位值故意不是可安装版本;找不到目标发行版就停止,不默默换成测试版。[5]
sudo apt-get update
sudo apt-get install curl ca-certificates openssl
sudo install -d -m 755 /etc/apt/keyrings
sudo curl -fsSL https://sing-box.app/gpg.key -o /etc/apt/keyrings/sagernet.asc
sudo chmod 644 /etc/apt/keyrings/sagernet.asc
sudo tee /etc/apt/sources.list.d/sagernet.sources >/dev/null <<'REPO'
Types: deb
URIs: https://deb.sagernet.org/
Suites: *
Components: *
Enabled: yes
Signed-By: /etc/apt/keyrings/sagernet.asc
REPO
sudo apt-get update
apt-cache madison sing-box
sudo apt-get install sing-box='APT_VERSION_FOR_1.14.3' curl ca-certificates openssl
sing-box version
核对双端均报告 1.14.3。保留可恢复的软件包或发行文件,升级前查看发行和安全信息。检查软件包默认服务,不启动或挪用其他工作单元。
服务端创建独立账户,复制已签发的证书链和私钥,替换 /PRIVATE/SOURCE/ 为实际受保护位置。客户端不需要私钥。[4]
sudo useradd --system --user-group --no-create-home --shell /usr/sbin/nologin sbanytls
sudo install -d -o root -g sbanytls -m 750 /etc/sing-box-anytls
sudo install -o root -g sbanytls -m 640 /PRIVATE/SOURCE/fullchain.pem /etc/sing-box-anytls/fullchain.pem
sudo install -o root -g sbanytls -m 640 /PRIVATE/SOURCE/privkey.pem /etc/sing-box-anytls/privkey.pem
在私密终端执行 openssl rand -base64 32 生成独立密码,安全保存并通过授权安全通道传递。将密码粘贴到私密编辑器,不放入 shell 参数;不分享包含可复用凭证的配置、截图或日志。users.name 是用户标签,密码才是认证秘密。[2]
用提权私密编辑器创建 /etc/sing-box-anytls/config.json。SERVER_LOCAL_IPV4 换成实际分配给主机的 IPv4,双端替换相同密码。文件属主 root:sbanytls,权限 640。
{
"log": {
"level": "info"
},
"dns": {
"servers": [
{
"type": "local",
"tag": "system-dns"
}
]
},
"inbounds": [
{
"type": "anytls",
"tag": "anytls-in",
"listen": "SERVER_LOCAL_IPV4",
"listen_port": 24444,
"users": [
{
"name": "reader-test",
"password": "REPLACE_WITH_PRIVATE_PASSWORD"
}
],
"tls": {
"enabled": true,
"certificate_path": "/etc/sing-box-anytls/fullchain.pem",
"key_path": "/etc/sing-box-anytls/privkey.pem"
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct"
}
],
"route": {
"final": "direct",
"default_domain_resolver": "system-dns"
}
}
省略 padding_scheme,使用实现默认值。自定义填充不在本文范围,也不能证明在某个网络中隐形或可靠。服务端 type: local 的 DNS 服务器和 default_domain_resolver 明确目的域名解析路径,不修改客户端系统解析器。[2][6]
保存独立单元 /etc/systemd/system/sing-box-anytls.service,root 所有,权限 644。该服务不需要低端口绑定,也不访问用户家目录。
[Unit]
Description=Isolated sing-box anytls reader exercise
After=network-online.target
Wants=network-online.target
[Service]
User=sbanytls
Group=sbanytls
ExecStart=/usr/bin/sing-box run -c /etc/sing-box-anytls/config.json
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
sudo -u sbanytls /usr/bin/sing-box check -c /etc/sing-box-anytls/config.json
sudo systemctl daemon-reload
sudo systemctl start sing-box-anytls.service
sudo systemctl status sing-box-anytls.service --no-pager
sudo ss -lntp
配置检查成功或服务 active 不证明 TLS、密码接受或转发成功。用 sudo journalctl -u sing-box-anytls.service -n 30 --no-pager 查看有限近期日志,分享前移除地址及秘密。私密文件访问失败时修正属主权限,不放宽私钥读取范围。
沿用当前防火墙管理者。仅当 UFW 已启用且负责策略时,允许测试客户端可见公网地址到服务器本地地址 TCP 24444,注释 anytls-test;需要服务商许可时也采用相同窄范围。保存确切规则以便移除,保留管理通道,不重置共享防火墙。
仅在上述 UFW 条件下,替换两个地址占位值后执行:
sudo ufw allow proto tcp from CLIENT_PUBLIC_IP to SERVER_LOCAL_IPV4 port 24444 comment 'anytls-test'
私下创建 anytls-client.json。SERVER_PUBLIC_IPV4 使用可达数字地址,anytls.example.com 使用证书真实域名。客户端连接所选 IP,同时验证证书域名;保持 insecure: false。[4]
{
"log": {
"level": "info"
},
"inbounds": [
{
"type": "mixed",
"tag": "local-in",
"listen": "127.0.0.1",
"listen_port": 1080
}
],
"outbounds": [
{
"type": "anytls",
"tag": "anytls-out",
"server": "SERVER_PUBLIC_IPV4",
"server_port": 24444,
"password": "REPLACE_WITH_PRIVATE_PASSWORD",
"tls": {
"enabled": true,
"server_name": "anytls.example.com",
"insecure": false
}
}
],
"route": {
"final": "anytls-out"
}
}
本例省略空闲会话选项。出站文档给出的检查间隔和空闲超时默认均为 30 秒,最少空闲会话默认是零;结构示例中的五不是默认值。超时由周期检查处理,不是精确的应用断开时刻。[3]
chmod 600 anytls-client.json
sing-box check -c anytls-client.json
sing-box run -c anytls-client.json
保持前台客户端运行。mixed 监听只在回环接受明确配置的 HTTP 或 SOCKS 客户端,不是整机捕获机制。保留现有网络控制,不改其他代理应用。
另一终端通过 SOCKS 远端解析名称,发送限时请求:
curl --noproxy "" --proxy socks5h://127.0.0.1:1080 --connect-timeout 5 --max-time 20 https://example.com/
完成请求只证明该应用所测路径。若验证浏览器出口,使用明确配置回环 HTTP 代理的独立浏览器配置,查看该浏览器请求可见的地址,之后恢复原代理。两者都不能证明其他应用、DNS、IPv6 或 UDP 的覆盖。
准备私密配置副本。每次只 Ctrl-C 停止自己的前台客户端,使用选定副本重新启动,再发出新请求,避免已认证连接池掩盖错误密码或名称。
| 读者检查 | 预期现象 | 解释或恢复 |
|---|---|---|
| 密码与证书名称正确 | 新请求完成 | 私下记录请求及时间,不据此声称吞吐量 |
| 只更改密码 | 新连接无法认证 | 确认有效客户端文件,没有旧监听进程 |
| 只改证书名称为无关域名 | TLS 验证失败 | 检查链和名称,保留证书验证 |
| 只停止本服务单元 | 新请求失败 | 表面成功时追查实际提供服务的进程 |
| 客户端闲置后再次请求 | 服务健康时可创建新会话 | 空闲池清理本身不等于故障 |
| 移除用户、检查文件并重启本单元 | 旧凭证的新连接失败 | 重启也会中断本单元既有连接 |
| 保留授权用户或配置新用户后重启 | 新请求恢复 | 失败时恢复安全文件,不恢复泄露凭证 |
表格是读者检查标准,不是测量结果。空闲检查至少跨过一次检查间隔,结合有限客户端和服务端日志,不从单个时间戳推断精确寿命。应用持续持有的长请求应单独观察,不能当成空闲池会话。[3]
文件修改不保证实时撤销用户。此独立单元故意没有 ExecReload,先验证配置再 systemctl restart,建立明确中断点。不要把通用 reload 命令描述成立即撤销会话。
沿用现有证书流程续期,按原受限权限安装匹配证书链和私钥。以 sbanytls 检查配置,仅重启本单元,通过新连接验证实际身份和有效期。TLS 文档描述文件重载,但本文采用显式重启和验证,不把替换文件当作完成。[4]
密码泄露后更换受影响凭证并重启,打断本单元旧连接。确认新凭证可用、旧凭证失败,再考虑 sudo systemctl enable sing-box-anytls.service,随后在授权维护窗口重启主机并检查新请求。
停用时停止并禁用本单元,停止前台客户端,仅移除记录中的本练习防火墙和服务商许可,恢复浏览器代理。保留必要私密诊断,删除本练习单元、证书及配置副本,运行 sudo systemctl daemon-reload。检查监听、原管理和 DNS 路径。只有基线证明无人依赖且由本次新增时才删除软件包或 APT 源。恢复未核实就停止变更,使用独立管理通道。
用 sudo openssl x509 -in /etc/sing-box-anytls/fullchain.pem -noout -subject -issuer -dates 查看部署文件的身份和有效期。这只是本地文件信息,必须结合新的 TLS 验证请求;读取文件本身不能证明远端进程实际提供哪张证书。
删除练习文件后,只有确认没有剩余进程、服务单元或文件依赖其 UID 或组时,才移除本练习新建的 sbanytls 账号。使用 sudo userdel sbanytls,不强制删除,也不连带删除家目录;专用组若仍存在且没有其他成员或依赖,再用 sudo groupdel sbanytls 移除。保留原有身份,所有权不明时停止。无需保留时删除自己的 anytls-client.json 和反例副本;必要备份仍须私密保存,不重新启用已撤销凭证。[7][8]
关闭会移除正在建立的身份检查。应修正服务器名、信任链、时间或证书部署,保持验证开启。[4]
不能。应采用本实现匹配的 AnyTLS 字段,共同使用 TLS 不代表不同协议的配置可以互换。
文件编辑本身没有这种证明。本文重启独立服务,再用被移除凭证检查新连接。
不是。未使用的池会话可以正常回收,应先检查之后的新请求能否建立健康会话,再判断是否故障。[3]
本基线不需要。文档默认是零,保持省略,只有具备独立理由和验证时才调优。[3]
不能。它只验证所测浏览器路径,其他应用、DNS、IPv6 和 UDP 需要各自受支持的配置及检查。
停止练习,或恢复仍有效的匹配证书及安全配置;验证新的 TLS 和应用请求后再恢复服务,不能恢复泄露私钥。
免责声明:只管理获授权的主机和网络,遵守适用法律及政策。预期现象是读者验证标准,不是作者测试记录或网络可用性保证。
来源:
Sources checked 2026 年 10 月 11 日。
延伸阅读:
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。