Skip to content

Анализ IP-адресов из логов веб-сервера и выявление топ-источников трафика

Логи веб-сервера содержат огромное количество информации о посещениях сайта: кто обратился к серверу, какой URL был запрошен, статус ответа, время запроса и многое другое. Одной из распространённых задач при анализе таких логов является определение источников трафика — например, чтобы выявить пользователей или ботов, которые чаще всего обращаются к вашему сайту.

В этой статье мы разберём следующую команду:

cat /var/www/httpd-logs/*.access.log | awk '{print $1}' | awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}' | sort | uniq -c | sort -n

Эта цепочка команд позволяет извлечь список подсетей /24, откуда поступали запросы к веб-серверу, и показать, сколько запросов было сделано с каждой из них.


Пошаговое объяснение команды

1. cat /var/www/httpd-logs/*.access.log

Команда cat выводит содержимое всех файлов, подходящих под маску /var/www/httpd-logs/*.access.log. Это обычно логи доступа (access logs) веб-сервера Apache или Nginx.

Пример строки лога:

192.168.1.100 - - [10/Aug/2024:12:34:56 +0300] "GET /index.html HTTP/1.1" 200 1024 "-" "Mozilla/5.0"

2. awk '{print $1}'

Первое поле ($1) в строке лога обычно содержит IP-адрес клиента, который сделал запрос. Эта команда извлекает только IP-адреса.

Результат после этой части:

192.168.1.100
192.168.1.101
192.168.2.50

3. awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}'

Эта часть преобразует IP-адрес в обозначение подсети класса /24 (то есть группирует запросы по подсетям). Для этого используется точка как разделитель (-F '.'), а затем формируется строка вида X.X.X.0/24.

Пример:

192.168.1.100 → 192.168.1.0/24
192.168.1.101 → 192.168.1.0/24
192.168.2.50 → 192.168.2.0/24

Такой подход удобен для анализа активности не конкретных IP, а целых блоков адресов, например, чтобы понять, какие провайдеры или регионы генерируют больше всего трафика.


4. sort

Сортирует список подсетей. Это необходимо для корректной работы следующей команды uniq.


5. uniq -c

Подсчитывает, сколько раз встречается каждая уникальная запись (в данном случае — подсеть /24). То есть показывает, сколько запросов было сделано с каждой подсети.

Результат:

   123 192.168.1.0/24
    45 192.168.2.0/24

6. sort -n

Финальный шаг — сортировка результатов по возрастанию числа запросов. Таким образом, в самом низу будут самые «горячие» подсети — те, откуда пришло больше всего запросов.


Пример финального вывода

     2 192.168.10.0/24
     7 192.168.5.0/24
    15 192.168.3.0/24
   123 192.168.1.0/24

Где это может пригодиться?

  • Анализ трафика: Выявление источников основного трафика.
  • Безопасность: Обнаружение возможных DDoS-атак или массовых сканирований с одной подсети.
  • Оптимизация CDN: Понимание, какие регионы или провайдеры чаще всего обращаются к вашему сайту.
  • Мониторинг ботов: Если с какой-то подсети идёт большое количество автоматических запросов, можно рассмотреть возможность блокировки.

Возможные модификации

  • Поиск по конкретным датам: Добавьте фильтрацию по дате с помощью grep перед началом обработки.

  • Вывод в файл: bash cat /var/www/httpd-logs/*.access.log | awk '{print $1}' | awk -F '.' '{print $1 "." $2 "." $3 ".0/24"}' | sort | uniq -c | sort -n > traffic_by_subnet.txt

  • Фильтрация по количеству запросов: Например, показать только подсети, с которых более 100 запросов: bash ... | awk '$1 > 100'