如何将AWS LoadBalancer ProxyProtocol用于AutoScale实例?

时间:2015-09-16 11:38:12

标签: amazon-web-services amazon-ec2 load-balancing

我已安装附带ELB的AWS AutoScale设置。通常,部署在Auto2cale的EC2实例上的API成功获取Loadbalancer的请求,并且对客户端的响应是可以的。但是,现在我开发了一个需要客户端IP地址的新API。在当前设置中,Loadbalancer更改源IP地址。

我已阅读此文档http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html,我知道可以使用代理协议

我已使用此AWS CLI命令

创建了该策略
aws elb create-load-balancer-policy --load-balancer-name LB-autoscale --policy-name my-ProxyProtocol-policy --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true

问题:如何自动为AutoScale组创建的后端EC2服务器设置此负载均衡器策略?因此,每当autoscale组启动新的EC2实例时,都应该为该实例启用proxyProtocol,并且在该实例上部署的API应该获得Client的原始IP。

1 个答案:

答案 0 :(得分:0)

  

应该为该实例启用ProxyProtocol

您提出的问题是您未在实例上启用代理协议。

代理协议必须由实例上运行的Web服务器软件理解,并且必须配置软件才能使用它。

例如,在nginx Web服务器中,而不是......

server {
    listen 80;
...

......你会用这个......

server {
    listen 80 proxy_protocol;
...

... $proxy_protocol_addr内置变量将包含客户端IP,您可以使用它来设置标头以将地址传递给下游服务。

根据标准,如果服务期望代理协议前导码,则需要拒绝任何不包含它的请求。

  

接收器必须配置为仅接收此处描述的协议   规范并且不得试图猜测协议头是否存在   或不。

     

http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt

这意味着配置为使用代理协议的兼容服务在没有它的情况下无法工作,并且配置为不使用它(或不知道它/不兼容)的服务最多应该忽略它,并且最常见的是,完全失败,因为有效载荷会出乎意料。

因此,如果没有您的堆栈支持,代理协议将不适合您。实例或任何AWS组件都不会对您进行处理。

另一方面,对于Web服务API,您通常不需要它。

HTTP模式下的Elastic Load Balancer会在每个请求中注入一个X-Forwarded-For标头,其中包含客户端的IP地址。大多数应用程序似乎都使用这种机制。

如果传入请求已经有这样的标头,则客户端IP地址将附加到末尾,其值以逗号分隔。当您的代码找到多个值时,只应该信任最右边的值,并且左边的值应该被视为“仅供参考” - 它们可能是准确的,并且它们可能是伪造的...但是最后一个不能被篡改。