Анализ 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'