![Nginx set_real_ip_from AWS ELB 负载均衡器地址](https://linux22.com/image/567564/Nginx%20set_real_ip_from%20AWS%20ELB%20%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%99%A8%E5%9C%B0%E5%9D%80.png)
我在 Amazon ELB 负载均衡器后面有一组 Nginx 服务器。我使用 set_real_ip(来自HttpRealIp模块)以便我可以访问这些服务器上的原始客户端 IP 地址(用于传递给 php-fpm 并在HttpGeoIP模块)。
似乎set_real_ip_from
在 nginx 配置中只能接受 IP 地址。但是,对于 ELB 机器,Amazon 表示:
注意:由于与 LoadBalancer 关联的 IP 地址集会随时间而变化,因此您永远不应使用任何特定 IP 地址创建“A”记录。如果您想为 LoadBalancer 使用友好的 DNS 名称,而不是 Elastic Load Balancing 服务生成的名称,则应为 LoadBalancer DNS 名称创建 CNAME 记录,或使用 Amazon Route 53 创建托管区域。有关更多信息,请参阅将域名与 Elastic Load Balancing 结合使用
但是如果我需要输入 IP 地址,我就不能使用 CNAME(无论是亚马逊的还是我自己的)。有办法解决这个问题吗?
答案1
如果您可以保证所有请求都来自 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 地址。
答案2
今天的最佳实践是使用 VPC,因此,您将知道 ELB 的确切 CIDR。然后,您可以将以下内容添加到 Nginx 配置文件中:
real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
答案3
使用 VPC CIDR,您可以在 Amazon 控制台下的 VPC => 您的 VPC(用它set_real_ip_from
替换)中找到它:<your VPC CIDR here>
real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;
答案4
在 Amazon ELB 上将受信任范围设置为 0.0.0.0/0 肯定会给您带来麻烦。如果您可以为 nginx 服务器配置安全组,则可以保证请求来自 ELB,但原来的请求将来自任何可能的来源(Amazon ELB 是公共接口)。
一个简单的测试就能揭示这一点:
curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"
然后,nginx 服务器上的日志将显示 1.2.3.4 作为真实 IP,这是一个欺骗性的 IP。请参阅Amazon ELB 内部私有 IP 的 IP 范围以获得更好的答案。