Rails использует черный список IP-атак на стойку кикстартера с Cloudflare

Приложение Rails, использующее стойку 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

Это работало нормально, пока я не начал использовать CloudFlare. Req.ip теперь IP-адрес Cloudflare против фактического IP-адреса конечного пользователя

У меня была похожая проблема при попытке сохранить IP-адрес пользователя в журналах сервера (при сохранении IP-адресов Cloudflare). Чтобы это исправить, я добавил в свой контроллер приложений следующее:

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 ответа

Попробуйте добавить:

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

Если вы хотите решить проблему как на 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

Я надеюсь, что это помогает.

Другие вопросы по тегам