使用 CloudFlare、Heroku 和 RoR 时如何设置真实 IP 地址?
Posted
技术标签:
【中文标题】使用 CloudFlare、Heroku 和 RoR 时如何设置真实 IP 地址?【英文标题】:How should I set the real IP address when using CloudFlare, Heroku, and RoR? 【发布时间】:2014-06-18 10:27:07 【问题描述】:我最近才开始使用 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?
【问题讨论】:
【参考方案1】:您可以使用来自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 列表的更改并没有太大问题。
-
作为 CloudFlare 客户,我们在他们最近添加的 IP 地址之前收到了一封来自 CloudFlare 的电子邮件
还有an IFTTT recipe,您可以在 CloudFlare 添加新 IP 地址时收到电子邮件通知。
【讨论】:
您好,感谢您解决此问题。我会看看你的宝石,如果我喜欢它,我会接受你的回答。我赞成它只是因为它是解决我的问题的唯一答案。看你的宝石可能需要我一点时间,但谢谢!【参考方案2】:由于 Cloudflare 遵守最佳实践,并使用 X-Forwarded-For
HTTP 标头,因此您只需确保正确使用它即可。
专门针对rails,这个已经问过好几次了,比如What's the difference between request.remote_ip and request.ip in Rails?
【讨论】:
抱歉在这里有点困惑。目前,对于 action_dispatch.remote_ip,我得到的值类似于 173.245.56.159,它在 CloudFlare 范围内。我认为使用 X-Forwarded-For 的正确方法是传入受信任的代理列表来初始化 RemoteIP,这样它就不会返回该范围内的地址。我在这里看到很多答案,建议只使用 X-Forwarded-For 中的第一个(或最后一个)值,但查看 remote_ip.rb 的代码会使您更容易受到 IP 欺骗。我是这个领域的新手,所以请纠正我的误解。谢谢! 你有没有为此想出一个有效的解决方案。目前遇到同样的问题。感谢您的帮助。【参考方案3】:“这些范围在未来可能会发生变化,尽管 CloudFlare 表示它们不会经常发生变化,”
更有可能的是,我们会在现有范围内添加新范围(我们也有一段时间不使用新 ip,以便人们可以适应新范围)。
“由于 Cloudflare 遵守最佳实践,并使用 X-Forwarded-For HTTP 标头,因此您只需确保正确使用它即可。”
这也是正确的:)
【讨论】:
即使您只是添加新范围,我仍然会开始从 CloudFlare 而不是从我的用户那里获取 IP。很难跟踪这样的事情。然而,这可能是最好的方法。这个问题的目的是找出如何正确使用 X-Forwarded-For。我已经搜索了一天的 ***,我发现了什么让我问了这个问题。如果 Rails 确实已经回答了这个问题,请告诉我,我很乐意将我的问题作为重复项删除。以上是关于使用 CloudFlare、Heroku 和 RoR 时如何设置真实 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章
Cloudflare 上的 Heroku 自定义域:重定向过多
在 Heroku 上托管时,Selenium 应用程序重定向到 Cloudflare 页面
Cloudflare 和 Chromedriver - cloudflare 区分 chromedriver 和正版 chrome?