使用CloudFlare,Heroku和RoR时,如何设置真实IP地址?

use*_*983 4 ip ruby-on-rails heroku cloudflare

我刚刚开始使用CloudFlare,但仍然存在获取CloudFlare代理IP地址而不是访问者地址的问题.CloudFlare有很多解决方案,但我没有看到任何Rails.

我正在使用Rails 3.2.17.

看起来如果我将custom_proxies参数设置为包含所有CloudFlare的IP范围(以及所有标准本地和私有范围)的正确正则表达式初始化ActionDispatch :: RemoteIp ,它可能会解决我的问题.

问题:

1)这是正确的方法吗?

CloudFlare有一大堆IP范围,所有这些都需要转换为正则表达式.这些范围可能会在未来发生变化,即使CloudFlare说它们并不常见,而且我可能不知道它似乎有点脆弱.

2)如何使用custom_proxies参数初始化ActionDispatch :: RemoteIP?

met*_*ida 5

您可以使用remote_ip_proxy_scrubber gem中的Rack中间件来确保您的Rails应用程序忽略来自可信代理服务器(如CloudFlare)的IP地址.

首先,将gem添加到Gemfile然后 bundle install

gem 'remote_ip_proxy_scrubber'
Run Code Online (Sandbox Code Playgroud)

现在您需要更新的CloudFlare IP地址列表:https://www.cloudflare.com/ips-v4

使用CloudFlare IP列表,将以下内容添加到config/application.rb或conifg/environments/*.rb

# Make sure CloudFlare IP addresses are
# removed from the X-Forwarded-For header
# before our app sees them
config.middleware.insert_before(Rails::Rack::Logger,
   RemoteIpProxyScrubber.filter_middleware, 
   %w{
     199.27.128.0/21
     173.245.48.0/20
     103.21.244.0/22
     103.22.200.0/22
     103.31.4.0/22
     141.101.64.0/18
     108.162.192.0/18
     190.93.240.0/20
     188.114.96.0/20
     197.234.240.0/22
     198.41.128.0/17
     162.158.0.0/15
     104.16.0.0/12
     172.64.0.0/13
  })

# Make sure the customer's real IP address (remote_ip)
# is used in our Rails logs.
config.middleware.insert_before(Rails::Rack::Logger, RemoteIpProxyScrubber.patched_logger)
config.middleware.delete(Rails::Rack::Logger)
Run Code Online (Sandbox Code Playgroud)

到目前为止,跟踪对CloudFlare IP列表的更改对我们公司来说并没有太大问题.

  1. 作为CloudFlare客户,我们在收到CloudFlare最新添加的IP地址之前收到了一封电子邮件
  2. 还有一个IFTTT配方,你可以用它来获得电子邮件通知时的CloudFlare增加了新的IP地址.


Yuv*_*dam -1

由于 Cloudflare 遵守最佳实践并使用X-Forwarded-ForHTTP 标头,因此您只需确保正确使用它即可。

特别是对于rails,这个问题已经被问过好几次了,例如What's the Difference between request.remote_ip and request.ip in Rails?