【问题标题】:How to strip Proxy protocol with HAproxy?如何使用 HAproxy 剥离代理协议?
【发布时间】:2018-10-29 07:12:11
【问题描述】:

考虑以下情况:

                                      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 从 3rd 方服务中捕获 PROXY 协议,并通过 HTTPS 或简单的 TCP 传递将数据传递到本地网络服务器。

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

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

【问题讨论】:

    标签: haproxy proxy-protocol


    【解决方案1】:

    是的,您需要在前端声明中的bind 之后使用accept-proxy keyword。阅读在给定的“第 3 方 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 上的代理协议,将其剥离,并将 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 是什么。这就是首先使用代理协议的整个想法! HAproxy 会自动更新 X-Forwarded-For 标头,使用使用 PROXY 协议传输的正确 IP 地址。

    【讨论】:

    • 请注意,无论何时您使用代理协议,确保您的服务永远不会接受来自可信来源以外的任何请求,无论您使用基于 IP 的限制、TLS 相互身份验证。 ,或其他一些机制,因为不受信任的源可以伪造代理协议前导码(“标头”),从而伪造其身份。这本身不是一个漏洞,它与standaed X-Forwarded-For 相同——当从右到左解析时,第一个不受信任的 IP 是您真正可以相信的唯一值。左边的任何东西都可能是伪造的。
    • @Michael-sqlbot 好点。但是,如果我理解正确,那么您是否接受冒名顶替者都没有关系 - 因为您可以随时根据X-Forwarded-For 中的 IP 地址检查其有效性。最后一个IP地址不能伪造,因为它只是在基于TCP包源的端点中添加的。因此,即使您接受来自不受信任来源的请求,您也可以通过检查 X-Forwarded-For 来检查这一点,对吗?
    • 不,我不这么认为,因为 X-Forwarded-For 将包含写在代理协议消息中的任何内容,而不是来自 IP 堆栈的地址,不是吗?代理协议隐含地信任发送者发送准确的消息。
    猜你喜欢
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2020-10-27
    相关资源
    最近更新 更多