如何把一个web集群由HTTP转换为HTTPS(LVS+HAProxy+SSL)

如何把一个web集群由HTTP转换为HTTPS(LVS+HAProxy+SSL),第1张

如何把一个web集群由HTTP转换为HTTPS(LVS+HAProxy+SSL)

一、环境介绍

我被告知网站需要从http更改为https。目前我的网站前端架构如下图所示:

假设我们有两台物理机器,每台机器都有许多tomcat容器。前端使用haproxy的http层负载均衡,然后前端使用LVS负载均衡。整个LVS都使用DR模式。

一开始打算把tomcat改成https,后来设置成haproxy的时候,发现haproxy已经不能用负载均衡了,因为SSL在第四层,于是这个方案就结束了。现在,我将尝试在haproxy层设置SSL,并使用普通连接到后端。


二。设置步骤

1。概述

如果您的应用程序使用SSL证书,您需要决定如何在负载平衡器上使用它们。

单一服务器的简单配置通常考虑客户机SSL连接如何被接收请求的服务器解码。由于负载均衡器位于客户端和更多服务器之间,SSL连接解码成为关注的焦点。

2。有两种主要策略

  • 第一个是我们选择的模式,在haproxy这里设置SSL,这样就可以继续使用七层负载均衡。SSL连接终止于负载均衡器haproxy->:解码SSL连接并向后端应用tomcat发送未加密的连接,是指负载均衡器负责解码SSL连接,与SSL穿透相反。它将SSL连接直接发送到代理服务器。

  • 第二种使用SSL穿透,SSL连接在每个tomcat服务器上终止,将CPU负载分配给tomcat服务器。但是,这样做会使您失去添加或修改HTTP头的能力,因为连接只是从负载平衡器路由到tomcat服务器,这意味着应用服务器将失去获取X-Forwarded-*头的能力,该头包含客户机使用的IP地址、端口和协议。

    有两种策略的组合,也就是第三种。SSL连接在负载平衡器处终止,根据需求进行调整,然后充当后台服务器的新SSL连接代理。这可以提供最大的安全性和发送客户端信息的能力。这样做的代价是更多的CPU功耗和稍微复杂一些的配置。

    选择哪种策略取决于您和应用程序的需求。SSL是我见过最典型的策略,但SSL渗透可能更安全。

    3。使用HAProxy作为SSL终端

    首先,我们将介绍最典型的解决方案——SSL终端。如前所述,我们需要让负载平衡器处理SSL连接。这意味着SSL证书应该放在负载平衡服务器上。

    请记住,生产环境中使用的SSL证书(而不是自签名)不需要您自己生成或签名——您只需要创建一个证书签名请求(csr)并将其交给您购买证书的机构。

    首先,我们创建一个自签名证书作为演示,并在本地使用相同的证书。

    openssl genrsa -out /etc/haproxy/wzlinux.key 2048 openssl req -new -key /etc/haproxy/wzlinux.key -out /etc/haproxy/wzlinux.csr > Country Name (2 letter code) [AU]:CN > State or Province Name (full name) [Some-State]:Shanghai > Locality Name (eg, city) []:Shanghai > Organization Name (eg, company) [Internet Widgits Pty Ltd]:wzlinux > Organizational Unit Name (eg, section) []: > Common Name (e.g. server FQDN or YOUR name) []:www.wzlinux.com > Email Address []: > Please enter the following 'extra' attributes to be sent with your certificate request > A challenge password []: > An optional company name []: cd /etc/haproxy openssl x509 -req -days 3655 -in wzlinux.csr -signkey wzlinux.key -out wzlinux.crt

    生成文件wzlinux.csr、wzlinux.key和wzlinux.crt。

    然后,在创建证书之后,我们需要创建pem文件。Pem文件本质上只是将证书、密钥和证书认证中心(可选)的证书拼接成一个文件。在我们的示例中,我们只是按照这个顺序将证书和密钥文件拼接在一起,以创建wzlinux.pem文件。这是HAProxy读取SSL证书的首选方式。

    cat wzlinux.crt wzlinux.key | tee wzlinux.pem

    买真证的时候,不一定拿到拼接的文件。你可以自己拼接。不过很多机构也会给你提供一个拼接的文档。如果没有得到拼接的文件,可能不是pem文件,而是bundle、cert、cert、key文件或者一些概念相同但名称相似的文件。

    无论如何,只要拿到HAProxy使用的pem文件,通过简单的配置就可以处理SSL连接。

    接下来,我们将配置haproxy来安装SSL证书。配置文件如下所示

    #--------------------------------------------------------------------- # Example configuration for a possible web application.  See the # full configuration options online. # #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global     # to have these messages end up in /var/log/haproxy.log you will     # need to:     #     # 1) configure syslog to accept network log events.  This is done     #    by adding the '-r' option to the SYSLOGD_OPTIONS in     #    /etc/sysconfig/syslog     #     # 2) configure local2 events to go to the /var/log/haproxy.log     #   file. A line like the following can be added to     #   /etc/sysconfig/syslog     #     # local2.*                       /var/log/haproxy.log     #     log         127.0.0.1 local2 warning     chroot      /var/lib/haproxy     pidfile     /var/run/haproxy.pid     maxconn     400000     user        haproxy     group       haproxy     daemon     tune.ssl.default-dh-param  2048 #    nbproc      3     # turn on stats unix socket     stats socket /var/lib/haproxy/stats #--------------------------------------------------------------------- # common defaults that all the 'listen' and 'backend' sections will # use if not designated in their block #--------------------------------------------------------------------- defaults     mode                    http     log                     global     option                  httplog     option                  dontlognull     option                  http-server-close     option forwardfor       except 127.0.0.0/8     option                  redispatch     option                  httpclose     retries                 3     timeout http-request    10s     timeout queue           1m     timeout connect         10s     timeout client          1m     timeout server          1m     timeout http-keep-alive 10s     timeout check           10s     stats enable     stats hide-version     stats uri     /haproxy?status     stats realm   Haproxy\ Statistics     stats auth    admin:asd870719 #   stats admin if TRUE #--------------------------------------------------------------------- # main frontend which proxys to the backends #--------------------------------------------------------------------- #frontend  main *:5000 #   acl url_static       path_beg       -i /static /images /javascript /stylesheets #   acl url_static       path_end       -i .jpg .gif .png .css .js #   use_backend static          if url_static #   default_backend             app frontend  wzlinux_ssl       bind *:80       bind *:443 ssl crt /etc/haproxy/wzlinux.pem       mode http       default_backend  wzlinux #--------------------------------------------------------------------- # static backend for serving up images, stylesheets and such #--------------------------------------------------------------------- #backend static #   balance     roundrobin #   server      static 127.0.0.1:4331 check backend wzlinux     mode http     balance     roundrobin     option forwardfor #   option httpchk HEAD / HTTP/1.1\r\nHost:localhost     server      wzlinux01  10.0.0.9:8080 check inter 15000 rise 2 fall 4     server      wzlinux02  10.0.0.9:8081 check inter 15000 rise 2 fall 4     server      wzlinux03  10.0.0.9:8082 check inter 15000 rise 2 fall 4     server      wzlinux04  10.0.0.9:8083 check inter 15000 rise 2 fall 4     server      wzlinux05  10.0.0.9:8084 check inter 15000 rise 2 fall 4     server      wzlinux06  10.0.0.9:8085 check inter 15000 rise 2 fall 4     server      wzlinux07  10.0.0.9:8086 check inter 15000 rise 2 fall 4 #   http-request set-header X-Forwarded-Port %[dst_port] #   http-request add-header X-Forwarded-Proto https if { ssl_fc }

    因为SSL连接是在负载平衡器上终止的,所以我们仍然向后台服务器发送普通的HTTP请求。

    仅接受SSL连接

    如果您希望网站只接受SSL连接,可以添加重定向到前端配置:

    frontend wzlinux_ssl     bind *:80     bind *:443 ssl crt /etc/haproxy/wzlinux.pem     redirect scheme https if !{ ssl_fc }     mode http     default_backend wzlinux

    上面,我们添加了重定向,如果连接不是通过SSL,它会将http重定向到https。

    4。使用HAProxy的SSL渗透

    通过SSL渗透,我们将让后台服务器处理SSL连接,而不是负载均衡器。

    负载平衡器的工作只是将请求转发给已配置的后台服务器。因为连接还是加密的,所以HAProxy只能转发给其他服务器,其他什么都做不了。

    在这个配置中,我们需要在前端和后端配置中都使用TCP模式而不是HTTP模式。HAProxy只会将连接作为信息流转发到其他服务器,不会使用只能在HTTP请求上使用的功能。

    首先,我们来调整一下前端配置:

    frontend wzlinux_ssl     bind *:80     bind *:443     option tcplog     mode tcp     default_backend wzlinux

    这里仍然同时绑定了端口80和443,以保证正常的HTTP连接和SSL连接可以工作。

    如上所述,要在不进行任何解码的情况下将安全连接转发到服务器,我们需要使用TCP模式(modetcp)。这也意味着我们需要设置tcplog而不是默认的httplog(选项tcplog)。

    接下来,我们需要调整后台端的配置。注意,我们必须将此更改为TCP模式,并删除一些指令,以避免修改/添加HTTP头函数导致的冲突:

    backend wzlinux     mode tcp     balance roundrobin     option ssl-hello-chk     server      wzlinux01  10.0.0.9:8080 check inter 15000 rise 2 fall 4     server      wzlinux02  10.0.0.9:8081 check inter 15000 rise 2 fall 4     server      wzlinux03  10.0.0.9:8082 check inter 15000 rise 2 fall 4     server      wzlinux04  10.0.0.9:8083 check inter 15000 rise 2 fall 4     server      wzlinux05  10.0.0.9:8084 check inter 15000 rise 2 fall 4     server      wzlinux06  10.0.0.9:8085 check inter 15000 rise 2 fall 4     server      wzlinux07  10.0.0.9:8086 check inter 15000 rise 2 fall 4

    如您所见,这里设置了模式TCP前端和后台配置都需要设置为该模式。

    我们还删除了forwardfor选项和http-request选项——这些选项不能在TCP模式下使用,我们也不能给加密的请求添加头。之前的一些默认配置也删除了关于http的配置,这里就不演示了。

    为了检查正确性,我们可以使用ssl-hello-chk来检查连接及其处理ssl(尤其是SSLv3)连接的能力。


    在这个例子中,我构建了两个接受SSL证书的后台服务器。如果您已经阅读了版本SSL证书,您将看到如何将它们集成到Apache或Nginx中,以创建一个web服务器后台来处理SSL通信。使用SSL遍历,不需要为HAProxy创建或使用SSL证书。后台服务器可以处理SSL连接,就像只有一个服务器,没有使用负载平衡器一样。

    关于如何设置lvs发行版,这里就不做演示了。你可以看看我写的关于LVS的文章。


    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/778723.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存