В 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-адресов?

2 ответа

Решение

Это легко. Модуль "Geo" Nginx позволяет определить переменную со значением в зависимости от 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 команду разорвать соединение. (при этом клиент этого не видит)

Существует сторонний модуль Application Firewall для nginx под названием naxsi, я думаю, что он мог бы решить проблему.

Другие вопросы по тегам