无法通过AWS负载均衡器获取真实的IP地址

时间:2015-04-09 19:03:14

标签: ruby-on-rails amazon-web-services http-headers google-chrome-devtools

我已经尝试了以下请求并将它们放入我的控制器中:

request.remote_ip 
request.env['HTTP_X_FORWARDED_FOR'] 
request.env['REMOTE_ADDR'] 

这些都给了我正确的访问者的IP地址:50.67.168.53 (指向位置:温哥华)

然而,当我在制作并检查网络下的chrome标题时,我得到了

  

远程地址:54.213.94.198:80(俄勒冈州)

Oregan是AWS负载均衡器的位置。

我的问题是,有没有办法让我的控制器或模型中的远程地址指向温哥华(相反或俄勒冈州)并确保它在通过负载均衡器后保持这种状态? 我需要IP地址来确定要插入mailchimp API的访问者的位置。

我阅读了以下文章,我理解发生了什么,但不知道如何实现这些变化:

https://serversforhackers.com/so-you-got-yourself-a-loadbalancer

1 个答案:

答案 0 :(得分:0)

我在带有ELB的AWS上部署了nginx后面的rails 3.2应用程序,这段代码适用于我:

def parse_ip
  # string of comma separated list of ip addresses
  # first one is the outer most address
  # other may be load balancers, routers, etc ...
  # example: '195.168.122.106, 172.31.19.59'
  ips = request.env['HTTP_X_FORWARDED_FOR']
  return ips.split(',').first if ips
  # fall back
  request.remote_ip
end

在位置块中使用ngnix配置:

location @thin_cluster
  {
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    ...
}