跳至正文

Reality 443 端口复用怎么实现:Nginx ssl_preread 与 PSM 一键脚本

内容纲要

一台 VPS 上同时跑网站、Reality、Vision、XHTTP,甚至再加 Hysteria2,最容易撞上的就是 443 端口。把每个服务都放到一个公网高位端口当然能用,但暴露面变多,后续维护也会越来越乱。更适合长期使用的方式,是公网入口仍然只保留 443,再在服务器内部完成分流。

Reality 443 端口复用不是让多个程序同时监听同一个 0.0.0.0:443/tcp。在同一个 IP、同一个协议、同一个端口上,通常只能有一个进程真正占用监听。可落地的做法是让 Nginx 的 stream 层接管公网 TCP 443,用 ssl_preread 读取 TLS ClientHello 里的 SNI,然后把连接转发到本机不同后端端口。

复用原理

把 Reality 443 端口复用拆开看,核心只有四个部分:

  1. 公网入口:Nginx stream 监听 0.0.0.0:443/tcp[::]:443/tcp
  2. SNI 路由:Nginx 读取客户端握手里的域名,比如 a.example.comb.example.com
  3. 本地后端:Reality、Vision、XHTTP、HTTPS 站点都监听在 127.0.0.1 的不同端口。
  4. 默认落点:没有命中 SNI 的连接,转到一个真实可打开的 HTTPS 网站。

这时公网只有一个 TCP 443,真正的代理协议都在本机回环地址里。例如:

Nginx stream    0.0.0.0:443/tcp
Reality A       127.0.0.1:1443/tcp
Reality B       127.0.0.1:1444/tcp
Vision/XHTTP    127.0.0.1:1445/tcp
HTTPS site      127.0.0.1:8443/tcp

客户端访问 a.example.com:443 时,TLS ClientHello 会带上 SNI。Nginx 不解密后面的 Reality 流量,只在连接刚进来时读取 SNI,然后把这条 TCP 流转给 127.0.0.1:1443。访问 b.example.com:443 时,同一个公网端口会被转到另一个本地后端。

Proxy Stack Manager 复用原理
公网 TCP 443 由 Nginx stream 接管。Reality、XHTTP 和 HTTPS 站点退到本地端口,再按 SNI 分流。

SNI 分流

实现这套结构,关键不是 HTTP 反代,而是 Nginx 的四层 stream。stream 层还看不到 URL、Header、Cookie,它只能处理 TCP 流。ssl_preread 的作用,是在不终止 TLS 的情况下读取 ClientHello 里的 server_name

所以它适合做“按域名分发 TCP 连接”,不适合做“按路径分发 HTTP 请求”。这也是 Reality 443 复用能成立的原因:Nginx 只负责入口分流,Reality 握手仍然由后端 Xray 或 sing-box 完成。

最小配置

手工写 Nginx stream 时,核心配置并不长。下面是最小化思路,生产环境还要结合系统路径、证书、日志和已有站点调整:

map $ssl_preread_server_name $backend {
    a.example.com    127.0.0.1:1443;
    b.example.com    127.0.0.1:1444;
    x.example.com    127.0.0.1:1445;
    default          127.0.0.1:8443;
}

server {
    listen 443 reuseport;
    listen [::]:443 reuseport;
    proxy_pass $backend;
    ssl_preread on;
    proxy_connect_timeout 5s;
}

$ssl_preread_server_name 来自 TLS ClientHello,不是 HTTP 的 Host。如果客户端没有带 SNI,或者 SNI 没有命中 map,就会走 default 后端。默认后端最好是真实可打开的 HTTPS 网站,这样浏览器访问时不会像空端口一样直接断开。

Reality 参数

Reality 入站可以只监听本地端口,不需要直接抢公网 443:

{
  "listen": "127.0.0.1",
  "port": 1443,
  "protocol": "vless",
  "streamSettings": {
    "network": "tcp",
    "security": "reality",
    "realitySettings": {
      "dest": "www.example.com:443",
      "serverNames": ["a.example.com"],
      "privateKey": "...",
      "shortIds": ["..."]
    }
  }
}

