Nginx 在监听 proxy_protocol 时捕获“broken header”
问题:Nginx 在监听 proxy_protocol 时捕获“broken header”
我需要在启用代理协议的情况下对 Elastic Beanstalk 应用程序使用 http 运行状况检查。目前这是不可能的,并且健康检查失败并出现错误-->*58 broken header while reading PROXY protocol
我想我有两个选择
-
在另一个端口上执行健康检查,并设置 nginx 以监听该端口上的 http 请求并代理到我的应用程序。
-
如果可以捕获
broken header错误,或者检测到proxy_protocol服务器块中的常规 http 请求,则将这些请求重定向到侦听 http 的端口。
如果可能的话,我更喜欢后者(#2)。那么有没有办法做到这一点?
理想情况下,我宁愿不必这样做。已向 AWS 提交了用于修复此问题的功能请求,但它没有 ETA。
解答
代理协议规范说:
接收器必须配置为只接收本规范中描述的协议,并且不得尝试猜测协议头是否存在。这意味着该协议明确禁止公共和私人访问之间的端口共享。否则,它会允许不受信任的各方欺骗他们的连接地址,从而引发重大的安全漏洞。
我认为这意味着选项 2 是一个非常糟糕的主意,它甚至不受代理协议的符合实现的支持。
另一方面,选项 1 似乎很合理。您可以设置一个安全组,以便在未启用代理协议的情况下,只有合法的健康检查才能进入端口。
另外几个选项也浮现在脑海中:
-
只需将您的健康检查指向添加标头的事物(即 ELB?),而不是直接指向您的 Nginx 实例。不确定这是否可以通过 Elastic Beanstalk 实现,这不是我使用的服务。
-
在将健康检查流量转发到 Nginx 之前,使用其他东西添加代理协议标头,这样可以避免复制 Nginx 配置。例如,在与 Nginx 相同的机器上运行的 HAProxy 可以做到这一点。同样,使用安全组来确保只有合法流量才能通过。
更多推荐

所有评论(0)