架构
服务拓扑
独立模式(无域名)
Internet
│
▼
┌──────────────────────────────────────┐
│ Server │
│ │
│ Port 443: HAProxy (SNI router) │
│ ┌──────────────────────────────┐ │
│ │ SNI = reality_sni │ │
│ │ → Port 10443: Xray (Reality)│ │
│ │ │ │
│ │ SNI = server IP │ │
│ │ → Port 8443: Caddy (TLS) │ │
│ │ ├─ /info-path → page │ │
│ │ ├─ /panel-path → 3x-ui │ │
│ │ └─ /xhttp-path → Xray │ │
│ └──────────────────────────────┘ │
│ │
│ Port 80: Caddy (ACME challenges) │
│ │
│ Docker: 3x-ui │
│ ├─ Reality inbound (port 10443) │
│ └─ XHTTP inbound (localhost port) │
│ │
│ Caddy: IP cert (ACME shortlived) │
│ HAProxy: TCP SNI, no TLS terminate │
└──────────────────────────────────────┘
HAProxy 不终止 TLS。它从 TLS Client Hello 中读取 SNI 主机名,并将原始 TCP 流转发到相应的后端。
Caddy 通过 ACME shortlived 配置文件从 Let’s Encrypt 请求 IP 证书(有效期 6 天,自动续期)。如果不支持 IP 证书颁发,将回退到自签证书。
XHTTP 运行在仅限本地的端口上,由 Caddy 反向代理——无需暴露额外的外部端口。
域名模式
Internet
│
▼
┌──────────────────────────────────────┐
│ Server │
│ │
│ Port 443: HAProxy (SNI router) │
│ ┌──────────────────────────────┐ │
│ │ SNI = reality_sni │ │
│ │ → Port 10443: Xray (Reality)│ │
│ │ │ │
│ │ SNI = domain │ │
│ │ → Port 8443: Caddy (TLS) │ │
│ │ ├─ /info-path → page │ │
│ │ ├─ /panel-path → 3x-ui │ │
│ │ ├─ /xhttp-path → Xray │ │
│ │ └─ /ws-path → Xray WSS │ │
│ └──────────────────────────────┘ │
│ │
│ Docker: 3x-ui │
│ ├─ Reality inbound (port 10443) │
│ ├─ XHTTP inbound (localhost port) │
│ └─ WSS inbound (localhost port) │
│ │
│ Caddy: domain cert (Let's Encrypt) │
│ HAProxy: TCP SNI, no TLS terminate │
└──────────────────────────────────────┘
域名模式添加 VLESS+WSS 作为 CDN 回退路径。流量通过 Cloudflare 的 CDN 经由 WebSocket 流动,即使服务器 IP 被阻断也能工作。
Reality 协议如何工作
- 服务器生成一个 x25519 密钥对。公钥与客户端共享,私钥保留在服务器上。
- 客户端在端口 443 上连接,发送包含伪装域名(例如
www.microsoft.com)作为 SNI 的 TLS Client Hello。 - 对于任何观察者来说,这看起来像一个到 microsoft.com 的正常 HTTPS 连接。
- 如果一个探针发送自己的 Client Hello,服务器会将连接代理到真实的 microsoft.com——探针看到一个有效的证书。
- 如果客户端包含有效的身份验证(从 x25519 密钥派生),服务器建立 VLESS 隧道。
- uTLS 使 Client Hello 逐字节与 Chrome 相同,击败 TLS 指纹识别。
端口分配
| 端口 | 服务 | 模式 |
|---|---|---|
| 443 | HAProxy (SNI 路由器) | 全部 |
| 80 | Caddy (ACME 挑战) | 全部 |
| 10443 | Xray Reality (内部) | 全部 |
| 8443 | Caddy TLS (内部) | 全部 |
| localhost | Xray XHTTP | 启用 XHTTP 时 |
| localhost | Xray WSS | 域名模式 |
| 2053 | 3x-ui panel (内部) | 全部 |
XHTTP 和 WSS 端口仅限本地——Caddy 在端口 443 上将它们反向代理。
配置管道
| # | 步骤 | 目的 |
|---|---|---|
| 1 | InstallPackages | OS 包 |
| 2 | EnableAutoUpgrades | 无人值守升级 |
| 3 | SetTimezone | UTC |
| 4 | HardenSSH | 仅密钥认证 |
| 5 | ConfigureBBR | TCP 拥塞控制 |
| 6 | ConfigureFirewall | UFW: 22 + 80 + 443 |
| 7 | InstallDocker | Docker CE |
| 8 | Deploy3xui | 3x-ui 容器 |
| 9 | ConfigurePanel | Panel 凭证 |
| 10 | LoginToPanel | API 认证 |
| 11 | CreateRealityInbound | VLESS+Reality |
| 12 | CreateXHTTPInbound | VLESS+XHTTP |
| 13 | CreateWSSInbound | VLESS+WSS (域名) |
| 14 | VerifyXray | 健康检查 |
| 15 | InstallHAProxy | SNI 路由 |
| 16 | InstallCaddy | TLS + 反向代理 |
| 17 | DeployConnectionPage | 二维码 + 页面 |
凭证生命周期
- 生成:随机凭证(panel 密码、x25519 密钥、客户端 UUID)
- 本地保存:
~/.meridian/credentials/<IP>/proxy.yml——应用到服务器之前保存 - 应用:panel 密码更改、入站创建
- 同步:凭证复制到服务器上的
/etc/meridian/proxy.yml - 重新运行:从缓存加载,不会重新生成(幂等)
- 跨机器:
meridian server add IP通过 SSH 从服务器获取 - 卸载:从服务器和本地机器中删除