先说结论#
VLESS + REALITY 不要求必须使用 443。 只要客户端能够访问、服务器防火墙和云厂商安全组允许、端口没有被其他服务占用,任何合适的 TCP 端口都可以作为监听端口。
443 只是最常见的选择。它通常更容易通过网络出口策略,也符合大家对 HTTPS 的默认预期,但它不会因为数字是 443 就自动更快、更安全,REALITY 也不会因为换成 443 就改变协议本身的工作方式。
把问题拆成三层会清楚很多:
- 协议层:VLESS、REALITY 如何建立连接和验证。
- 传输层:服务监听哪个 TCP 端口,客户端连哪个端口。
- 入口层:这个端口由谁监听,是否需要和网站或其他服务复用。
很多「一定要 443」的说法,实际上是把这三层混在了一起。
为什么大家习惯选 443#
它更像正常的 HTTPS 入口#
443 是 TLS/HTTPS 的标准端口。很多公司网络、公共 Wi-Fi 和出口防火墙对 443 的放行概率更高;使用它也能减少用户在网络环境里遇到「高端口被直接拦截」的情况。
这是一个可达性和兼容性的取舍,不是 REALITY 的硬性规定。
它容易和现有运维习惯对上#
证书、反向代理、健康检查、日志和防火墙规则通常已经围绕 80/443 建好。新服务沿用 443,排查路径短;文档和客户端配置也更符合大多数人的默认值。
但「习惯」不能代替端口规划。一个 IP 上已经有 Nginx 监听 443 时,再让 Xray 直接监听同一个地址和端口,只会得到 address already in use。
它并不代表天然安全#
端口号不是访问控制。443 上同样会被扫描,443 上的服务也同样可能因为配置错误暴露。真正影响风险的是监听地址、认证参数、软件更新、流量入口和日志监控。
把服务放到高端口也不是完整的安全措施,最多只是减少一部分低成本的默认扫描,不能代替防火墙和正确的认证。
什么时候使用高端口更合理#
高端口并不低级,以下场景反而更省事:
- 443 已经由网站或其他代理稳定占用,不值得为复用再引入一层 L4 路由。
- 机器只有高端口映射,常见于 NAT、端口转发或共享 IP 的 VPS。
- 这个服务只供固定设备使用,网络出口对高端口没有限制。
- 想把网站入口和其他 TCP 服务分开,分别设置防火墙、监控和变更窗口。
- 需要先做验证,避免直接改动线上 443 的现有业务。
选择端口时,先检查实际监听情况,而不是凭记忆猜:
sudo ss -lntupsudo ss -lntup | grep -E ':(443|8443|2053|2083|2087|2096)\b'然后同时核对三处放行:服务器本机防火墙、云厂商安全组、上游网络或端口映射。只在其中一处改规则,不能证明外部真的可达。
REALITY 和端口是两件事#
REALITY 关注的是连接建立时的握手和身份验证,端口只负责把连接送到某个监听套接字。端口选择不会替代以下配置:
- 正确的服务端和客户端密钥、UUID 等认证参数。
- 一致的服务器名称、传输参数和客户端配置。
- 服务端时间、系统网络和软件版本处于可用状态。
- 客户端可以访问目标端口,且中间网络不会丢弃该 TCP 流量。
反过来也一样:REALITY 配置正确,端口被安全组拦掉,连接仍然建立不了。排查时先确认「有没有到达监听端口」,再确认协议层参数,效率会高很多。
为什么两个服务不能直接共用 443#
一个监听通常由「本地 IP + 端口 + 协议」标识。两个进程如果都想绑定同一个地址,例如:
0.0.0.0:443 -> Nginx0.0.0.0:443 -> Xray操作系统无法判断一个新连接应该交给哪个进程,因此第二个监听会失败。配置文件里把两边都写成 443,不会自动产生分流能力。
有几个容易混淆的边界:
127.0.0.1:443和公网地址的绑定范围不同,但仍可能与0.0.0.0:443冲突。- 同一台机器的不同公网 IP 可以分别监听同一个端口,但前提是这些 IP 确实属于本机且绑定关系清晰。
- IPv4 和 IPv6 是不同地址族,能否同时使用取决于系统的双栈和
ipv6only等设置,不能只看配置文件。 - UDP 和 TCP 是不同协议,但 VLESS + REALITY 这个场景首先要确认的是 TCP 监听。
复用 443 的正确方式#
如果网站和其他 TCP 服务确实要共用公网 443,需要让一个入口进程先占住 443,再由它把连接转给后端。常见方式有以下几类。
L4 代理按握手信息分流#
Nginx stream、HAProxy 等可以作为 TCP 入口,依据 SNI 等 ClientHello 信息把连接转发到不同后端。这样公网 443 只有一个监听者,后端服务分别监听本机不同端口。
这不是把两个服务都改成 443,而是:
公网 :443 | +--> L4 router --> 网站后端 :8443 | +--> L4 router --> 其他 TCP 服务 :10086分流条件必须在真实客户端握手下验证。不同客户端、不同传输模式或不带可用 SNI 时,规则可能无法按预期命中。
由协议服务自己处理 fallback#
部分协议栈支持在握手失败或匹配特定条件时转交给 Web 服务。这种方案依赖具体实现和版本,配置复杂度也更高,不能把网上某份旧配置直接套进生产环境。
使用不同 IP#
如果服务器有多个公网 IP,可以让网站和其他服务分别绑定各自的 IP
。这是边界最清楚的方案,但需要确认 IP 路由、DNS、证书和云厂商绑定都已经就绪。如果没有这些条件,使用一个高端口往往更简单,也更容易回滚。
Cloudflare 不是自动的 TCP 中转#
这里还要把 Cloudflare 的角色单独拿出来。DNS 记录开代理后,Cloudflare 只会代理它支持的 HTTP/HTTPS 等流量;普通的 VLESS/REALITY TCP 连接不会因为域名挂在 Cloudflare 下就自动被橙云转发。
因此需要区分:
| 方案 | 对普通 VLESS/REALITY 的含义 |
|---|---|
| DNS only | 客户端直接连接源站 IP 和端口,源站端口必须可达 |
| HTTP/HTTPS 代理 | 面向 Web 流量,不能当成任意 TCP 端口转发 |
| Cloudflare Tunnel | 适合 Web、SSH、内网服务等对应接入方式,不能直接等同于公开的 REALITY TCP 入口 |
| Spectrum 等 TCP 产品 | 具备 TCP 代理能力,但产品、套餐和配置边界需要单独确认 |
如果前面接了 Tunnel 或反代,排查时先问清楚它到底转发的是 HTTP、WebSocket 还是原始 TCP。入口类型不匹配时,继续改客户端端口只是在绕圈。
我会怎么选#
| 场景 | 建议 | 原因 |
|---|---|---|
| 新机器、没有其他 443 服务 | 443 或一个高端口都可以 | 先看网络可达性和后续维护习惯 |
| 443 已被 Nginx 使用 | 高端口 | 省掉 L4 复用层,边界直接 |
| 必须让网站和服务共用 443 | 一个 L4 入口统一分流 | 不能让两个进程直接抢同一监听 |
| NAT 或共享 IP | 服务商提供的映射端口 | 以实际可达端口为准 |
| 已经使用 Cloudflare Tunnel | 先确认传输类型 | 不把 HTTP 隧道误当任意 TCP 代理 |
| 对网络兼容性要求高 | 优先验证 443 | 这是兼容性选择,不是协议硬要求 |
上线前的最小检查清单#
- 确认监听地址和端口:
ss -lntup。 - 确认没有第二个进程尝试直接绑定同一 IP。
- 放行服务器防火墙和云安全组,并确认端口映射没有写错。
- 从外部网络测试 TCP 可达性,而不是只在服务器本机测试。
- 核对客户端和服务端的协议参数,再看握手日志。
- 如果复用 443,先验证 L4 分流规则,再变更现有网站入口。
- 保留一个不依赖该服务的 SSH 管理入口,修改 443 前先准备回滚路径。
最重要的判断只有一句:443 是常用入口,不是 VLESS + REALITY 的身份证。 先按实际网络条件选择端口,再决定是否值得引入复用层。单机、单服务时,高端口通常是最短路径;多服务必须共用 443 时,真正需要设计的是入口分流,而不是把配置里的数字强行改成一样。
