今天我们很高兴地宣布推出 NGINX Open Source 1.15.2。 此版本中的一个关键功能是新的$ssl_preread_protocol
变量,它允许您在使用 TCP(流
)代理转发流量时区分 SSL/TLS 和其他协议。 如果您想通过(例如)在同一端口运行 SSL/TLS 和 SSH 服务来避免防火墙限制,这很有用。
即将发布的NGINX Plus R16版本中,NGINX Plus 客户也将可以使用该新功能。
$ssl_preread_protocol
当您使用http
或stream
模块终止和解密 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 Open Source 1.15.2 包含其他增强功能和错误修复。 有关新功能的完整列表,请参阅NGINX 更改日志。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”