概述如果你的应用使用SSL证书,则需要决定如何在负载均衡器上使用它们。 单服务器的简单配置通常是考虑客户端SSL连接如何被接收请求的服务器解码。由于负载均衡器处在客户端和更多服务器之间,SSL连接解码就成了需要关注的焦点。 有两种主要的策略。 SSL终端是在负载均衡器终止/解码SSL连接并发送非加密连接到后台服务器的做法 这意味着负载均衡器负责解码SSL连接 - 涉及非SSL请求的缓慢的CPU密集型处理。 这与SSL穿透相反, 它是直接向代理服务器发送SSL连接的。 使用SSL穿透,SSL连接在每个代理服务器终止,将CPU负载都分散到那些服务器。然而,这样做会让你失去增加或修改HTTP报头的能力,因为连接只是简单地从负载均衡器路由到代理服务器。 这意味着应用服务器会失去获取 X-Forwarded-* 报头的能力,这个报头包含了客户端IP地址、端口和使用的协议。 选择哪个策略取决于你及应用的需求。SSL终端为我所见过最典型的策略,但SSL穿透可能会更安全。 有两种策略的组合做法,就是SSL连接在负载均衡器处终止,按需求调整,然后作为新的SSL连接代理到后台服务器。这可能会提供最大的安全性和发送客户端信息的能力。这样做的代价是更多的CPU能耗和稍复杂一点的配置。
使用 HAProxy 作为 SSL 终端首先,我们将介绍最典型的解决方案 - SSL 终端。正如前面提到的,我们需要让负载均衡器处理SSL连接。这就意味着要将SSL证书放在负载均衡服务器上。 在之前的SFH中,我们已经介绍过如何创建自签名证书。我们将重用那些信息来创建一份给HAProxy使用的SSL证书。
接着,在创建了证书之后,我们需要创建 pem 文件。pem 文件本质上只是将证书、密钥及证书认证中心证书(可有可无)拼接成一个文件。在我们的例子中,我们只是简单地将证书及密钥文件并以这个顺序拼接在一样来创建 xip.io.pem 文件。这是 HAProxy 读取SSL证书首选的方式。 $ sudo cat /etc/ssl/xip.io/xip.io.crt /etc/ssl/xip.io/xip.io.key | sudo tee /etc/ssl/xip.io/xip.io.pem
无论如何,只要我们得到了 HAProxy 使用的 pem 文件,我们只需经过简单配置就是可以处理SSL连接了。 我们将配置我们的应用以同时接受 http 和 https 连接。在最新版的 HAProxy中,我们配置这样的前端: frontend localnodes bind *:80 mode http default_backend nodes 要在 HAProxy 里终止 SSL 连接,我们现在就可以添加校准 SSL端 口 443 的绑定,并让 HAProxy 知道 SSL 证书的位置: frontend localhost bind *:80 bind *:443 ssl crt /etc/ssl/xip.io/xip.io.pem mode http default_backend nodes 在上面的例子中,我们使用了后台"nodes"。幸运的是,后台不需要特别配置。在之前的 HAProxy 版本中,我们要这样配置后台: backend nodes mode http balance roundrobin option forwardfor option httpchk HEAD / HTTP/1.1\r\nHost:localhost server web01 172.17.0.3:9000 check server web02 172.17.0.3:9001 check server web03 172.17.0.3:9002 check http-request set-header X-Forwarded-Port %[dst_port] http-request add-header X-Forwarded-Proto https if { ssl_fc } 因为 SSL 连接在负载均衡器上终止了,我们依然来发送正常的 HTTP 请求到后台服务器。我们不需要更改配置就可以得到同样的效果了! 只接受SSL连接如果你想让网站只接受SSL连接,你可以添加向前端配置加上 redirect 导向: frontend localhost bind *:80 bind *:443 ssl crt /etc/ssl/xip.io/xip.io.pem redirect scheme https if !{ ssl_fc } mode http default_backend nodes 上面,我们添加了 redirect 导向,如果连接不是通过SSL连接的,它将 http 重定向到 https。更多信息参见 ssl_fcis available here。 使用HAProxy实现SSL穿透使用SSL穿透,我们将让后台服务器处理SSL连接,而非负载均衡器来处理。 负载均衡器的工作就只是简单地将请求转发到配置好的后台服务器。因为连接还保持加密状态,HAProxy只能将它转发给其他服务器,其他事情就没法做了。 在这个配置中,我们需要在前端和后台配置中同时使用TCP模式而不是HTTP模式。HAProxy只会把连接当作信息流来转发到其他服务器,而不会使用在HTTP请求上才能使用的功能。 首先,我们调整一下前端配置: frontend localhost bind *:80 bind *:443 option tcplog mode tcp default_backend nodes 这里依然同时绑定80和443端口,以保证正常的HTTP连接和SSL连接都能工作。 正如上述提到的,转发一个安全连接事台服务器而不作任何解码,我们需要使用TCP模式(mode tcp)。这也意味着我们需要设置tcp日志而不是默认的http日志(option tcplog)。阅读这个可以了解日志格式并搞清楚tcplog和httplog的区别。 接着,我们要调整后台end配置。注意,我们还要将这个更改成TCP模式,并删除一些directives以避免因为修改/增加HTTP报头功能所带来的冲突: backend nodes mode tcp balance roundrobin option ssl-hello-chk server web01 172.17.0.3:443 check server web02 172.17.0.4:443 check 正如你所看到的,这里设置成了mode tcp - 前端和后台配置都需要设置成这个模式。 我们还删除了option forwardfor和http-request选项 - 这些不能用于TCP模式,而且我们也不能向已加密的请求添加报头。 为了检查正确与否,我们可以使用ssl-hello-chk来检查连接及它处理SSL(特别是SSLv3)连接的能力。 在这个例子中,我虚构了两个接受SSL证书的后台服务器。如果你有阅读过 edition SSL certificates,你会看到如何将它们集成到 Apache 或 Nginx 来创建一个网络服务器后台,以处理SSL通信。使用SSL 穿越,不需要给HAProxy创建或使用SSL证书。后台服务器都能够处理SSL连接,如同只有一如服务器且没有使用负载均衡器那样。 资源
|