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

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

Вступ

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

Небезпечні Linux-команди, які можуть зламати систему

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

category System administration person iron_will event 14/07/2026

Коди подій Windows: як визначити, хто встановив або видалив програму

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

category System administration person iron_will event 11/07/2026

PowerShell і BITS: ефективне копіювання та завантаження великих файлів

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

category System administration person iron_will event 20/06/2026

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

Вступ Сучасні комп'ютерні мережі побудовані на принципі одночасної роботи великої кількості сервісів та застосунків. Вебсервери, поштові системи, бази даних, 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
cookie
This website uses cookies to improve your experience. Learn more
dangerous
warning