Nginx可以通过配置stream模块来实现对HTTPS的TCP四层正向代理。核心是使用proxy_pass指令将流量转发到目标服务器,同时配合ssl_preread指令处理TLS握手,实现HTTPS的透明代理。
一个简单的配置示例:
stream {
resolver 223.5.5.5 114.114.114.114; # 配置DNS解析器
resolver_timeout 10s;
server {
listen 443; # 监听的端口
ssl_preread on; # 启用ssl_preread模块,用于处理TLS握手
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass $ssl_preread_server_name:$server_port; # 转发到目标服务器
proxy_protocol on; #启用PROXY protocol
# 可以根据需要添加其他proxy_*指令
}
}stream模块: Nginx的stream模块用于处理TCP和UDP的四层代理,与HTTP模块同级。resolver: 配置DNS解析器,用于解析目标服务器的域名。listen: 指定Nginx监听的端口,这里是20017。ssl_preread on: 启用ssl_preread模块,这个模块允许Nginx在TLS握手阶段读取SNI (Server Name Indication) 扩展,从而获取目标服务器的域名,这对于HTTPS的透明代理至关重要。proxy_pass: 将流量转发到目标服务器。$ssl_preread_server_name是ssl_preread模块提取到的SNI信息,表示目标服务器的域名,$server_port是客户端请求的目标端口。proxy_connect_timeout,proxy_timeout: 设置连接超时和读写超时时间。proxy_protocol on: 启用PROXY protocol,如果后端服务器支持,可以传递客户端的真实IP和端口信息。
需要确保Nginx编译时已启用
ngx_stream_ssl_preread_module和ngx_stream_proxy_module模块。目标服务器需要正确配置SSL证书,以便Nginx能够正常进行TLS握手。
根据实际需求,可以配置其他proxy_*指令,例如proxy_buffer_size,
proxy_next_upstream等。如果后端服务器是HTTPS的,则需要在
proxy_pass中指定HTTPS协议,例如proxy_pass https://$ssl_preread_server_name:$server_port;。
客户端发起HTTPS请求,连接到Nginx的监听端口。
Nginx的
stream模块接收到连接,并使用ssl_preread模块读取SNI信息,获取目标服务器的域名。Nginx根据SNI信息,将请求转发到目标服务器。
Nginx与目标服务器建立TLS连接,进行HTTPS握手。
Nginx将目标服务器的响应返回给客户端。
通过stream模块和ssl_preread模块,Nginx可以实现对HTTPS的TCP四层正向代理,将客户端的请求透明地转发到目标服务器,并处理TLS握手。这种方式可以用于实现负载均衡、流量转发等功能,同时保持HTTPS的安全性。
相关参考:
