在ELB上重用代理协议头

时间:2016-06-20 08:52:32

标签: amazon-web-services amazon-elb

我可以turn on Proxy Protocol on ELB

但在我的情况下,我想在ELB上重用代理协议头。有可能吗?

我的意思是我发送一个已经设置为ELB的代理协议头的请求。我希望ELB采用这个特殊的标题并进一步传递它。不要生成新的(源/端口与原始源不同)。

1 个答案:

答案 0 :(得分:1)

参考PROXY"标题"在技​​术上不准确,但可能有些误导或含糊不清的术语。

这是一个"标题"从它到达连接开始的意义上来说,它不是HTTP请求标头,与熟悉的X-Forwarded-For不同,后者当然是HTTP请求标头。

简洁优雅,此协议的第1版在TCP连接的开头注入消息:

PROXY TCP4 192.168.0.1 192.168.0.11 56324 443\r\n

字段是协议(TCP over IPv4),source-ip,destination-ip,source-port,destination-port,每个字段间隔一个空格。

在堆栈中使用PROXY协议时,它是必需的。连接开始时丢失或格式错误的PROXY消息是错误情况。 PROXY消息的存在带来的信任级别高于X-Forwarded-For提供的信任级别,该信任级别通过修改传递(后面的值附加到较早的值)。 PROXY协议没有正式允许级联多个值。

如果你需要ELB传输这个值"在里面,"那么ELB的入口安全组只能接受来自可靠来源地址的请求,这一点至关重要。

一旦完成,tl; dr:

在TCP模式(非HTTP)中配置ELB侦听器并在ELB上禁用代理协议将允许将原始的外部PROXY消息传输到ELB后面的系统。

在HTTP模式下通过ELB传递此信息是不可能的,因为ELB并不期望它在请求上,并且后端连接可以被多个前端客户端的请求重用,它与代理协议并不基本兼容 - 它旨在识别传入连接的客户机的IP源地址和端口(不是HTTP请求的源IP和端口)。 ..并且,如上所述,它不是HTTP请求标头。

PROXY协议背后的想法是通过一堆非有效负载感知的组件来识别始发客户端。因此,在这种情况下,ELB需要遵循该模型。 (当然,对于一个中间组件来说,剥离然后重新注入PROXY消息是可能的,尽管在许多情况下这会毫无意义,但ELB并没有处理这个问题。配置。)

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

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