一台 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 端口复用拆开看,核心只有四个部分:
- 公网入口:Nginx stream 监听
0.0.0.0:443/tcp和[::]:443/tcp。 - SNI 路由:Nginx 读取客户端握手里的域名,比如
a.example.com、b.example.com。 - 本地后端:Reality、Vision、XHTTP、HTTPS 站点都监听在
127.0.0.1的不同端口。 - 默认落点:没有命中 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 时,同一个公网端口会被转到另一个本地后端。

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": ["..."]
}
}
}
这里有三处域名要对齐:客户端里的 serverName 或 sni,Nginx stream map 里的域名,Reality 入站里的 serverNames。任何一层写错,都可能表现为超时、握手失败、落到默认网站,或者客户端认证不通过。
TCP 与 UDP
Reality、Vision、XHTTP 的 SNI 分流讨论的是 TCP 443。Hysteria2 常见形态是 QUIC,也就是 UDP。443/tcp 和 443/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 提示不认识 stream 或 ssl_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。这是我们自己维护的项目,目标不是把原理藏起来,而是把上面这些重复操作整理成一套可维护的菜单。

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 复用出问题时,不建议一上来重装。按层检查更快:

- TCP 443:
ss -lntup | grep ':443',看公网 TCP 443 是否由 Nginx stream 接管。 - Nginx:
nginx -t,确认 stream 配置和模块正常。 - SNI map:检查域名是否映射到正确的
127.0.0.1:端口。 - 本地后端:确认 Xray 或 sing-box 正在监听对应端口,配置校验通过。
- 客户端参数:UUID、公钥、shortId、flow、serverName、fingerprint 任一项错了都可能失败。
- UDP 路径:如果是 Hysteria2,单独查 UDP 443、防火墙和 QUIC。
总结
Reality 443 端口复用的核心,是让 Nginx stream 拿住公网 TCP 443,用 ssl_preread 读取 SNI,再把连接转发到本地不同后端。理解这个模型后,端口占用、SNI、Reality 参数、伪装站点和 Hysteria2 UDP 的关系都会清楚很多。
PSM 做的是把这套结构变成可重复维护的脚本和菜单。它不会改变底层原理,但能减少手工编辑配置、忘记 reload、端口记错、证书散落、节点状态不一致这类问题。需要长期维护代理栈的 VPS,用这种方式会更省心。
延伸阅读
- VPS 建站教程合集
- 【测评】GreenCloud CN Premium Optimized:1C/2G RAM/20G NVME/500G@500Mbps/三网顶级线路/V.PS gen2同款
- 【记录】TikTok网络环境避坑指南:揭穿“原生家宽IP”的暴利骗局
了解 VPS测评 - JQ 的更多信息
订阅后即可通过电子邮件收到最新文章。