Як знайти головну IP-адресу джерела DDoS у лог-файлі на 10 млн рядків у Linux
Вступ
Коли сервер потрапляє під 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}'- бере IPsort- сортує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
Що робити після виявлення джерела
Негайні дії
- Заблокувати IP / subnet.
- Увімкнути rate limiting.
- Увімкнути CDN/WAF.
- Перевірити навантаження CPU/RAM.
- Зберегти логи.
Далі
- 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-захистом.