这里有三处域名要对齐:客户端里的 serverNamesni,Nginx stream map 里的域名,Reality 入站里的 serverNames。任何一层写错,都可能表现为超时、握手失败、落到默认网站,或者客户端认证不通过。

TCP 与 UDP

Reality、Vision、XHTTP 的 SNI 分流讨论的是 TCP 443。Hysteria2 常见形态是 QUIC,也就是 UDP。443/tcp443/udp 是两套不同的监听对象,端口号相同不代表冲突。

TCP 443 和 UDP 443 属于不同协议族,Reality SNI 分流和 Hysteria2 QUIC 可以并行
TCP 443 和 UDP 443 属于不同协议族。Reality 的 SNI 分流走 TCP,Hysteria2/QUIC 通常走 UDP。
nginx      0.0.0.0:443/tcp
hysteria2  0.0.0.0:443/udp
xray       127.0.0.1:1443/tcp

真正会冲突的是两个进程同时抢同一个 IP、同一个协议、同一个端口。比如一个 Nginx http server 已经 listen 443 ssl,另一个 Nginx stream 又要监听公网 443/tcp,这就需要把网站退到 127.0.0.1:8443 之类的本地端口。

常见坑

缺少模块

有些系统把 Nginx stream 模块拆成独立包。Ubuntu/Debian 可能需要安装 libnginx-mod-stream,RHEL 系可能是 nginx-mod-stream。如果 nginx -t 提示不认识 streamssl_preread,先查模块。

橙云代理

Reality 域名通常不要走 Cloudflare 橙云。Cloudflare 普通代理主要面向 HTTP/HTTPS 网站,不是给任意 Reality TCP 流量做透明转发。DNS 可以托管在 Cloudflare,但 Reality 对应记录建议保持 DNS only。

端口冲突

复用架构里,公网 TCP 443 应该交给 stream 层。原来的 HTTPS 网站仍然可以保留,只是作为本地默认后端存在,而不是继续直接监听公网 443。

协议看错

排查端口时建议分开看 TCP 和 UDP:

ss -lntup | grep ':443'
ss -lnuap | grep ':443'

Reality 主要看 TCP 443 和本地 TCP 后端;Hysteria2 主要看 UDP 443、防火墙和 QUIC。不要只看端口号就判断冲突。

一键脚本

前面把 Reality 443 端口复用的原理讲完后,很多朋友可能会觉得:思路不难,但手工配置容易漏。每加一个 Reality 节点,都要分配本地端口、生成密钥、改 Xray 配置、改 Nginx stream map、测试配置、reload 服务,还要记住哪个域名对应哪个后端。

所以这里介绍一个一键安装 Reality 并复用 443 端口的脚本:Proxy Stack Manager,简称 PSM。这是我们自己维护的项目,目标不是把原理藏起来,而是把上面这些重复操作整理成一套可维护的菜单。

Proxy Stack Manager 一键安装 Reality 并复用 443 端口,统一管理 Nginx stream、Reality、证书和备份
PSM 把 Nginx stream、Reality 节点、证书、备份和日常维护放到同一个菜单里,减少手工改配置时漏掉某一层的概率。

PSM 优势

  • 入口清楚:公网 TCP 443 由 Nginx stream 接管,Reality、Vision、XHTTP 等后端监听本地端口。
  • 映射省心:新增节点时,不需要反复手工编辑 map $ssl_preread_server_name
  • 状态统一:UUID、公钥、shortId、serverName、本地端口和分享链接由同一套菜单管理。
  • 协议分开:TCP SNI 分流和 Hysteria2 UDP/QUIC 不混在一起处理。
  • 适合长期用:更新、备份、恢复、流量配额、到期提醒、Telegram 通知和安全加固都能一起维护。

