架构

服务拓扑

独立模式(无域名)

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 协议如何工作

  1. 服务器生成一个 x25519 密钥对。公钥与客户端共享,私钥保留在服务器上。
  2. 客户端在端口 443 上连接,发送包含伪装域名(例如 www.microsoft.com)作为 SNI 的 TLS Client Hello。
  3. 对于任何观察者来说,这看起来像一个到 microsoft.com 的正常 HTTPS 连接。
  4. 如果一个探针发送自己的 Client Hello,服务器会将连接代理到真实的 microsoft.com——探针看到一个有效的证书。
  5. 如果客户端包含有效的身份验证(从 x25519 密钥派生),服务器建立 VLESS 隧道。
  6. uTLS 使 Client Hello 逐字节与 Chrome 相同,击败 TLS 指纹识别。

端口分配

端口服务模式
443HAProxy (SNI 路由器)全部
80Caddy (ACME 挑战)全部
10443Xray Reality (内部)全部
8443Caddy TLS (内部)全部
localhostXray XHTTP启用 XHTTP 时
localhostXray WSS域名模式
20533x-ui panel (内部)全部

XHTTP 和 WSS 端口仅限本地——Caddy 在端口 443 上将它们反向代理。

配置管道

#步骤目的
1InstallPackagesOS 包
2EnableAutoUpgrades无人值守升级
3SetTimezoneUTC
4HardenSSH仅密钥认证
5ConfigureBBRTCP 拥塞控制
6ConfigureFirewallUFW: 22 + 80 + 443
7InstallDockerDocker CE
8Deploy3xui3x-ui 容器
9ConfigurePanelPanel 凭证
10LoginToPanelAPI 认证
11CreateRealityInboundVLESS+Reality
12CreateXHTTPInboundVLESS+XHTTP
13CreateWSSInboundVLESS+WSS (域名)
14VerifyXray健康检查
15InstallHAProxySNI 路由
16InstallCaddyTLS + 反向代理
17DeployConnectionPage二维码 + 页面

凭证生命周期

  1. 生成:随机凭证(panel 密码、x25519 密钥、客户端 UUID)
  2. 本地保存~/.meridian/credentials/<IP>/proxy.yml——应用到服务器之前保存
  3. 应用:panel 密码更改、入站创建
  4. 同步:凭证复制到服务器上的 /etc/meridian/proxy.yml
  5. 重新运行:从缓存加载,不会重新生成(幂等)
  6. 跨机器meridian server add IP 通过 SSH 从服务器获取
  7. 卸载:从服务器和本地机器中删除
On this page