В 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, я думаю, что он мог бы решить проблему.