Назад | Перейти на главную страницу

В Nginx заблокировать пользователя на основе значения заголовка X

У меня за балансировщиком нагрузки стоит 6 серверов Nginx. Конечно, если я просто попытаюсь «отказать» на основе IP-адреса, это не сработает, поскольку серверы приложений просто видят IP-адрес балансировщика нагрузки.

Однако я узнал о модуле Real IP, и я включил его следующим образом:

set_real_ip_from   0.0.0.0/0;
real_ip_header     X-Real-IP;

Итак, теперь, когда у меня правильно установлен заголовок X-Real_IP, как я могу затем настроить Nginx для использования блокировки определенных пользователей, у которых значение «X-Real-IP» равно набору IP-адресов?

Это легко. Модуль Nginx "geo" позволяет определить переменную, значение которой зависит от IP-адреса клиента:

geo $ban_ip {
  default 0;
  10.1.0.0/24 1;
};

geo директива должна быть в http уровень (например, снаружи server). Есть удобный способ включения больших баз IP-адресов через include или rangesсм. документация

Итак, если у вас есть такая переменная, вы можете вернуть любые коды состояния, которые захотите, например 403 или 404 (при server уровень или в location):

if ($ban_ip) {
  return 403;
}

Если вы хотите разорвать соединение без уведомления, используйте

if ($ban_ip) {
  return 444;
}

444 - это нестандартный код состояния, используемый внутри для указания Nginx разорвать соединение. (таким образом, клиент этого не видит)