【问题标题】:How should I set the real IP address when using CloudFlare, Heroku, and RoR?使用 CloudFlare、Heroku 和 RoR 时如何设置真实 IP 地址?
【发布时间】: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?

【问题讨论】:

    标签: ruby-on-rails heroku ip cloudflare


    【解决方案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 列表的更改并没有太大问题。

    1. 作为 CloudFlare 客户,我们在他们最近添加的 IP 地址之前收到了一封来自 CloudFlare 的电子邮件
    2. 还有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。我已经搜索了一天的 stackoverflow,我发现了什么让我问了这个问题。如果 Rails 确实已经回答了这个问题,请告诉我,我很乐意将我的问题作为重复项删除。
    猜你喜欢
    • 2019-02-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    相关资源
    最近更新 更多