soc*_*onk 6 ruby-on-rails ip-address ruby-on-rails-4
我的应用程序记录登录的每个用户的IP地址,但我注意到它记录了我们的负载均衡器的IP地址而不是实际的客户端IP.研究这个问题,我认为这是因为我们的负载均衡器使用可公开路由的IP地址,并且Rails忽略了X-Forwarded-For报头,假设它已被欺骗.解决方案似乎是将我们的负载均衡器使用的ip范围"白名单".
对于rails 4.1.x,我的问题是,我该怎么做呢?这就是我现在所拥有的config/environments/production.rb:
config.action_dispatch.custom_proxies = %r{
^100\.30 | # production environment load balancers
^200\.40 | # dev environment load balancers
}x
Run Code Online (Sandbox Code Playgroud)
我尝试将其格式化为remote_ip.rb中的TRUSTED_PROXIES,但它可能应该是字符串或数组,还是格式不同的正则表达式?任何有关细节的帮助都非常感谢.如果您可以建议在将来版本的rails中捕获此配置的集成测试,则可以获得奖励.:-)
UPDATE
我已经尝试了多种方法来更新它,并且使用了更多的成功config.action_dispatch.trusted_proxies.这样可以防止我的负载均衡器被记录,但会将所有IP地址记录为"127.0.0.1",无论它们是内部还是外部.在logs/unicorn.log中,ip地址以[外部地址,10.*地址,负载均衡器地址]的形式出现,所以我知道问题出在机架或rails层,而不是早期的apache或nginx.我还尝试用不包含10.*范围的列表替换TRUSTED_PROXIES常量(因为内部用户具有该范围),但没有明显的效果.
此时,对于任何具有来自非公共IP地址的真实用户的应用程序,或者具有带有外部IP地址的负载均衡器的网络环境中托管的任何应用程序,Rails 4.1.x似乎都会被破坏.
从Rails 4.2开始,您必须以不同的方式定义代理:
config.action_dispatch.trusted_proxies = %w(100.30.0.0/16 200.40.0.0/16).
map { |proxy| IPAddr.new(proxy) }
Run Code Online (Sandbox Code Playgroud)
参见https://github.com/rails/rails/issues/5223#issuecomment-199082324
您可以添加另一个配置选项config.action_dispatch.ip_spoofing_check,这样 Rails 就不会检查 IP 欺骗。
有关配置的Rails 指南和ActionDispatch::RemoteIp 模块中描述了该选项
| 归档时间: |
|
| 查看次数: |
3445 次 |
| 最近记录: |