具有 HAProxy 和同一 IP 上的虚拟主机的直通 SSL

Ral*_*ber 2 ssl haproxy

我可以使用 HAProxy 将 SSL 传递到与其他虚拟主机共享 IP 的虚拟主机吗?

我尝试

frontend https
bind *:443 #ssl
mode tcp
default_backend port_443

backend port_443
mode tcp
server web42 www.example.com
Run Code Online (Sandbox Code Playgroud)

但我看到默认的网络服务器,而不是 www.example.com

我可以在前端执行 SNI,但是如何对后端说 - 这是针对 www.example.com 域的?

server web1 www.example.com:443 sni str(www.example.com) verify none
Run Code Online (Sandbox Code Playgroud)

也不行。

为了明确起见,网络服务器 www.default.com、www.example.com、www.example.net 都具有相同的 IP 和端口,例如 10.0.1.10:443 Apache/ngix 使用 SNI 选择正确的虚拟主机。

问题仍然没有解决。这里有一些图形

                                   --------------------
                                  |(All 10.0.1.10:443)
www2.example.com:443 -> HaProxy ->|www.default.com <- Apache vhost default
                                  |www.example.com
                                  |www.example.net 
                                   --------------------
Run Code Online (Sandbox Code Playgroud)

我想访问 www.example.com(使用 tcp 模式)

如果我有 www.example.com 和 www.example.net 的私钥。我可以访问 www.example.net (当用户输入 www.example.com 时)而不会出现安全问题吗?

Mic*_*ton 5

您可以将连接传递到您想要的任何后端服务器/端口。

但我发现您的设置中缺少很多东西。

这是我自己的 HAProxy 设置,我使用它将必须共享全局 IPv4 地址的 https 连接转发到具有唯一全局 IPv6(和唯一私有 IPv4)的后端服务器。

frontend https
    bind :443
    mode tcp
    option tcplog
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }

    use_backend goren_example_com if { req_ssl_sni -i awx.example.com }
    use_backend goren_example_com if { req_ssl_sni -i goren.example.com }
    use_backend goren_example_com if { req_ssl_sni -i tower.example.com }

backend goren_example_com
    server goren 192.168.101.182:443 send-proxy-v2
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里进行 SNI 检查,并匹配 SNI 主机名以确定将连接发送到哪个后端。

然后我使用send-proxy-v2它在后端连接上启用PROXY 协议。这将让我告诉后端连接发起的 IP 地址。我们使用此协议是因为X-Forwarded-For在此设置中不可能。

但PROXY协议确实需要后端服务器知道它。为了实现这一点,需要对我的 nginx 设置进行一些小的更改,即:

listen 443 ssl http2 proxy_protocol;
listen [::]:443 ssl http2;
set_real_ip_from 192.168.101.1;
real_ip_header proxy_protocol;
Run Code Online (Sandbox Code Playgroud)

proxy_protocol通过在listen和 中指定real_ip_header,nginx 现在知道通过 PROXY 协议获取客户端的真实 IP 地址。(请注意,我没有在 IPv6 侦听器上使用它,因为我仅通过 haproxy 代理 IPv4 连接。IPv6 连接直接进入,不需要代理。这是 IPv6 的一大优势。)

最后,旧版本的 nginx 使用 PROXY 协议的第 1 版,因此如果send-proxy-v2inhaproxy.cfg不起作用,您需要将其更改为send-proxy.

(如果您是仍在使用 Apache 的人之一,请设置RemoteIPProxyProtocol on。)