Пара полезных команд, которые могут пригодиться при DDoS и не только

в 19:38, , рубрики: ddos-атака, ddos-защита, grep, linux, logtop, информационная безопасность, ит-инфраструктура

В моем случае, в качестве frontend сервера, стоит nginx и формат access-лога имеет вид:

log_format main '$remote_addr — $remote_user [$time_local] "$host" "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" -> $upstream_response_time';

Что на выходе дает что-то вроде такой строки:

188.142.8.61 — - [14/Sep/2014:22:51:03 +0400] «www.mysite.ru» «GET / HTTP/1.1» 200 519 «6wwro6rq35muk.ru/» «Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.191602; .NET CLR 3.5.191602; .NET CLR 3.0.191602» "-" -> 0.003

1. tail -f /var/log/nginx/nginx.access.log | cut -d ' ' -f 1 | logtop

Позволяет получить общую картину: распределение уникальных IP, с которых идут запросы, кол-во запросов с одного IP и т.д.
Самое ценное — что все это работает в режиме реального времени и можно мониторить ситуацию, внося какие-либо изменения в конфигурацию (например просто забанить ТОП 20 самых активных IP через iptables или временно ограничить географию запросов в nginx через GeoIP http://nginx.org/ru/docs/http/ngx_http_geoip_module.html).

Покажет (и будет обновляться в режиме реального времени) что-то вроде:

3199 elements in 27 seconds (118.48 elements/s)
1 337 12.48/s 95.65.66.183
2 308 11.41/s 122.29.177.10
3 304 11.26/s 122.18.251.54
4 284 10.52/s 92.98.80.164
5 275 10.19/s 188.239.14.134
6 275 10.19/s 201.87.32.17
7 270 10.00/s 112.185.132.118
8 230 8.52/s 200.77.195.44
9 182 6.74/s 177.35.100.49
10 172 6.37/s 177.34.181.245

Где в данном случае колонки означают:

  • 1 — порядковый номер
  • 2 — количество запросов с данного IP
  • 3 — количество запросов в секунду с данного IP
  • 4 — собственно сам IP

Вверху показывается суммарная статистика по всем запросам

В данном случае мы видим, что с IP 95.65.66.183 идет 12,48 запросов/секунду и за последние 27 секунд было сделано 337 запросов. По остальным строкам аналогично.

Разберем по частям:
tail -f /var/log/nginx/nginx.access.log — в непрерывном режиме считываем конец лог-файла

cut -d ' ' -f 1 — разделяем строку на «подстроки» разделителем, указанным в флаге -d. (в данном примере указан пробел).
Флаг -f 1 — показываем только поле с порядковым номером «1» (в данном случае это поле будет содержать IP, с которого идет запрос)

logtop — считает количество одинаковых строк (в данном случае IP), сортирует их в порядке убывания и выводит списком, попутно добавляя статистику (в Debian ставится через aptitude из стандартного репозитория).

2. grep "&key=" /var/log/nginx/nginx.access.log | cut -d ' ' -f 1 | sort | uniq -c | sort -n | tail -n 30 — покажет распределение какой-либо строки по IP в логе.

В моем случае мне нужно было собрать статистику как часто один IP использует в запросе параметр &key=….

Покажет что-то вроде такого:

31 66.249.69.246
47 66.249.69.15
51 66.249.69.46
53 66.249.69.30
803 66.249.64.33
822 66.249.64.25
912 66.249.64.29
1856 66.249.64.90
1867 66.249.64.82
1878 66.249.64.86

  • 1 — число вхождений строки (в данном случае IP)
  • 2 — собственно сам IP

В данном случае мы видим, что с IP 66.249.64.86 суммарно пришло 1878 запросов (и потом, если посмотрим в Whois — увидим что этот IP принадлежит Google и не является «зловредным»)

Разберем по частям:

grep "&key=" /var/log/nginx/nginx.access.log — находим все строки в логе, содержащие подстроку "&key=" (не важно в какой части строки)
cut -d ' ' -f 1 — (см. предыдущий пример), выведем IP
sort — отсортируем строки (нужно для корректной работы следующей команды)
uniq -c — покажем уникальные строки + подсчитаем количествово вхождений этих строк (флаг -с)
sort -n — отсортируем используя числовой режим сортировки (флаг -n)
tail -n 30 — выведем 30 строк с наибольшим количеством вхождений (флаг -n 30, можно указать произвольное число строк)

Все запросы выше приведены для Debian или Ubuntu, но думаю в других Linux дистрибутивах команды будут иметь похожий вид.

Автор: DVLev

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js