Як знайти головну IP-адресу джерела DDoS у лог-файлі на 10 млн рядків у Linux

event 25.04.2026 23:34
| category System administration | person iron_will | comment 0 | visibility 9 | |

Вступ

Коли сервер потрапляє під DDoS-атаку, одним із перших завдань адміністратора є швидке визначення джерел аномального трафіку. На практиці це означає аналіз великих лог-файлів вебсервера, балансувальника, firewall або reverse proxy. Якщо файл містить 10 мільйонів рядків, ручний перегляд неможливий, а неправильний підхід може зайняти години та перевантажити систему.

Linux надає потужний набір консольних інструментів для обробки великих файлів: awk, grep, sort, uniq, sed, cut, zgrep, wc, head, tail. За правильного комбінування вони дозволяють знайти IP-адреси з найбільшою кількістю запитів за хвилини навіть без спеціалізованого SIEM-рішення.

У цій статті розглянемо, як ефективно проаналізувати лог на 10 млн рядків, знайти головний IP-адрес атакувальника, відрізнити реальний DDoS від ботів чи проксі, а також які дії виконати після виявлення джерела навантаження.

Що означає “головний IP” під час DDoS

Перш ніж починати пошук, важливо розуміти: у сучасному DDoS часто немає одного IP. Атака може надходити:

  • з ботнету (тисячі IP);
  • через проксі або VPN;
  • через CDN abuse;
  • з хмарних серверів;
  • через amplification-атаки.

Проте навіть у розподіленій атаці часто можна знайти:

  • IP з найбільшою кількістю запитів;
  • найбільш агресивний subnet;
  • ASN / провайдера з аномальною активністю;
  • повторювані User-Agent;
  • джерела 4xx / 5xx flood.

Тому завдання полягає не лише у пошуку одного IP, а у виявленні домінантних джерел навантаження.

Перевірка формату логів

Спочатку потрібно зрозуміти структуру файлу. Наприклад, стандартний nginx access.log:

192.168.1.10 - - [25/Apr/2026:12:15:44 +0300] "GET / HTTP/1.1" 200 512 "-" "curl/8.0"

Тут IP знаходиться в першому полі.

Для Apache Combined Log Format аналогічно.

Перевірити перші рядки:

head -5 access.log

Перевірити кількість рядків:

wc -l access.log

Найшвидший спосіб знайти топ IP

Якщо IP у першому полі:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20

Що робить команда

  • awk '{print $1}' - бере IP
  • sort - сортує
  • uniq -c - рахує повторення
  • sort -nr - сортує за кількістю
  • head -20 - показує топ-20

Приклад результату

154322 45.67.12.90  
99821 103.44.22.10  
84550 176.22.11.5

Перший IP - кандидат на головне джерело атаки.

Як працювати швидше з файлом 10 млн рядків

Використовуйте LC_ALL=C

LC_ALL=C awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

Це пришвидшує sort, бо вимикає locale-обробку.

Використовуйте тимчасовий каталог на SSD

sort -T /tmp

Повна команда:

awk '{print $1}' access.log | sort -T /tmp | uniq -c | sort -nr | head

Якщо лог стиснутий (.gz)

zcat access.log.gz | awk '{print $1}' | sort | uniq -c | sort -nr | head

Або:

zgrep "" access.log.gz | awk '{print $1}' | sort | uniq -c | sort -nr | head

Аналіз за часовими проміжками

DDoS часто має піки. Подивімося активність за хвилинами.

awk '{print $4}' access.log | cut -d: -f1,2,3 | sort | uniq -c | sort -nr | head

Приклад:

