51111111111Rating 5.00 (2 Votes)
С какого-то времени стали сыпаться "кривые" запросы в 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)..."
Детальный анализ логов показал, что с разных рефереров сыпется перебор разного рода директорий, посидел, подумал и решил подобному спам "добру" отдавать пустые заголовки в виде HTTP 444. К слову сказать - большая часть из таких запросов сыпалась от интернет-провайдера, т.е. блокировать один IP или  целый диапазон, оказалось не вариантом. Часть запросов содержала рефереры в виде IP адресов, которые оказались из одного / нескольких диапазонов.

Просмотр рефереров из access логов Nginx

Адреса рефереров просматриваются и грепаются без труда, ну а с IP адресами пришлось повозиться. В итоге IP адреса можно грепунть командой в одну строку (спасибо @PacMans):
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
Добавляем туда найденное "добро" из логов:
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;
}
 Подключаем в конфиг сайта:
server {
  ...
  if ($bad_referer) {
    return 444;
  }
  ...
}
Перезапускаем nginx:
systemctl restart nginx
Проверяем:
curl --referer http://xxx.xxx.xx.x https://my-site
curl: (52) Empty reply from server
 

Добавить комментарий


Защитный код
Обновить

Сейчас 182 гостей и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз