ограничение скорости nginx с заголовком X-Forwarded-For


23

Я смотрю на ограничение скорости с помощью HttpLimitReqModule от nginx . Однако все запросы поступают с одного IP-адреса (балансировщик нагрузки) с реальным IP-адресом в заголовках.

Есть ли способ иметь ограничение скорости nginx на основе ip в X-Forwarded-Forзаголовке вместо ip источника?

Ответы:


28

Да, типичная строка определения конфигурации ограничения скорости выглядит следующим образом:

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;

где $binary_remote_addrуникальный ключ для лимитера. Вы должны попробовать изменить его на $http_x_forwarded_forпеременную, которая получает значение X-Forwarded-Forзаголовка. Хотя это увеличит потребление памяти, поскольку $binary_remote_addrиспользует сжатый двоичный формат для хранения IP-адресов, а $http_x_forwarded_forэто не так.

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;

Я просто пришел к такому же выводу, и в быстром тесте все работает отлично. Спасибо за указание на увеличение использования памяти.
Джон Броди

2
Осторожно, здесь могут быть серьезные проблемы безопасности: blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell,

Обратите внимание, что информация в этом сообщении о symfony была адресована следующим образом: symfony.com/doc/current/components/http_foundation/…
calumbrodie

5
Если вы используете модуль realip, $binary_remote_addrпеременная будет установлена ​​правильно.
Дженк Алти

5

limit_req_zoneДиректива определяет переменную , которая будет использоваться в качестве ключа для запроса группировки.
Обычно $binary_remote_addrиспользуется, а не $remote_addrпотому, что он меньше и экономит место.

Возможно, вы хотите использовать RealipModule .
Это перезапишет переменные удаленного адреса по адресу, указанному в пользовательском заголовке, а также облегчит ведение журналов и других переменных.


1
+1 за модуль RealIP. При использовании этого модуля $binary_remote_addrи $remote_addrобычно задается значение вашего настроенного заголовка, X-Forwarded-Forпоэтому ваши стандартные переменные теперь являются «реальным IP-адресом клиента». Запустите, nginx -Vчтобы увидеть, был ли построен NGINX --with-http_realip. Тогда конфигурация так же проста, как:, set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; где диапазон CIDR - это диапазон вашего восходящего балансировщика нагрузки, который устанавливает X-Forwarder-Forзаголовок.
markdsievers
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.