确定Amazon ELB背后的客户端的IP地址

Bil*_*mus 17 locale load-balancing amazon-web-services

我们在ELB后面的EC2上有一些PHP服务器.我们希望通过连接到我们服务器的客户端的IP地址来确定区域设置/区域.问题是PHP服务器只能看到ELB的IP地址.我们希望看到通过ELB传递的客户端的IP地址.

Rya*_*eir 22

根据AWS文档,ELB应该设置'X-Forwarded-For'HTTP头,它保留原始客户端IP地址:

X-Forwarded-For请求标头可帮助您识别客户端的IP地址.由于负载均衡器拦截客户端和服务器之间的流量,因此服务器访问日志仅包含负载均衡器的IP地址.要查看客户端的IP地址,请使用X-Forwarded-For请求标头.

您可以使用以下PHP代码访问它(假设apache):

$http_headers = apache_request_headers(); 
$original_ip = $http_headers["X-Forwarded-For"];
Run Code Online (Sandbox Code Playgroud)

  • 如果您关心安全性,则应该阻止除了ELB之外的任何连接到您的Web服务器.否则,攻击者可以伪装成ELB,设置此标头,并向您说谎真正的远程IP地址.http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-elb-security-groups.html (4认同)
  • 如果客户端提供了自己的X-Forwarded-For,它将是提供给您的应用程序的逗号分隔的IP列表中的第一个.显然,真正的IP始终是最后一项. (4认同)
  • 请注意,如果有多个转发器,则X-Forwarded-For标头可以包含以逗号分隔的IP地址列表.第一个是原始客户端IP.http://en.wikipedia.org/wiki/X-Forwarded-For#Format (3认同)

Mar*_*els 9

如果您使用Apache,请查看mod_remoteip模块.它包含在Apache 2.4及更新版本中,但也可以找到2.2的后端端口.

该模块将使用RemoteIPHeader指令配置的请求标头中报告的用户IP地址覆盖连接的客户端IP地址.

按照指示更换后,这个被覆盖的useragent IP地址随后用于mod_authz_host Require ip功能,由mod_status报告,并由mod_log_config%a和core%a格式字符串记录.连接的基础客户端IP以%{c} a格式字符串形式提供.

换句话说,您可以设置要使用的标头(例如X-Forwarded-For)以及哪些IP是可信的(例如您的负载均衡器).从标头中删除可信IP,并将第一个不受信任的IP用作始发客户端.然后,Apache在其他模块中内部使用此IP,例如用于日志记录,主机身份验证等.

这使它比仅处理PHP中的XFF头更有用,因为mod_remoteip负责整个堆栈,确保访问日志正确等等.

注意:还有一个mod_rpaf模块,它是这个模块的前身.它更有限.例如,它无法处理可信的ip范围.你需要这个,因为你事先不知道ELB的IP.它也无法在Apache之前处理多个跃点,例如Varnish之前的ELB.我建议跳过rpaf模块并改用remoteip.