如何为AutoScale实例使用AWS LoadBalancer ProxyProtocol



我有附带ELB的AWS AutoScale设置。一般来说,部署在AutoScale的EC2实例上的api能够成功地从Loadbalancer获取请求,并且对客户端的响应是正常的。但是,现在我开发了一个新的API,需要客户端的IP地址。在当前设置中,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 group启动一个新的EC2实例时,应该为该实例启用proxyProtocol,并且部署在该实例上的API应该获得Client的原始IP。

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模式下的弹性负载均衡器将在每个请求中注入一个X-Forwarded-For头,包含客户端的IP地址。大多数应用程序似乎都使用这种机制。

如果传入的请求已经有这样的标头,客户端IP地址将被附加到末尾,值以逗号分隔。当你的代码找到多个值时,只有最右边的值应该是可信的,而左边的值应该被认为是"仅提供信息的"——它们可能是准确的,也可能是伪造的……但最后一个是无法篡改的。

最新更新