Elastic Load Balancing上的代理协议非终止SSL连接

时间:2014-02-27 20:28:53

标签: ssl amazon-web-services proxy amazon-ec2 amazon-elb

由于我们不会改变的原因,我们的应用程序需要处理SSL连接,而不是ELB。使用代理协议的目的是通过 SSL 连接获取客户端的IP地址。

http://aws.typepad.com/aws/2013/07/elastic-load-balancing-adds-support-for-proxy-protocol.html?ref_=9表示“或者,如果您要发送HTTPS请求并且不想在负载均衡器上终止SSL连接,则可以使用它。有关详细信息,请访问Elastic Load Balancing Guide。”

不幸的是,链接到的指南似乎没有详细说明这一点,并且代理协议的基本文档(http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html)在我们的环境中按照描述进行配置时失败。

有人有步骤或链接吗?

2 个答案:

答案 0 :(得分:2)

代理协议(版本1)在连接开始时将一行注入数据流,然后由服务器协商SSL。您没有“通过”SSL连接获取此信息;您可以在SSL握手之前获得信息。您的服务器必须实现此功能,并且必须进行配置,以便它可以接受并理解它。对于IPv4连接,它看起来像这样:

PROXY TCP4 source-ip dest-ip source-port dest-port\r\n

协议的标准在这里:

http://haproxy.1wt.eu/download/1.5/doc/proxy-protocol.txt

ELB文档中的其他信息:

http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#proxy-protocol


关于Apache支持,至少在AWS宣布支持代理协议时......

  

Apache和Nginx目前都不支持ELB插入的代理协议标头

     

- http://aws.typepad.com/aws/2013/07/elastic-load-balancing-adds-support-for-proxy-protocol.html?ref_=9

当然,这可能会有所变化,但我没有成功地获得代理协议的任何Apache支持。当然,既然Apache是​​开源的,你可能会在那里破解它,虽然我不熟悉Apache源代码。

意识到你不想改变你现在正在做的事情,我仍然建议根据你不想改变的动机,可能仍然有一个相对简单的解决方案。这是一个变化,但不涉及ELB上的SSL。如何在ELB后面运行HAProxy以在Apache前面终止SSL?由于HAProxy 1.5可以终止SSL并且appears to be able to将代理协议字符串从ELB转换为X-Forwarded-For标头,并生成X-SSL标头以向您的应用程序提供有关客户端SSL证书的信息(可能那是你在app服务器上而不是在ELB上终止SSL的动机?)...所以这可能是另一种选择。

否则,除非Apache将来实施支持,否则我没有建议,或者我们可以找到一些文档来表明它们已经拥有。

答案 1 :(得分:0)

为了跟进迈克尔 - sqlbot的讨论AWS support for proxy protocol on EC2 instances behind elastic load balancers的答案,有两个可用的Apache模块可以实现代理协议:mod_myfixipmod_proxy_protocol。两者都能够纠正记录用户IP地址的问题,而不是弹性负载均衡器的IP。

我已尝试过这两种方式并让他们与AWS合作并同意HAProxy的recommendation使用mod_myfixip(当负载均衡器未配置为发送代理协议头时,mod_proxy_protocol中断httpd ,而mod_myfixip优雅地失败了。)