Как регистрировать реальный ip-адрес клиента в журнале rails, когда за прокси-сервером, таким как nginx

5 ответов


на мой взгляд, ваш текущий подход является единственным вменяемым. Единственный отсутствующий шаг-перезапись IP-адреса в env.

типичный REMOTE_ADDR редко содержит правильный IP-адрес, если у вас есть какое-либо количество слоев прокси и балансировщиков нагрузки, а что нет-вы не уникальны в этом отношении. Каждый потенциально добавляет или изменяет удаленные заголовки, связанные с IP. И вы не можете предположить, что каждое из этих полей обязательно соответствует одному IP-адресу. Некоторые push и unshift по вместо IP в список.

есть только один способ узнать наверняка, какое поле имеет правильное значение и как, и это нырнуть туда и посмотреть. Очевидно, вы уже это сделали. Теперь просто перепишите env['REMOTE_ADDR'] С правильным значением, используя свой "прослойки" Rack. Нет смысла позволять любому фрагменту кода, который вы не записали в журнал или не обработали неправильный IP-адрес, как это происходит сейчас.

(это Рубин, вы также можете обезьяна патч Стойка:: запрос, конечно...)

для красочного чтения, иллюстрирующего различные степени, в которых экзотические настройки могут испортить попытки найти реальный IP-адрес клиента, см., например, бесконечные обсуждения, которые произошли об этом для WordPress:

это PHP, но суть поднятых точек одинаково хорошо применима к Ruby. (Обратите внимание, что они неразрешены, когда я пишу это, и что они были вокруг в течение эонов.)


Это, казалось, сделать трюк для меня. (установить в конфигурации nginx)

   proxy_set_header CLIENT_IP $remote_addr;

я столкнулся с той же проблемой, что подмножество наших веб-клиентов получают доступ к нашему приложению rails на (Rails 4.2.7) в нашей частной сети, и мы получаем неправильный IP-адрес. Поэтому я решил добавить то, что помогло нам решить проблему.

нашел рельсы выпуск 5223 что обеспечило лучшее решение, чем двойная регистрация ИП как вопрос. Итак, мы monkey patch Rack удалим частную сеть из списка доверенных прокси-серверов, таких как Итак:

module Rack
  class Request
    def trusted_proxy?(ip)
      ip =~ /^127\.0\.0\.1$/
    end
  end
end

, который обращается к контроллеру, регистрирующему неправильный IP, другая половина исправления, чтобы гарантировать, что request.remote_ip обрабатывается правильно. Для этого добавьте следующее в свою конфигурацию / среды / производство.rb:

config.action_dispatch.trusted_proxies = [IPAddr.new('127.0.0.1')] 

я столкнулся с той же проблемой. Чтобы исправить это, я сослался на вашу реализацию, чуть ниже строки в config/application.rb исправлено.

config.middleware.insert_before Rails::Rack::Logger, 'RemoteIpLogger'

нет необходимости писать дополнительные регистраторы вы увидите фактический IP-адрес клиента в первой строке.

Started GET "/" for 10.0.10.62 at 2013-11-22 08:01:17 +0000

и app\middleware\remote_ip_logger.rb. Мой HTTP_X_FORWARDED_FOR имеет список IPs, и первый из них является фактическим IP-адресом клиента.

class RemoteIpLogger
  def initialize(app)
    @app = app
  end

  def call(env)
    if env["HTTP_X_FORWARDED_FOR"]
      remote_ip = env["HTTP_X_FORWARDED_FOR"].split(",")[0]
      env['REMOTE_ADDR'] = env["action_dispatch.remote_ip"] = env["HTTP_X_FORWARDED_FOR"] = remote_ip
      @app.call(env)
    else
      @app.call(env)
    end
  end
end

коротко и просто :

request.remote_ip