启用 nginx 上游 keepalive 的风险

启用 nginx 上游 keepalive 的风险

使用 nginx 作为 Apache 的 HTTP 反向代理,后端为 PHP(我需要为网站管理员提供 .htaccess 灵活性)。看到 Apache 日志中使用的 http/1.0,我便开始查找如何启用保持连接。

经过搜索,我发现了来自 Nginx 的这篇博客文章https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

默认情况下,NGINX 会为每个新传入请求打开与上游(后端)服务器的新连接。这很安全,但效率低下,[...]

如果默认行为是安全的,那么启用上游 keepalive 的风险是什么?

答案1

由于 HTTP 失步攻击/请求走私,使用 keepalive 代理连接被视为一种风险。当后端没有以与前端完全相同的方式拆分不同的客户端请求时,就会发生这种情况。在每个请求之后关闭连接是“安全”的选项,因为这清楚地说明了当前请求何时结束。

https://book.hacktricks.xyz/pentesting-web/http-request-smuggling了解更多信息。

答案2

正如我已经提到的,KeepAlive 是一种缓存连接的优化。它是为了支持高吞吐量流量。我认为启用它没有任何风险,事实上,无论如何它都会有更好的结果。

答案3

默认行为,即为每个请求创建与上游的连接,对于高负载而言是不安全的。原因如下:

  1. 一旦请求从同一客户端本身到达 nginx 服务器,它将与上游服务器创建一个新的连接,为此,它将使用新的可用本地端口。
  2. 一旦完成请求,该本地端口上的给定连接将从已建立状态变为 TIME_WAIT 状态 120 秒,这意味着 120 秒内,该本地端口不能再用于任何新请求
  3. 现在第二个请求来自同一个客户端,它将重复步骤 1。
  4. 这样对于重载来说,
    1. 你可能最终会使用 nginx 上所有可用的本地端口 (65k)
    2. 每次请求时创建和终止连接都是非常昂贵的操作

因此,为了避免这种情况,最好的办法是缓存连接,这样当请求到来时,您可以重用与上游服务器相同的连接(在同一个本地端口上,就像您对上一个请求所做的那样)

问候 Vj

相关内容