我刚刚开始使用CloudFlare,但仍然存在获取CloudFlare代理IP地址而不是访问者地址的问题。 CloudFlare有很多solutions,但我还没有看到任何Rails。
我使用的是Rails 3.2.17。
如果我初始化ActionDispatch :: RemoteIp并将custom_proxies参数设置为包含所有CloudFlare's IP ranges的正确正则表达式(以及所有标准的本地和私有范围),它可能会解决我的问题
问题:
1)这是正确的做法吗?
CloudFlare有一大堆IP范围,所有这些都需要转换为正则表达式。这些范围可能会在未来发生变化,尽管CloudFlare表示他们不经常这样,而且我可能不知道它似乎有点脆弱。
2)如何使用custom_proxies参数初始化ActionDispatch :: RemoteIP?
答案 0 :(得分:5)
您可以使用the remote_ip_proxy_scrubber gem中的Rack中间件来确保您的Rails应用程序忽略来自可信代理服务器(如CloudFlare)的IP地址。
首先,将gem添加到Gemfile中,然后添加bundle install
gem 'remote_ip_proxy_scrubber'
现在您需要更新的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)
到目前为止,跟踪对CloudFlare IP列表的更改对我们公司来说并没有太大问题。
答案 1 :(得分:0)
由于Cloudflare遵循最佳做法并使用X-Forwarded-For
HTTP标头,因此您只需确保正确使用它。
特别是对于rails,已经多次询问过,例如What's the difference between request.remote_ip and request.ip in Rails?
答案 2 :(得分:0)
"这些范围可能会在未来发生变化,即使CloudFlare表示他们不经常这样做,"
更可能的是,我们会在现有范围中添加新范围(我们也不会长时间使用新的ips,以便人们可以适应新的范围)。
"由于Cloudflare遵循最佳实践,并使用X-Forwarded-For HTTP标头,因此您只需确保正确使用它。"
这也是正确的:)