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

dmt*_*989 5 ip-address cloudflare rackattack

Rails app,使用Kickstarter的机架攻击

在我的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
Run Code Online (Sandbox Code Playgroud)

这一直很好,直到我开始使用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
Run Code Online (Sandbox Code Playgroud)

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

Ald*_*ein 5

尝试添加:

class Rack::Attack::Request < ::Rack::Request
  def cf_ip
    @env['HTTP_CF_CONNECTING_IP'] ? @env['HTTP_CF_CONNECTING_IP'] : ip
  end
end
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

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