Nginx set_real_ip_from AWS ELB负载均衡器地址

我有一套Amazon ELB负载均衡器后面的Nginx服务器。 我使用set_real_ip(来自HttpRealIpModule ),以便我可以访问这些服务器上的原始客户端IP地址(用于传递给php-fpm并在HttpGeoIPModule中使用)。

似乎nginxconfiguration中的set_real_ip_from只能接受一个I​​P地址。 但是,亚马逊对ELB机器说:

注意:由于与LoadBalancer关联的一组IP地址可能会随时间而改变,因此您绝不应使用任何特定的IP地址创build“A”logging。 如果要为LoadBalancer使用友好的DNS名称而不是Elastic Load Balancing服务生成的名称,则应该为LoadBalancer DNS名称创buildCNAMElogging,或使用Amazon Route 53创build托pipe区域。 有关更多信息,请参阅使用具有Elastic Load Balancing的域名

但是,如果我需要inputIP地址,我不能使用CNAME(亚马逊或我自己的)。 有没有解决这个问题?

如果你能保证所有的请求都来自ELB(我不熟悉),你可以试试:

 real_ip_header X-Forwarded-For; set_real_ip_from 0.0.0.0/0; 

这应该告诉nginx相信任何人的X-Forwarded-For头。 缺点是,如果有人直接访问你的服务器,他们将能够欺骗一个X-Forwarded-For头,而nginx会使用错误的客户端IP地址。

今天的最佳做法是使用VPC,那么,您将知道ELB的确切CIDR。 然后,你可以添加这样的东西到你的Nginxconfiguration文件中:

 real_ip_header X-Forwarded-For; set_real_ip_from 10.0.0.0/8; 

使用VPC CIDR for set_real_ip_from您可以在VPC =>您的VPC(在此replace<your VPC CIDR here> )的亚马逊控制台中find它:

 real_ip_header X-Forwarded-For; set_real_ip_from <your VPC CIDR here>; 

在Amazon ELB上将可信范围设置为0.0.0.0/0肯定会让您陷入困境。 如果您可以为您的nginx服务器configuration安全组,则可以保证请求来自ELB,但原始请求将源自任何可能的源(Amazon ELB是公共接口)。

一个简单的testing将揭示这一点:

 curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/" 

你的nginx服务器上的日志将显示1.2.3.4为真实的IP,这是一个欺骗的。 有关更好的答案,请参阅Amazon ELB的内部专用IP的IP范围 。