2

考虑以下情况:

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

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

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

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

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

4

1 回答 1

4

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

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

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 上的代理协议,将其剥离,并将 TCP 数据发送到443.

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

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 是什么。这就是首先使用代理协议的整个想法!X-Forwarded-ForHAproxy 将使用使用代理协议传输的正确 IP 地址自动更新标头。

于 2018-05-19T18:45:44.520 回答