220000 [25/Apr/2026:12:15  
180000 [25/Apr/2026:12:16

Тепер аналізуємо лише цей період:

grep "25/Apr/2026:12:15" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

Це значно точніше.

Пошук IP з великою кількістю однотипних запитів

Наприклад flood на /login.

grep "/login" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

Flood XML-RPC:

grep "xmlrpc.php" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

WordPress атака:

grep "wp-login.php" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

Пошук ботів через User-Agent

Багато атак використовують однаковий агент.

awk -F\" '{print $6}' access.log | sort | uniq -c | sort -nr | head

Приклад:

800000 python-requests/2.31  
420000 curl/7.88

Тоді шукаємо IP:

grep "python-requests" access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head

Якщо використовується Cloudflare або Proxy

Реальний IP може бути не в першому полі, а в X-Forwarded-For.

Приклад лог-формату:

10.0.0.1 - - ... "GET ..." "..." "1.2.3.4"

Тоді треба дивитися останнє поле або окремий формат логування.

Приклад для custom log:

awk '{print $NF}' access.log

Або перевірити конфігурацію nginx:

cat /etc/nginx/nginx.conf

Шукайте:

$http_x_forwarded_for  
$remote_addr  
$realip_remote_addr

Реальний кейс: знайдено атакувальника за 2 хвилини

Лог: 11 млн рядків, сервер nginx, навантаження 100% CPU.

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

Результат:

3200000 185.220.101.45  
80000 91.22.15.8

Додатково:

grep "185.220.101.45" access.log | head
GET /wp-login.php  
GET /wp-login.php  
GET /wp-login.php

Висновок: brute-force + flood.

Блокування:

iptables -A INPUT -s 185.220.101.45 -j DROP

Як знайти мережу /24, а не один IP

Іноді атакують десятки IP з однієї підмережі.

awk '{print $1}' access.log | awk -F. '{print $1"."$2"."$3".0/24"}' | sort | uniq -c | sort -nr | head

Приклад:

900000 45.67.12.0/24

Це сильний індикатор координованої атаки.

Онлайн-блокування без перезавантаження

iptables

iptables -I INPUT -s 45.67.12.90 -j DROP

nftables

nft add rule inet filter input ip saddr 45.67.12.90 drop

fail2ban custom jail

Автоматизація блокування за кількістю запитів.

Як відрізнити легітимний трафік від атаки

Не кожен топ-IP є зловмисником.
Перевіряйте:

Нормальний трафік:

  • Googlebot
  • CDN ноди
  • корпоративний NAT
  • API клієнти
  • моніторинг

Підозрілий трафік:

  • тисячі GET за секунду
  • однаковий User-Agent
  • 404 flood
  • POST flood
  • brute force login
  • запити без referer
  • аномальна географія

Використання awk без sort для великих файлів

На дуже слабких серверах:

awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log | sort -nr | head

Перевага - менше дискових операцій.

Якщо логів кілька

cat access.log* | awk '{print $1}' | sort | uniq -c | sort -nr | head

Або:

zcat access.log*.gz | awk '{print $1}' | sort | uniq -c | sort -nr | head

Корисний Bash-скрипт для швидкого аналізу

#!/bin/bash
LOG=$1 echo "Top IP:" awk '{print $1}' $LOG | sort | uniq -c | sort -nr | head -10 echo "" echo "Top URLs:" awk '{print $7}' $LOG | sort | uniq -c | sort -nr | head -10

Запуск:

chmod +x ddos-check.sh  
./ddos-check.sh access.log

Що робити після виявлення джерела

Негайні дії

  1. Заблокувати IP / subnet.
  2. Увімкнути rate limiting.
  3. Увімкнути CDN/WAF.
  4. Перевірити навантаження CPU/RAM.
  5. Зберегти логи.

Далі

  • GeoIP блокування
  • Captcha для login
  • перенесення за reverse proxy
  • аналіз вразливих endpoint

Типові помилки адміністраторів

Блокують лише один IP

У DDoS джерел можуть бути тисячі.

Аналізують весь лог одразу

Краще брати часовий пік атаки.

Не дивляться URL

IP може бити лише /api/login.

Не дивляться proxy headers

Реальний IP може бути прихований.

Висновки

Якщо у вас лог-файл на 10 мільйонів рядків, Linux дозволяє швидко знайти головне джерело DDoS без дорогих систем моніторингу. Найефективніший базовий підхід:

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

Далі варто деталізувати аналіз за часом, endpoint, User-Agent та підмережами. У сучасних атаках важливо мислити ширше, ніж “один IP”. Часто вирішальним є виявлення шаблону поведінки, а не лише адреси.

Для production-середовища рекомендовано поєднувати консольний аналіз із WAF, rate limiting, fail2ban, SIEM та CDN-захистом.

Related posts

Диск заповнений після видалення файлів: причини та діагностика в Windows, Linux і контейнерах

Видалення великого файлу не завжди означає миттєве повернення вільного місця на диску. Багато користувачів стикаються з ситуацією, коли після видалення ISO-образу, резервної копії, логів або архіву на 50 ГБ система продовжує показувати той самий ріве...

category System administration person iron_will event 25/04/2026

Kubernetes: сучасна платформа оркестрації контейнерів для production-середовищ

Вступ Kubernetes став де-факто стандартом для запуску контейнеризованих застосунків у production-середовищах. Якщо Docker вирішив проблему пакування застосунку разом із залежностями, то Kubernetes вирішує значно складніше завдання - як масштабувати,...

category DevOps person iron_will event 19/04/2026

Файлові системи ext4, XFS, Btrfs - що обрати для production

Вступ Вибір файлової системи в Linux-середовищі - це не просто технічна деталь, а стратегічне рішення, яке безпосередньо впливає на продуктивність, надійність і масштабованість інфраструктури. У production-системах, де критичними є стабільність і пе...

category DevOps person iron_will event 14/04/2026

Zero Trust архітектура на практиці: принципи, впровадження та технічні кейси

Вступ Класичні моделі кібербезпеки, що базуються на периметрі мережі, давно втратили ефективність. Сучасні ІТ-інфраструктури характеризуються гібридністю, розподіленістю та активним використанням хмарних сервісів. У таких умовах концепція «довіряй,...

category Security person iron_will event 05/04/2026

Керування користувачами та правами доступу в Linux на enterprise-рівні

Вступ У сучасних корпоративних ІТ-інфраструктурах системи на базі Linux є критично важливими компонентами - від веб-серверів і контейнерних платформ до систем зберігання даних і DevOps-інструментів. У цьому контексті керування користувачами та права...

category Security person iron_will event 30/03/2026

Nmap: що це таке та як з ним працювати

Вступ У сучасному світі інформаційної безпеки та адміністрування мереж важливо мати інструменти, які дозволяють швидко отримувати інформацію про інфраструктуру, виявляти відкриті порти, служби та потенційні вразливості. Одним із найпотужніших і найп...

category Security person iron_will event 19/03/2026
cookie
This website uses cookies to improve your experience. Learn more