Thank you for reading this post, don't forget to subscribe!
стали сыпаться "кривые" запросы в nginx от разных рефереров, сам лог выглядел примерно так:
xxx.xxx.xx.x - "GET /webdb/ HTTP/1.1" 400 37 "http://xxx.xxx.xx.x/" "Mozilla/5.0 (Windows NT 5.1; rv:9.0.1)…"
xxx.xxx.xx.x - "GET /mysqladmin/ HTTP/1.1" 400 37 "http://xxx.xxx.xx.x/" "Mozilla/5.0 (Windows NT 5.1; rv:9.0.1)…"
xxx.xxx.xx.x - "GET /mysqladmin/ HTTP/1.1" 400 37 "http://xxx.xxx.xx.x/" "Mozilla/5.0 (Windows NT 5.1; rv:9.0.1)…"
Детальный анализ логов показал, что с разных рефереров сыпется перебор разного рода директорий,
решил подобному спам "добру" отдавать пустые заголовки в виде HTTP 444. К слову сказать - большая часть из таких запросов сыпалась от интернет-провайдера, т.е. блокировать один IP или целый диапазон, оказалось не вариантом. Часть запросов содержала рефереры в виде IP адресов, которые оказались из одного / нескольких диапазонов.
Просмотр рефереров из access логов Nginx
Адреса рефереров просматриваются и грепаются без труда, ну а с IP адресами пришлось повозиться. В итоге IP адреса можно грепунть командой в одну строку
zcat access.log.gz | grep -oE '400 37 '\"'http'\:''\//'\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b'\/'' | grep -oE '\b[0-9]{1,3}(\.[0-9]{1,3}){3}\b'
Создание black list'а рефереров для Nginx
Далее необходимо создать черный список рефереров:
nano /etc/nginx/conf.d/ref-bl.conf
Добавляем туда найденное "добро" из логов:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
map $http_referer $bad_referer { hostnames; default 0; # "~social-buttons.com" 1; "~referer1.com" 1; "~site1.com" 1; "~xxx.xxx.xx.x" 1; "~xxx.xxx.xx." 1; } |
Подключаем в конфиг сайта:
1 2 3 4 5 6 7 8 |
server { ... if ($bad_referer) { return 444; } ... } |
Перезапускаем nginx:
systemctl restart nginx
Проверяем:
1 2 |
curl --referer http://xxx.xxx.xx.x https://my-site curl: (52) Empty reply from server |