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

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

Вступ

Коли сервер потрапляє під 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

Мережеві порти: що це таке, які вони бувають, навіщо потрібні та які мають обмеження

Вступ Сучасні комп'ютерні мережі побудовані на принципі одночасної роботи великої кількості сервісів та застосунків. Вебсервери, поштові системи, бази даних, VPN-рішення, системи моніторингу та корпоративні сервіси використовують одну й ту саму мере...

category Network person iron_will event 05/06/2026

Robocopy: можливості та переваги перед звичайним Copy/Xcopy

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

category DevOps person iron_will event 28/05/2026

VPN, SSH та базова безпека інфраструктури

Вступ Сучасна IT-інфраструктура функціонує в умовах постійного зовнішнього впливу: сканування портів, автоматизовані брутфорс-атаки, експлуатація вразливостей сервісів та цільові кібератаки. Навіть невеликі системи без належного захисту можуть стати...

category Security person iron_will event 26/05/2026

Kubernetes для новачків: базові концепції

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

category Kubernetes person iron_will event 17/05/2026

Що таке RAID: рівні RAID, принцип роботи та навіщо він потрібен

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

category System administration person iron_will event 10/05/2026

Docker: як оптимізувати розмір контейнера з 50 ГБ до керованого рівня

Вступ Контейнери давно стали стандартом де-факто для доставки застосунків у production. Проте з ростом складності систем часто виникає нетривіальна проблема - неконтрольоване збільшення розміру Docker-образів. Сценарій, коли образ досягає 30–50 ГБ,...

category DevOps person iron_will event 06/05/2026
cookie
This website uses cookies to improve your experience. Learn more