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
Я надеюсь, что это помогает.