У меня за балансировщиком нагрузки стоит 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 разорвать соединение. (таким образом, клиент этого не видит)
Есть Модуль стороннего брандмауэра приложений для nginx под названием naxsi, Я думаю, это могло бы решить проблему.