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

时间:2018-05-18 19:36:20

标签: haproxy proxy-protocol

考虑以下情况:

                                      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从第三方服务中捕获PROXY协议,并以HTTPS或简单的TCP传递方式将数据传递到本地Web服务器。

对于HTTPS,我认为它应该使用正确的SSL证书操纵HTTP数据包,以便在X-Forwarded-For HTTP标头中添加原始发件人IP(应该由PROXY协议提供)。

但是,如果您是HAproxy的新手,documentation of HAproxy很糟糕,我找不到解释如何执行此操作的示例。我知道它必须是可能的,因为HAproxy被列为"Proxy-protocol ready software",但是如何?

1 个答案:

答案 0 :(得分:3)

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

可以使用以下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上的PROXY协议,剥离它,并将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是什么。这首先是使用PROXY协议的全部想法! HAproxy将使用PROXY协议传输正确的IP地址自动更新X-Forwarded-For标头。