如何使用 HAproxy 剥离代理协议?



考虑以下情况:

Internet
||
||
.------''------.
| HTTPS (:443) |
'------..------'
||
.-----------------------'|
|                       /
|           3rd party HAproxy service
|                       ||
|                       ||
optional        .-----------''-----------.
route         | PROXY Protocol (:5443) |
|           '-----------..-----------'
|                       ||                                 ________
___________|_______________________||________________________________| SERVER |____
|           |                       /                                              |
|           |                 local HAproxy                                         |
|           |                       ||                                              |
|           |                       ||                                              |
|           |                .------''------.                                       |
|           |                | HTTPS (:443) |                                       |
|           |                '------..------'                                       |
|           |                       ||                                              |
|           |                       ||                                              |
|           |                       /                                              |
|           '---------------> local webserver                                       |
|___________________________________________________________________________________|

后端服务器分别在端口 5443 和 443 上本地运行 HAproxy 和 Apache httpd。

我的本地网络服务器不支持代理协议。因此,我希望HAproxy从第三方服务中捕获代理协议,并以HTTPS或简单的TCP直通将数据传递到本地Web服务器。

在HTTPS的情况下,我想它应该使用正确的SSL证书操纵HTTP数据包,以在X-Forwarded-ForHTTP标头中添加原始发件人IP(应由代理协议提供(。

但是,如果您是HAproxy的新手,HAproxy 的文档很糟糕,我找不到解释如何执行此操作的示例。我知道这必须是可能的,因为 HAproxy 被列为"代理协议就绪软件",但是如何呢?

是的,您需要在前端声明中bind之后使用accept-proxy关键字。阅读给定的"第三方HAproxy服务"中使用的相关send-proxy关键字也会很好。

可以使用以下 HAproxy 配置将代理协议剥离回其原始状态:

frontend app-proxy
bind *:5443 accept-proxy
mode tcp
option tcplog
default_backend app-httpd
backend app-httpd
mode tcp
server app1 127.0.0.1:443 check

这将接受端口 5443 上的 PROXY 协议,将其剥离,并将 TCP 数据发送到443

如果您想操纵SSL加密的TCP数据中的HTTP数据包,则需要访问正确的SSL证书(您的Web服务器应该已经可以访问这些证书(。这是您可能想要做的。

frontend app-proxy
bind *:5443 accept-proxy ssl crt /path/to/certnkey-file.pem
mode http
option httplog
default_backend app-httpd
backend app-httpd
mode http
server app1 127.0.0.1:443 check ssl verify none

后一种方法的优点是在通过代理时保留原始客户端数据,以便您知道访问者的原始 IP 是什么。这就是首先使用代理协议的整个想法!HAproxy 将使用使用代理协议传输的正确 IP 地址自动更新X-Forwarded-For标头。

最新更新