问题:Nginx 在监听 proxy_protocol 时捕获“broken header”

我需要在启用代理协议的情况下对 Elastic Beanstalk 应用程序使用 http 运行状况检查。目前这是不可能的,并且健康检查失败并出现错误-->*58 broken header while reading PROXY protocol

我想我有两个选择

  1. 在另一个端口上执行健康检查,并设置 nginx 以监听该端口上的 http 请求并代理到我的应用程序。

  2. 如果可以捕获broken header错误,或者检测到proxy_protocol服务器块中的常规 http 请求,则将这些请求重定向到侦听 http 的端口。

如果可能的话,我更喜欢后者(#2)。那么有没有办法做到这一点?

理想情况下,我宁愿不必这样做。已向 AWS 提交了用于修复此问题的功能请求,但它没有 ETA。

解答

代理协议规范说:

接收器必须配置为只接收本规范中描述的协议,并且不得尝试猜测协议头是否存在。这意味着该协议明确禁止公共和私人访问之间的端口共享。否则,它会允许不受信任的各方欺骗他们的连接地址,从而引发重大的安全漏洞。

我认为这意味着选项 2 是一个非常糟糕的主意,它甚至不受代理协议的符合实现的支持。

另一方面,选项 1 似乎很合理。您可以设置一个安全组,以便在未启用代理协议的情况下,只有合法的健康检查才能进入端口。

另外几个选项也浮现在脑海中:

  1. 只需将您的健康检查指向添加标头的事物(即 ELB?),而不是直接指向您的 Nginx 实例。不确定这是否可以通过 Elastic Beanstalk 实现,这不是我使用的服务。

  2. 在将健康检查流量转发到 Nginx 之前,使用其他东西添加代理协议标头,这样可以避免复制 Nginx 配置。例如,在与 Nginx 相同的机器上运行的 HAProxy 可以做到这一点。同样,使用安全组来确保只有合法流量才能通过。

Logo

开发云社区提供前沿行业资讯和优质的学习知识,同时提供优质稳定、价格优惠的云主机、数据库、网络、云储存等云服务产品

更多推荐