Load-Balancing

從 HAProxy 發送 PROXY 協議頭

  • March 27, 2017

我可能迷失在關於這個主題的大量文件中,但我正在嘗試配置我的 HAProxy 程序以發送 PROXY 協議標頭,如http://www.haproxy.org/download/1.8/doc/中所述代理協議.txt。這是因為我必須將 PROXY 協議的支持寫入 C++ 伺服器(以便它能夠訪問客戶端 IP/埠),並且我想測試我的程式碼在解析 PROXY 標頭時是否正常工作。

這是我的最小配置文件:

global
  maxconn 4096

defaults
  log   global
  mode   http
  retries   3
  option redispatch
  maxconn   2000
  timeout connect 5000
  timeout client  50000
  timeout server  50000

frontend TestServerTest
   bind 10.6.186.24:54781
   mode tcp
   default_backend TestServernodes

backend TestServernodes
   mode tcp
   # Note there is no 'check' after the below line unlike the others as we don't want to send the
   # healthcheck ("OPTIONS / HTTP/1.0"...) string to the TestServer as it doesn't understand it!
   server TestServer01 10.6.186.24:48080

我發現當我啟動 HAProxy 並連接到 54781 時,48080 處的 TestServer 收到的第一個數據是從我的客戶端發送的數據;它不是我發布的連結中描述的代理標頭。

有人可以告訴我我的配置中缺少什麼阻止代理標頭髮送到我的後端伺服器嗎?

在 HAProxy 郵件列表 (haproxy@formilux.org) 上發布後,我得到了需要添加send-proxy或添加send-proxy-v2到後端server定義的答案。

我更新的配置文件有以下行:

伺服器 TestServer01 10.6.186.24:48080發送代理

…發送代理協議的版本 1。

要發送版本 2,請將其更改為

伺服器 TestServer01 10.6.186.24:48080發送代理-v2

根據您連結到的文件,完整的配置需要配置幾個組件。

如果您的真實後端前面有一個 haproxy 實例,您可能需要申請accept-proxy

當“accept-proxy”設置傳遞給“bind”關鍵字時,監聽套接字接受協議。在此類偵聽器上接受的連接將表現得就像源真的是協議中所宣傳的一樣。這適用於日誌記錄、ACL、內容過濾、透明代理等……

這是您在答案中發現的部分,後端伺服器需要配置發送代理:

如果“伺服器”行上存在“發送代理”設置,則該協議可用於連接伺服器。它是在每個伺服器的基礎上啟用的,因此可以只為遠端伺服器啟用它,而本地伺服器的行為仍然不同。如果傳入的連接被“accept-proxy”接受,那麼中繼的資訊就是這個連接的代理行中通告的資訊。

這就是我在 v2 上所能找到的:

Haproxy 1.5 還實現了 PROXY 協議的第 2 版作為發送方。此外,還添加了帶有有限、可選 SSL 資訊的 TLV。

引用自:https://serverfault.com/questions/839965