在 ELB 上重用代理协议 header

Reusing proxy protocol header on ELB

我可以turn on Proxy Protocol on ELB

但就我而言,我想在 ELB 上重用代理协议 header。可能吗?

我的意思是我发送了一个代理协议 header 已经设置为 ELB 的请求。我希望 ELB 接受这个特定的 header 并进一步传递它。不生成新的(其中 source/port 将与原始的不同)。

提及 PROXY "header" 在技术上并非不准确,但可能有些误导或模棱两可的术语。

它是一个 "header" 在它到达连接开始的意义上,但它不是一个 HTTP 请求 header,不像我们熟悉的 X-Forwarded-For,它是当然是 HTTP 请求 header.

优雅简洁,此协议的版本 1 在 TCP 连接开始时注入一条消息:

PROXY TCP4 192.168.0.1 192.168.0.11 56324 443\r\n

这些字段是协议(IPv4 上的 TCP)、source-ip、destination-ip、source-port、destination-port,每个字段由一个 space 分隔。

当在栈中使用PROXY协议时,它是强制性的。连接开始时丢失或格式错误的 PROXY 消息是一种错误情况。 PROXY 消息的存在带来的信任级别高于 X-Forwarded-For 提供的信任级别,passed-through 经过修改(较晚的值附加到较早的值)。 PROXY 协议不允许级联多个值。

如果您需要 ELB 传输此值"inside,",那么将 ELB 的入口安全组限制为仅接受来自可信源地址的请求是至关重要的。

一旦完成,tl;dr:

在 TCP 模式(而非 HTTP)下配置 ELB 侦听器并在 ELB 本身上禁用代理协议将允许将原始的外部 PROXY 消息传输到ELB.

不可能在 HTTP 模式下使用 ELB 传递它,因为 ELB 不希望它出现在请求中,并且 back-end 连接可以被多个请求重用 front-end 客户端,它从根本上与代理协议不兼容 - 它旨在识别传入连接的客户端计算机的 IP 源地址和端口(不是 HTTP 请求的源 IP 和端口)......并且,如前所述,它不是HTTP 请求 header.

PROXY 协议背后的想法是通过不是 payload-aware 的组件堆栈来识别原始客户端。因此,在这种情况下,ELB 需要遵循该模型。 (当然,对于中间组件 strip-off,然后 re-inject,即 PROXY 消息,这是可能的,尽管在许多情况下这有点毫无意义,而 ELB 不会处理此配置。)

在 TCP 模式下,ELB 变得与协议无关,并且 front-side 和 back-side 连接之间存在 1:1 关系,因此消息应该通过并按预期工作。

一个可能需要注意的警告可能取决于 ELB 如何在 TCP 模式下处理数据包负载。代理协议要求整个 PROXY 消息出现在第一个数据包中。 (该协议甚至以一种方式设计,以确保数据始终适合单个段。)如果 ELB 将其分段,则目的地将需要容忍。这似乎不太可能成为问题,但请注意这种可能性,如果最终目的地间歇性地认为传入流无效。