啟用 nginx 上游 keepalive 的風險

啟用 nginx 上游 keepalive 的風險

使用 nginx 作為帶有 PHP 後端的 Apache 的 HTTP 反向代理(我需要為網站管理員提供 .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

相關內容