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的安全性。
相关参考: