Nginx的stream模块不支持SSL终止,仅支持TLS透传;可通过ssl_preread读取SNI/ALPN实现路由,并用proxy_ssl系列指令建立TLS隧道;SSL终止需改用http模块处理HTTP/HTTPS流量。

在 Nginx 中,TCP 代理本身不支持原生 SSL 终止,因为 Nginx 的 stream 模块(用于 TCP/UDP 代理)仅支持 TLS 透传(即加密隧道),不能解密、验证或终止 SSL/TLS 连接。真正的 SSL 终止必须由上游服务完成,或借助 Nginx 的 http 模块(仅适用于 HTTP/HTTPS 流量)。但你可以用 stream 实现 TLS 加密隧道传输(即 TLS Passthrough),并结合证书验证、ALPN 或 SNI 路由等增强安全性与灵活性。
1. 使用 stream 模块实现 TLS 透传(加密隧道)
Nginx 的 stream 上下文支持 ssl_preread 指令,可在不终止 TLS 的前提下读取 ClientHello 中的 SNI、ALPN、证书信息,用于路由决策;同时可配置 proxy_ssl 系列指令,让 Nginx 作为 TLS 客户端连接上游(即“TLS over TLS”隧道)。
- 确保编译时启用了
--with-stream和--with-stream_ssl_module(推荐使用官方预编译包或主流发行版仓库版本) - 在
nginx.conf的顶层启用stream块,不要放在http内 - 使用
ssl_preread on;启用 SNI/ALPN 预读,配合map实现基于 SNI 的后端分发
2. 配置带 SNI 路由的 TLS 加密隧道
以下示例将不同域名的 TLS 流量转发至对应后端,Nginx 不解密流量,仅做隧道中转:
stream {
# 启用 SNI 预读
ssl_preread on;
<pre class="brush:php;toolbar:false;"># 根据 SNI 映射后端地址
map $ssl_preread_server_name $backend {
example.com 192.168.1.10:443;
api.example.org 192.168.1.11:8443;
default 192.168.1.12:443;
}
upstream tls_backend {
server $backend;
}
server {
listen 443 ssl;
proxy_pass tls_backend;
# 可选:验证上游证书(需配置 CA)
proxy_ssl on;
proxy_ssl_trusted_certificate /etc/nginx/certs/ca.pem;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
proxy_ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
}}
注意:listen 443 ssl 在 stream 中仅表示监听 TLS 流量(不加载证书),不是真正终止;证书仍由后端提供。
3. 若需 SSL 终止,应改用 HTTP 模块 + HTTPS Server
SSL 终止意味着 Nginx 解密 TLS 流量,检查内容(如 Host、路径、Header),再以明文或新 TLS 连接转发。这仅适用于 HTTP/HTTPS 协议:
- 在
http块中配置server { listen 443 ssl; ssl_certificate ...; } - 使用
proxy_pass http://upstream;或https://upstream;转发 - 可启用
proxy_ssl_*控制到上游的 TLS 行为(如证书校验、SNI 设置) - 非 HTTP 协议(如 MySQL、Redis、SMTP)无法被
http模块处理,必须走stream
4. 安全增强建议
- 禁用弱协议和密码套件:在
stream的server块中显式设置proxy_ssl_protocols和proxy_ssl_ciphers - 开启上游证书校验(
proxy_ssl_verify on)并指定可信 CA,防止中间人攻击 - 对关键服务启用
proxy_ssl_name,强制匹配 SNI 名称(如proxy_ssl_name $ssl_preread_server_name;) - 日志记录 SNI:通过
log_format和access_log(需在stream中定义)记录$ssl_preread_server_name


















