Как регистрировать реальный ip-адрес клиента в журнале rails, когда за прокси-сервером, таким как nginx
5 ответов
на мой взгляд, ваш текущий подход является единственным вменяемым. Единственный отсутствующий шаг-перезапись IP-адреса в env
.
типичный REMOTE_ADDR редко содержит правильный IP-адрес, если у вас есть какое-либо количество слоев прокси и балансировщиков нагрузки, а что нет-вы не уникальны в этом отношении. Каждый потенциально добавляет или изменяет удаленные заголовки, связанные с IP. И вы не можете предположить, что каждое из этих полей обязательно соответствует одному IP-адресу. Некоторые push и unshift по вместо IP в список.
есть только один способ узнать наверняка, какое поле имеет правильное значение и как, и это нырнуть туда и посмотреть. Очевидно, вы уже это сделали. Теперь просто перепишите env['REMOTE_ADDR']
С правильным значением, используя свой "прослойки" Rack. Нет смысла позволять любому фрагменту кода, который вы не записали в журнал или не обработали неправильный IP-адрес, как это происходит сейчас.
(это Рубин, вы также можете обезьяна патч Стойка:: запрос, конечно...)
для красочного чтения, иллюстрирующего различные степени, в которых экзотические настройки могут испортить попытки найти реальный IP-адрес клиента, см., например, бесконечные обсуждения, которые произошли об этом для WordPress:
- https://core.trac.wordpress.org/ticket/9235
- https://core.trac.wordpress.org/ticket/4198
- https://core.trac.wordpress.org/ticket/4602
это 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