博客 | NGINX

使用 NGINX 1.15.2 在同一端口运行 SSL 和非 SSL 协议

NGINX-F5-horiz-black-type-RGB 的一部分
Faisal Memon 缩略图
费萨尔·梅蒙
2018 年 7 月 24 日发布

今天我们很高兴地宣布推出 NGINX Open Source 1.15.2。 此版本中的一个关键功能是新的$ssl_preread_protocol变量,它允许您在使用 TCP()代理转发流量时区分 SSL/TLS 和其他协议。 如果您想通过(例如)在同一端口运行 SSL/TLS 和 SSH 服务来避免防火墙限制,这很有用。

即将发布的NGINX Plus R16版本中,NGINX Plus 客户也将可以使用该新功能。

何时以及如何使用$ssl_preread_protocol

当您使用httpstream模块终止和解密 SSL/TLS 流量时,$ ssl_protocol ( http , stream ) 变量会捕获客户端使用的 SSL 或 TLS 版本。 但是,有时您可能希望简单地转发 SSL/TLS 流量而不解密它,使用模块来实现基本的 TCP 代理或负载均衡器。

stream_ssl_preread模块检查 SSL 或 TLS 连接中的初始ClientHello消息,并提取可用于管理连接的几个值。 版本 1.15.2 中添加的$ssl_preread_protocol变量从ClientHello消息的client_version字段中捕获最新的 SSL/TLS 版本号。 如果ClientHello消息中存在supports_versions扩展,则该变量设置为TLSv1.3

如果连接不使用 SSL 或 TLS 版本,则$ssl_preread_protocol变量将为空,表示该连接正在使用 SSL/TLS 以外的协议,例如 SSH。

以下配置片段使用映射块中的$ssl_preread_protocol变量将$upstream变量设置为适合连接上使用的协议的上游组的名称。 然后, proxy_pass指令将请求转发到选定的上游组。 请注意,必须将ssl_preread on指令包含在服务器块中, $ssl_preread_protocol变量才能正常工作。

stream { upper ssh { server 192.0.2.1:22; } upper web { server 192.0.2.2:443; } map $ssl_preread_protocol $upstream { default ssh; "TLSv1.2" web; } # 同一端口上的 SSH 和 SSL server { listen 443; proxy_pass $upstream; ssl_preread on ; } }

为了使配置生效,客户端需要通过端口 443 而不是默认端口 22 访问 SSH 服务器。 例如,使用 MacOS 和 Linux 上的内置 SSH 客户端,您可以使用-p标志来更改端口:

$ ssh ssh 服务器 IP 地址-p 443

如何获取最新的 NGINX 版本

NGINX 的最新版本始终可在我们的官方存储库的主线分支中获取。

了解更多

NGINX Open Source 1.15.2 包含其他增强功能和错误修复。 有关新功能的完整列表,请参阅NGINX 更改日志


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”