haproxy + stunnel + 保持活动状态?

Chr*_*her 10 ssl https tcp haproxy stunnel

我想在 haproxy 1.4 前面放置 stunnel 来处理 HTTPS 流量。我还需要 stunnel 添加X-Forwarded-For标头。这可以通过 haproxy 网站上的“stunnel-4.xx-xforwarded-for.diff”补丁来实现。

但是,描述中提到:

请注意,此补丁不适用于 keep-alive,...

我的问题是:这对我来说在实践中意味着什么?我不确定,

  1. 如果这是关于保持活动之间的
    • 客户端和 stunnel
    • stunnel 和 haproxy
    • 或haproxy 和后端服务器?
  2. 这对性能意味着什么:如果我在网页上有 100 个图标,浏览器是否必须协商 100 个完整的 SSL 连接,或者它可以重新使用 SSL 连接,只是创建新的 TCP 连接?

Sha*_*den 12

这是关于 HTTP 保持活动,它允许多个资源请求通过单个 TCP 会话(并且,使用 SSL,单个 SSL 会话)。这对 SSL 站点的性能非常重要,因为如果没有保持活动状态,每个请求的资源都需要 SSL 握手。

因此,这里关注的是从客户端一直到后端服务器的一个大型保持活动会话。这对性能来说很重要,对于现代 HTTP 服务器来说是理所当然的事情,但是这个补丁说它不支持它。让我们来看看为什么..


保持活动会话只是一个接一个的请求——一旦服务器完成对一个请求的响应,服务器不会发送FIN数据包来结束 TCP 会话;客户端可以简单地发送另一批标头。

要了解该补丁正在做什么,以下是保持活动对话的示例:

客户:

GET / HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Run Code Online (Sandbox Code Playgroud)

服务器:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache
Content-Length: 34
.... (other headers)
<html><head>content!</head></html>
Run Code Online (Sandbox Code Playgroud)

这是非保持活动连接将停止的地方。但是,keep-alive 允许客户端触发另一个:

GET /images/some/image.on.the.page.jpg HTTP/1.1
Connection: keep-alive
Host: domain.com
...
Run Code Online (Sandbox Code Playgroud)

对于代理中的客户端 ID,可以X-Forwarded-For在每个客户端请求的标头中添加一些反向代理。这会告诉上游服务器请求来自哪里(而不是每个请求都从反向代理的 IP 发起),以确保日志记录和其他应用程序需求的完整性。

由于X-Forwarded-For每次都发送完整的标头,因此需要将标头注入通过保活连接发送的每个客户端资源请求中;处理X-Forwarded-For标头并将其转换为“真实”请求 IP 是基于每个请求而不是每个 TCP-keep-alive-session 完成的。嘿,也许有一些很棒的反向代理软件可以使用单个保持活动会话来服务来自多个客户端的请求。

这是这个补丁失败的地方。


该站点的补丁监视 TCP 会话的缓冲区以查找流中第一组 HTTP 标头的结尾,并在第一组标头结束后将新标头注入流中。完成此操作后,它认为X-Forwarded-For作业已完成,并停止扫描新标题集的末尾。此方法不知道通过后续请求传入的所有未来标头。

真的不能怪他们;stunnel 并不是真正构建来处理和翻译其流的内容。

这将对您的系统产生的影响是,保持活动流的第一个请求将X-Forwarded-For正确注入标头,并且所有后续请求都可以正常工作 - 但它们不会有标头。

除非有另一个标头注入补丁可以处理每个连接的多个客户端请求(或者在 Stack Overflow 上我们的朋友的帮助下调整这个补丁),否则您可能需要查看其他选项来终止 SSL。


小智 5

STunnel 4.45 使用 HAProxy 1.15 附带的一些新功能(代理协议)正确修复了这个问题

它还修复了以前补丁和Keep Alive的问题