Я пытался ограничить запросы, поступающие с одного IP-адреса, успешно с модулем limit_req в Nginx. Но теперь я хочу перенаправить на другую веб-страницу для отображения некоторых сообщений. Как я могу это сделать? Похоже, Nginx просто поддерживает limit_req_status для изменения кода состояния ответа
Это просто. Я могу дать «альтернативный» ответ, если вы действительно хотите полностью заблокировать этого человека, а не показывать ему сообщение. (потому что с каких это пор боты читают сообщения)
Для меня я смотрю fail2ban /var/log/nginx/blocked.log поэтому вместо того, чтобы просто отображать код ошибки, давайте избавимся от них, как только они будут упомянуты в этом журнале.
Во-первых, определите страницу с ошибкой и сделайте так, чтобы любой / что-либо, обращающееся к этой странице с ошибкой, регистрировалось в нашем файле журнала "blocked.log" (и, следовательно, будет заблокировано).
Вставьте следующее в свой серверный блок {...}
error_page 577 /577.html;
location = /577.html {
access_log /var/log/nginx/blocked.log blocked;
}
Теперь убедитесь, что вы также определили этот «заблокированный» формат.
Вставьте эту строку в блок http {...}, обычно расположенный в /etc/nginx/nginx.conf
log_format blocked '$time_local Blocked request from $remote_addr $request';
Пока вы редактируете этот файл, вы также можете добавить следующую строку. Обратите внимание на зону.
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=1r/s;
В моем примере я хочу заблокировать ненужные повторные обращения к файлу WordPress wp-login.php. Итак, у меня в блоке сервера {...} есть следующее ..
location ~ [^/]\.php(/|$) {
try_files $uri* @fastcgi;
location ~* wp\-login\.php {
limit_req zone=wplogin burst=1 nodelay;
limit_req_status 577;
try_files $uri* @fastcgi;
}
}
location @fastcgi {
... stuff for making PHP happen ...
}
Бонус
Если у вас установлен fail2ban, добавьте следующий блок в файл conf в /etc/fail2ban/jail.d/
[nginx-blocked]
enabled = true
bantime = 600
maxretry = 3
backend = auto
findtime = 30
banaction = iptables-multiport
protocol = tcp
chain = INPUT
port = 80,443
filter = nginx-blocked
logpath = /var/log/nginx/blocked.log
а затем создайте /etc/fail2ban/filter.d/nginx-blocked.conf и вставьте следующий
[Definition]
failregex = ^.* Blocked request from <HOST>.*$
ignoreregex =
Надеюсь, это сработает для вас!