Rails使用kickstarter机架攻击IP黑名单与Cloudflare

时间:2014-08-14 02:45:56

标签: ip-address cloudflare rackattack

Rails app,使用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 vs实际最终用户的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

在机架攻击中使用HTTP_CF_CONNECTING_IP作为req.ip是否有类似的过程?

2 个答案:

答案 0 :(得分:4)

尝试添加:

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

答案 1 :(得分:0)

如果你想在 ActionPack Rack :: 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

我希望它有所帮助。