ограничение скорости 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 .
Это перезапишет переменные удаленного адреса по адресу, указанному в пользовательском заголовке, а также облегчит ведение журналов и других переменных.

Lukas
источник
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