311 lines
8.8 KiB
Markdown
311 lines
8.8 KiB
Markdown
# AnyTLS-go 备用服务器安装指南
|
||
|
||
## 1. 文档信息
|
||
|
||
| 项目 | 内容 |
|
||
| --- | --- |
|
||
| 目标 | 在 Linux 服务器上安装 AnyTLS-go,作为 VLESS + REALITY 主入口之外的备用入口 |
|
||
| 适用架构 | x86_64/amd64、aarch64/arm64 |
|
||
| 示例版本 | `v0.0.13` |
|
||
| 默认端口 | `8443/TCP` |
|
||
| 更新日期 | 2026-07-25 |
|
||
|
||
本文是 [VLESS + REALITY 与 AnyTLS 双协议部署方案](VLESS-Reality与AnyTLS双协议部署指南.md) 中 AnyTLS 备用入口的详细安装步骤。安装的是 [`anytls/anytls-go`](https://github.com/anytls/anytls-go) 参考服务端实现,默认独立监听 `8443/TCP`,不与监听 `443/TCP` 的 Xray 服务互相转发。执行前,将文中的端口、服务器地址和密码按实际环境填写。
|
||
|
||
> **重要限制**:官方将 AnyTLS-go 定位为协议参考实现,而不是功能完备的生产级服务端。当前 `anytls-server` 会在每次启动时生成一个短期自签名证书,不支持通过命令行加载正式证书。客户端需要允许该实现对应的不安全证书校验方式。若生产环境要求校验证书、域名和 SNI,应改用支持 AnyTLS 的 sing-box 服务端方案。
|
||
|
||
## 2. 部署参数
|
||
|
||
安装前确认以下参数:
|
||
|
||
| 参数 | 示例 | 说明 |
|
||
| --- | --- | --- |
|
||
| 服务器公网地址 | `<SERVER_IP_OR_DOMAIN>` | 客户端连接地址 |
|
||
| 服务端口 | `8443` | 必须为未占用的 TCP 端口 |
|
||
| 密码 | `<RANDOM_HEX_PASSWORD>` | 建议使用至少 32 字节随机值 |
|
||
| CPU 架构 | `amd64` 或 `arm64` | 由 `uname -m` 确认 |
|
||
|
||
同时确认云平台安全组、主机防火墙和上游网络均允许所选 TCP 端口入站。
|
||
|
||
## 3. 前置检查
|
||
|
||
登录服务器后执行:
|
||
|
||
```bash
|
||
uname -m
|
||
cat /etc/os-release
|
||
sudo ss -lntp 'sport = :8443'
|
||
```
|
||
|
||
架构对应关系:
|
||
|
||
| `uname -m` 输出 | 发布包架构 |
|
||
| --- | --- |
|
||
| `x86_64` | `amd64` |
|
||
| `aarch64` 或 `arm64` | `arm64` |
|
||
|
||
若端口检查有输出,说明 `8443` 已被占用,应先选择其他端口。
|
||
|
||
安装依赖,按服务器发行版选择一组命令:
|
||
|
||
```bash
|
||
# Debian / Ubuntu
|
||
sudo apt-get update
|
||
sudo apt-get install -y curl unzip openssl
|
||
```
|
||
|
||
```bash
|
||
# RHEL / Rocky Linux / AlmaLinux
|
||
sudo dnf install -y curl unzip openssl
|
||
```
|
||
|
||
## 4. 下载并安装
|
||
|
||
以下命令固定安装 `v0.0.13`,并使用 GitHub Release 提供的 SHA-256 摘要校验安装包:
|
||
|
||
```bash
|
||
ANYTLS_VERSION=0.0.13
|
||
|
||
case "$(uname -m)" in
|
||
x86_64)
|
||
ANYTLS_ARCH=amd64
|
||
EXPECTED_SHA256=7e80fc099ea54a71110d256dd60648c47c63c70a3c499eb1f6d7aaa4edb7016f
|
||
;;
|
||
aarch64|arm64)
|
||
ANYTLS_ARCH=arm64
|
||
EXPECTED_SHA256=88cb762c3c8eb56b46a2d8d6feab9c0858655192143fc164874229499246a956
|
||
;;
|
||
*)
|
||
echo "不支持的 CPU 架构: $(uname -m)" >&2
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
WORK_DIR="$(mktemp -d)"
|
||
PACKAGE="anytls_${ANYTLS_VERSION}_linux_${ANYTLS_ARCH}.zip"
|
||
|
||
curl --fail --location \
|
||
--output "${WORK_DIR}/${PACKAGE}" \
|
||
"https://github.com/anytls/anytls-go/releases/download/v${ANYTLS_VERSION}/${PACKAGE}"
|
||
|
||
echo "${EXPECTED_SHA256} ${WORK_DIR}/${PACKAGE}" | sha256sum --check -
|
||
unzip "${WORK_DIR}/${PACKAGE}" -d "${WORK_DIR}/anytls"
|
||
sudo install -m 0755 "${WORK_DIR}/anytls/anytls-server" /usr/local/bin/anytls-server
|
||
/usr/local/bin/anytls-server -h
|
||
```
|
||
|
||
只有在校验结果显示 `OK` 后才继续安装。版本升级时,必须同时更新版本号和对应架构的官方 SHA-256 摘要。
|
||
|
||
## 5. 创建运行用户和配置
|
||
|
||
创建无登录权限的系统用户:
|
||
|
||
```bash
|
||
sudo groupadd --system anytls
|
||
sudo useradd --system --gid anytls --no-create-home --shell /usr/sbin/nologin anytls
|
||
sudo install -d -m 0750 -o root -g anytls /etc/anytls-go
|
||
```
|
||
|
||
生成一个 32 字节随机密码:
|
||
|
||
```bash
|
||
openssl rand -hex 32
|
||
```
|
||
|
||
记录输出结果,然后创建配置文件:
|
||
|
||
```bash
|
||
sudoedit /etc/anytls-go/anytls.env
|
||
```
|
||
|
||
写入以下内容,将占位符替换为刚生成的密码:
|
||
|
||
```ini
|
||
ANYTLS_LISTEN=0.0.0.0:8443
|
||
ANYTLS_PASSWORD=<RANDOM_HEX_PASSWORD>
|
||
```
|
||
|
||
设置配置文件权限:
|
||
|
||
```bash
|
||
sudo chown root:anytls /etc/anytls-go/anytls.env
|
||
sudo chmod 0640 /etc/anytls-go/anytls.env
|
||
```
|
||
|
||
> `anytls-server` 当前只支持通过 `-p` 参数接收密码,因此运行时密码会出现在服务进程的命令行参数中。配置文件权限只能减少静态文件泄露风险,不能消除这一实现限制。服务器应限制非必要的系统登录账号。
|
||
|
||
## 6. 创建 systemd 服务
|
||
|
||
创建服务文件:
|
||
|
||
```bash
|
||
sudoedit /etc/systemd/system/anytls-go.service
|
||
```
|
||
|
||
写入:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=AnyTLS-go Server
|
||
Documentation=https://github.com/anytls/anytls-go
|
||
After=network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=anytls
|
||
Group=anytls
|
||
EnvironmentFile=/etc/anytls-go/anytls.env
|
||
ExecStart=/usr/local/bin/anytls-server -l ${ANYTLS_LISTEN} -p ${ANYTLS_PASSWORD}
|
||
Restart=on-failure
|
||
RestartSec=5s
|
||
NoNewPrivileges=true
|
||
PrivateTmp=true
|
||
ProtectSystem=strict
|
||
ProtectHome=true
|
||
ProtectKernelTunables=true
|
||
ProtectKernelModules=true
|
||
ProtectControlGroups=true
|
||
RestrictAddressFamilies=AF_INET AF_INET6
|
||
LockPersonality=true
|
||
MemoryDenyWriteExecute=true
|
||
UMask=0077
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
检查并启动服务:
|
||
|
||
```bash
|
||
sudo systemd-analyze verify /etc/systemd/system/anytls-go.service
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now anytls-go
|
||
sudo systemctl status anytls-go --no-pager
|
||
```
|
||
|
||
## 7. 放行端口
|
||
|
||
除云平台安全组外,还需按服务器实际使用的防火墙选择一组命令。不要同时配置 UFW 和 firewalld。
|
||
|
||
UFW:
|
||
|
||
```bash
|
||
sudo ufw allow 8443/tcp
|
||
sudo ufw status
|
||
```
|
||
|
||
firewalld:
|
||
|
||
```bash
|
||
sudo firewall-cmd --permanent --add-port=8443/tcp
|
||
sudo firewall-cmd --reload
|
||
sudo firewall-cmd --list-ports
|
||
```
|
||
|
||
若使用了其他端口,需要同步修改防火墙规则和 `/etc/anytls-go/anytls.env`。
|
||
|
||
## 8. 服务端验收
|
||
|
||
确认服务处于运行状态并监听预期端口:
|
||
|
||
```bash
|
||
sudo systemctl is-active anytls-go
|
||
sudo ss -lntp 'sport = :8443'
|
||
sudo journalctl -u anytls-go -n 50 --no-pager
|
||
```
|
||
|
||
期望日志包含类似内容:
|
||
|
||
```text
|
||
[Server] anytls-go ...
|
||
[Server] Listening TCP 0.0.0.0:8443
|
||
```
|
||
|
||
从另一台可访问服务器的设备检查公网端口:
|
||
|
||
```bash
|
||
nc -vz <SERVER_IP_OR_DOMAIN> 8443
|
||
```
|
||
|
||
端口连通只说明 TCP 链路正常,完整验收仍需通过 AnyTLS 客户端发起代理请求。
|
||
|
||
## 9. 客户端联调
|
||
|
||
使用同版本参考客户端进行基础联调:
|
||
|
||
```bash
|
||
./anytls-client \
|
||
-l 127.0.0.1:1080 \
|
||
-s <SERVER_IP_OR_DOMAIN>:8443 \
|
||
-p <RANDOM_HEX_PASSWORD>
|
||
```
|
||
|
||
另开一个终端,通过本地 SOCKS5 代理验证出口:
|
||
|
||
```bash
|
||
curl --proxy socks5h://127.0.0.1:1080 https://api.ipify.org
|
||
```
|
||
|
||
`v0.0.12` 及以上版本也支持 URI:
|
||
|
||
```text
|
||
anytls://<RANDOM_HEX_PASSWORD>@<SERVER_IP_OR_DOMAIN>:8443
|
||
```
|
||
|
||
使用 sing-box、mihomo、Shadowrocket 等第三方客户端时,至少需要填写服务器地址、端口和相同密码。由于参考服务端使用临时自签名证书,还需要按客户端文档配置对应的跳过证书校验选项;不要将这一配置套用到支持正式证书的其他服务端。
|
||
|
||
## 10. 日常运维
|
||
|
||
常用命令:
|
||
|
||
```bash
|
||
sudo systemctl restart anytls-go
|
||
sudo systemctl stop anytls-go
|
||
sudo systemctl start anytls-go
|
||
sudo journalctl -u anytls-go -f
|
||
```
|
||
|
||
修改端口或密码后执行:
|
||
|
||
```bash
|
||
sudo systemctl restart anytls-go
|
||
sudo systemctl status anytls-go --no-pager
|
||
```
|
||
|
||
升级时下载目标版本对应架构的发布包,核对官方摘要,重新安装 `/usr/local/bin/anytls-server`,然后重启并重复第 8、9 节的验收步骤。
|
||
|
||
## 11. 故障排查
|
||
|
||
| 现象 | 检查项 |
|
||
| --- | --- |
|
||
| 服务启动失败 | `journalctl -u anytls-go -n 100 --no-pager`;检查环境文件格式及权限 |
|
||
| 提示端口被占用 | `ss -lntp 'sport = :8443'`;更换端口或停止冲突服务 |
|
||
| 外网无法连接 | 云安全组、主机防火墙、运营商或机房入站策略 |
|
||
| TCP 可连接但代理失败 | 客户端协议类型、端口、密码、证书校验设置是否一致 |
|
||
| 重启后客户端证书报错 | 参考服务端每次启动都会重新生成临时自签名证书 |
|
||
| 下载速度异常 | 服务器线路质量、丢包、MTU、客户端实现和 CPU 使用率 |
|
||
|
||
## 12. 卸载
|
||
|
||
确认不再使用后执行:
|
||
|
||
```bash
|
||
sudo systemctl disable --now anytls-go
|
||
sudo rm /etc/systemd/system/anytls-go.service
|
||
sudo systemctl daemon-reload
|
||
sudo rm /usr/local/bin/anytls-server
|
||
sudo rm /etc/anytls-go/anytls.env
|
||
sudo rmdir /etc/anytls-go
|
||
sudo userdel anytls
|
||
```
|
||
|
||
最后删除云安全组和主机防火墙中的 AnyTLS 端口放行规则。上述操作会删除服务配置和密码,执行前应确认没有其他服务复用这些文件或账号。
|
||
|
||
## 13. 参考资料
|
||
|
||
- [AnyTLS-go 官方仓库](https://github.com/anytls/anytls-go)
|
||
- [AnyTLS-go Releases](https://github.com/anytls/anytls-go/releases)
|
||
- [AnyTLS 协议文档](https://github.com/anytls/anytls-go/blob/main/docs/protocol.md)
|
||
- [sing-box AnyTLS 文档](https://sing-box.sagernet.org/configuration/inbound/anytls/)
|