个人节点常见矛盾是:

  • 代理入站希望长在 443,看起来像普通 HTTPS;
  • 面板 / 状态页 / 网盘也希望用户只记标准 HTTPS,而不是 :8443 之类临时端口。

两端都「要 443」时,硬抢端口只会有一方活着。可行解法是:最外层用 TCP 反代做 SNI 分流

结构

Internet :443
 HAProxy (mode tcp)
    ├─ ClientHello.SNI ∈ {面板域名, 网盘域名, …}
    │       └─► Caddy (TLS 终止,例如监听本机高位端口)
    │                └─ reverse_proxy → 各 Web 服务
    └─ 其它 SNI / 默认
            └─► 代理核心 (Reality 等入站)

要点:

  1. HAProxy 不做 HTTP 解读,只看 TLS ClientHello 里的 SNI。
  2. Caddy 负责证书与 HTTP 路由;证书可以继续用 ACME。
  3. 默认后端必须是代理入站,避免「随便一个 SNI 都打到面板」扩大攻击面时的误伤——更准确地说:未知流量应按你的安全模型落到代理伪装路径。

为什么 Caddy 常在「非 443」监听

当 443 已被 HAProxy 占用时,Caddy 的 HTTPS 往往绑在本机另一端口(例如仅本机或内网可达的高位端口),由 HAProxy 把匹配 SNI 的连接转过去。对外用户仍然只访问 https://面板域名,感知不到内部分流。

HTTP-01 证书申请需要 80 可达时,可把 80 留给 Caddy;若环境限制多,再考虑 DNS-01。

Cloudflare Tunnel 放在哪一层?

Tunnel 适合:

  • 不想暴露源站 IP 的控制面服务;
  • 临时把本机 HTTP 服务挂到域名上;
  • API 网关、状态页等流量不大的入口。

Tunnel 不适合作为网盘大文件的唯一通道:多一跳、受边缘与隧道稳定性影响,体感是「慢且容易抖」。

更干净的分工是:

流量类型建议入口
面板 / 状态 / APITunnel 或 SNI→Caddy 皆可
网盘大文件SNI→Caddy 直连源站,或对象存储直链
代理用户流量443 默认后端(节点本身)

超时与大文件

默认反代超时如果只有一两分钟,大文件上传会中途断开。网盘或大响应接口挂在 Caddy/HAProxy 后时,需要把 client/server timeout 调到可覆盖最大传输时间,并注意应用侧自身超时。

安全备注(仍不贴配置细节)

  • 面板与网盘应 强认证;公网只暴露必要端口。
  • 应用服务尽量 只监听 127.0.0.1,由 Caddy 统一对外。
  • 定期检查:是否还有「历史调试端口」误开在 0.0.0.0

小结

SNI 分流让「网页 HTTPS」和「代理 443」可以共存;Tunnel 是控制面的可选项,不是数据面银弹。下一篇写状态看板:如何在不装重型 Agent 的前提下,汇总多台机器的在线与资源。

系列导航:上一篇 · 总览 · 下一篇 · 状态看板