我可能已经迷失在有关此主题的大量文档中,但我正在尝试配置我的 HAProxy 进程以发送 PROXY 协议标头,如http://www.haproxy.org/download/1.8/doc/proxy-protocol.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 收到的第一个数据是从我的客户端发送的数据;它是不是我发布的链接中描述的 PROXY 标头。
有人能告诉我我的配置中缺少什么,导致 PROXY 标头被发送到我的后端服务器吗?
答案1
在 HAProxy 邮件列表上发帖后([电子邮件保护])我得到的答案是我需要将send-proxy
或添加send-proxy-v2
到我的后端server
定义中。
我更新的配置文件有以下行:
服务器 TestServer01 10.6.186.24:48080发送代理
...发送 PROXY 协议的第 1 版。
要发送版本 2,请将其更改为
服务器 TestServer01 10.6.186.24:48080发送代理-v2
答案2
根据您链接到的文档,完整配置需要配置几个组件。
如果你的真实后端前面有一个 haproxy 实例,则可能需要应用accept-proxy
:
当“accept-proxy”设置传递给“bind”关键字时,侦听套接字将接受协议。此类侦听器上接受的连接将表现得就像源确实是协议中通告的源一样。对于日志记录、ACL、内容过滤、透明代理等,情况都是如此...
这是您在答案中弄清楚的部分,后端服务器需要使用 send-proxy 配置:
如果“server”行中存在“send-proxy”设置,则可以使用该协议连接服务器。它是针对每个服务器启用的,因此可以仅为远程服务器启用它,而本地服务器仍然会有不同的行为。如果传入连接通过“accept-proxy”接受,则中继的信息是此连接的 PROXY 行中公布的信息。
这是我在 v2 上能找到的全部内容:
Haproxy 1.5 还实现了 PROXY 协议版本 2 作为发送方。此外,还添加了带有有限、可选 SSL 信息的 TLV。