带有HAproxy代理协议和内部redirect的Nginxconfiguration

我需要将HTTPSstream从HAProxyredirect到Nginx,无需终止SSL,也不会丢失有关原始客户端IP的信息。 不幸的是,我不能在Nginx上更改默认443站点的configuration,因为它是由Synology NASconfiguration维护的。

我正在考虑Nginx上的新监听端口,它接受来自HAProxy的代理协议,以及不通过SSL解码/编码的本地443端口的内部redirect,而是传递来自HAProxy的原始客户端IP。 这是可能的吗?

编辑:后台是我在同一个外部443端口隧道OpenVPN和Web服务,所以实际上它看起来如下:

router 443 TCP -> HAProxy -> SNI check -> stunnel -> OpenVPN | ------> SSL termination -> Nginx 443 HTTPS 

我使用HAProxy,因为ngx_stream_ssl_preread_module在Synology内置的Nginx上不可用。

编辑:我认为情况和问题可以更通用:

 Nginx: port X accessed via proxy protocol with SSL/TLS port Y 

如何使用源客户端IP的信息将端口X的stream传递给Y,而不使用SSL端点? 在端口Y上使用proxy_protocol的listen指令是唯一可能的选项吗?

是的,你可以用nginx来完成上述任务。

一个简单的Googlesearch显示, listen指令自1.5.12以来有一个proxy_protocol参数,出于安全原因, proxy_protocol参数可能应该和set_real_ip_from指令一起使用:

请注意,这将总是需要对由您提到的第三方工具维护的nginxconfiguration进行最小限度的修改; 由于明显的安全原因,不应该可以在没有任何这种修改的情况下传递客户端IP信息。


此外,请注意,您实际上不再需要HAProxy –Nginx中的新streamfunction已经允许您在TCP和SSLstream上运行,包括最新版本的stream,能够区分基于SNI的未打开SSLstream,服务器名称指示 – 请参阅从ssl_preread和相应的$ssl_preread_server_name ssl_preread_server_name。

一种可能的解决scheme是使用HAProxy进行SSL桥接 。 这意味着HAProxy将:
1.解密SSL连接。
2.插入X-Real-IP标头。
3.与Nginx交谈时再次encryption连接。

解密SSL连接需要HAProxy运行在HTTP模式下,但同时HAProxy应该接收来自同一个443端口的stunnelstream量。 所以我能想到的解决scheme是首先通过虚拟后端分割两个stream量。

当然,这将会带来额外的性能成本,但是如果没有真正的高负载,它将不会被注意到。

 frontend ft_ssl bind *:443 mode tcp acl web_traffic req_ssl_sni -i <web-domain> acl stunnel_traffic req_ssl_sni -i <stunnel-domain> use_backend bk_ssl_dummy if web_traffic use_backend bk_ssl_stunnel if stunnel_traffic backend bk_ssl_stunnel mode tcp server stunnel1 <IP>:<PORT> check backend bk_ssl_dummy mode tcp server web_ssl_offload 127.0.0.1:8888 send-proxy-v2-ssl-cn check frontend ft_web_offload bind 127.0.0:8888 ssl crt <path-to-crt> accept-proxy mode http http-request set-header X-Real-IP %[src] default_backend bk_ssl_nginx backend bk_ssl_nginx mode http server nginx1 <sIP>:443 ssl check 

由于我们在服务器行中使用ssl参数,连接在路由到Nginx时会重新encryption。

configurationNginx使用proxy-protocl会让你拥有更简单的HAProxy conf,所以这个解决scheme只有在你不能改变Nginx conf时才有意义。