和本文关系最直接的项目文件包括:

  • templates/nginx/stream-sni.conf.tpl:Nginx stream 的 SNI 分流模板。
  • lib/nginx.sh:安装 stream 模块、写入 stream 主配置,并维护 SNI map。
  • lib/xray/reality.sh:创建 Reality 节点、生成 X25519 密钥和 shortId。
  • templates/hysteria/config.yaml.tpl:Hysteria2 的 UDP/QUIC 配置模板。

安装使用

新机器上以 root 身份执行:

bash <(curl -fsSL https://psm.jinqians.com)

如果系统没有 curl,可以用:

bash <(wget -qO- https://psm.jinqians.com)

安装完成后输入:

psm

进入主菜单。做 Reality 443 端口复用时,最常用的是这些菜单:

  • Nginx 管理:安装 Nginx,初始化 stream SNI 分流,管理站点和伪装后端。
  • Xray 管理:创建 Reality、Vision、XHTTP 节点,生成分享链接和二维码。
  • sing-box 管理:使用第二内核管理 Reality、Hysteria2、AnyTLS、Snell 等协议。
  • Hysteria2 管理:独立处理 UDP 443 和 QUIC 配置。
  • SSL 证书管理:通过 acme.sh 签发和续期证书。
  • 备份管理:保存 PSM 配置、节点状态和相关服务数据。

如果服务器上已经有生产网站,建议先确认三件事:当前公网 TCP 443 由谁监听,Reality 域名是否 DNS only,Nginx 是否支持 stream 和 ssl_preread。确认完再创建第一个 Reality 节点,风险会小很多。

功能范围

PSM 不只做 Reality。根据 README 和项目结构,它还覆盖这些方向:

  • Xray:Reality、Vision、XHTTP、SS2022,多节点管理,分享链接和二维码导出。
  • sing-box:Reality、Hysteria2、AnyTLS、Snell、SS2022,支持路由分流和出站节点。
  • 独立协议:Hysteria2、Snell、shadowsocks-rust、realm 中转。
  • 基础服务:Nginx、SSL 证书、Cloudflare DDNS、Cloudflare Tunnel、Docker 应用。
  • 运维功能:SSH 加固、Fail2ban、流量统计、到期管理、Telegram Bot、备份恢复、每日体检报告。

如果只是临时跑一个单节点,手工配置也可以。如果你准备长期维护多个协议、多个域名和多个用户,PSM 的价值会更明显:它把入口、节点、证书、备份、流量和安全状态放到同一个工具里,不需要每次靠记忆去改一堆分散配置。

排错顺序

Reality 443 复用出问题时,不建议一上来重装。按层检查更快:

Reality 443 端口复用排错顺序:TCP 443、Nginx、SNI 映射、本地后端、客户端参数、UDP 路径
按编号逐层排查即可,不需要在图里再用箭头连接步骤。先定位失败层,再决定改哪一处配置。
  1. TCP 443ss -lntup | grep ':443',看公网 TCP 443 是否由 Nginx stream 接管。
  2. Nginxnginx -t,确认 stream 配置和模块正常。
  3. SNI map:检查域名是否映射到正确的 127.0.0.1:端口
  4. 本地后端:确认 Xray 或 sing-box 正在监听对应端口,配置校验通过。
  5. 客户端参数:UUID、公钥、shortId、flow、serverName、fingerprint 任一项错了都可能失败。
  6. UDP 路径:如果是 Hysteria2,单独查 UDP 443、防火墙和 QUIC。

总结

Reality 443 端口复用的核心,是让 Nginx stream 拿住公网 TCP 443,用 ssl_preread 读取 SNI,再把连接转发到本地不同后端。理解这个模型后,端口占用、SNI、Reality 参数、伪装站点和 Hysteria2 UDP 的关系都会清楚很多。

PSM 做的是把这套结构变成可重复维护的脚本和菜单。它不会改变底层原理,但能减少手工编辑配置、忘记 reload、端口记错、证书散落、节点状态不一致这类问题。需要长期维护代理栈的 VPS,用这种方式会更省心。

延伸阅读


了解 VPS测评 - JQ 的更多信息

订阅后即可通过电子邮件收到最新文章。