【问题标题】:Rails using kickstarter rack-attack IP blacklisting with CloudflareRails 使用带有 Cloudflare 的 kickstarter 机架攻击 IP 黑名单
【发布时间】:2014-08-14 02:45:56
【问题描述】:

Rails 应用,使用 Kickstarter 的 rack-attack

在我的 config/rack-attack.rb 文件中,我有:

class Rack::Attack
  Rack::Attack.blacklist ('block ip') do |req|
    # Request are blocked if the return value is truthy
    '68.888.23.22' == req.ip
    # req.ip if IPCat.datacenter?(req.ip)
  end
end

在我开始使用 CloudFlare 之前,它运行良好。 req.ip 现在是 Cloudflare IP 与实际最终用户的 IP

我在尝试将用户的 IP 保存到我的服务器日志(正在保存 Cloudflare IP)时遇到了类似的问题。为了解决这个问题,我在我的应用程序控制器中添加了以下内容:

module ActionDispatch
  class Request < Rack::Request
    alias :remote_ip_orig :remote_ip
    def remote_ip
      @remote_ip ||= (@env['HTTP_CF_CONNECTING_IP'] || remote_ip_orig)
    end
  end
end

是否有类似的过程可以在 rack-attack 中使用 HTTP_CF_CONNECTING_IP 作为 req.ip?

【问题讨论】:

  • 在这里找到解决方案?
  • 我没有。最终只是在 Cloudflare 设置中手动将 IP 列入黑名单。对不起。

标签: ip-address cloudflare rackattack


【解决方案1】:

尝试添加:

class Rack::Attack::Request < ::Rack::Request
  def cf_ip
    @env['HTTP_CF_CONNECTING_IP'] ? @env['HTTP_CF_CONNECTING_IP'] : ip
  end
end

那么你可以使用:

throttle('req/ip', :limit => 300, :period => 5.minutes) do |req|
  req.cf_ip
end

【讨论】:

    【解决方案2】:

    如果您想同时解决 ActionPackRack::Attack::Request 的问题,您可以这样做:

    module ActionPack
      module Cloudflare
        module Request
    
          def remote_ip
            remote_ip_cloudflare || super
          end
    
          private
    
          def remote_ip_cloudflare
            @env['HTTP_CF_CONNECTING_IP']
          end
    
        end
      end
    end
    
    ActionDispatch::Request.class_eval do
      prepend ActionPack::Cloudflare::Request
    end
    
    Rack::Attack::Request.class_eval do
      prepend ActionPack::Cloudflare::Request
    end
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多