Анализ наличия DDoS-атаки с помощью tcpdump

Защита от DDoS с помощью утилиты tcpdump

tcpdump — это мощнейшая утилита UNIX, позволяющая перехватывать и анализировать сетевой трафик, проходящий через сетевые интерфейсы. Об установке читайте в документации утилиты или на сайте разработчика, в FreeBSD она есть в портах, в Debian Linux в репозиториях.

Приведу пример как можно использовать tcpdump. Например, на сервере отключены логи, идет легкая ddos атака, происходит что-то не ладное, вы хотите быстро посмотреть масштабность или убедиться, что это DDoS-атака, а не DoS или может это вообще никак не связано с внешним миром? Давайте посмотрим:

tcpdump -v -i eth0 dst port 80

После выше набранной команды вы сможете наблюдать список подключений к 80-у порту, чем больше повторных подключений с одинаковых хостов тем вероятнее мы столкнулись с DoS или DDoS атакой. Как вы уже наверное догадались, изменив порт можно проверить есть ли атака на FTP, SSH или другие сервисы которые крутятся на сервере. Добавив ключ -n имена хостов преобразуются в IP адреса.

Глазами все не уследить, при атаке на веб-сервер вывод tcpdump-a сумасшедшей скоростью будет двигаться вдоль окна вывода терминала 🙂 Поэтому, мы сначала запишем вывод tcpdump-a в файл. пакетов 200-300 хватит.

tcpdump -v -n -w attack.log dst port 80 -c 250

-v самый простой уровень логирования, без изысканности.
-n преобразуем имена хостов в IP адреса
-w записываем анализ трафика в файл
-c количество захваченных пакетов

Приступим к анализу полученных данных через tcpdump, отпарсим лог следующей командой:

tcpdump -nr attack.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn

Результат будет — 2 столбца, в первом количество подключений, во втором IP. Чем больше подключений для одного IP тем вероятнее что это бот.

Если список очень длинный можно ограничить его указав нужное количество выводимых строк

tcpdump -nr attack.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | head -20

Что бы получить только IP адреса, без первого столбца, нужно убрать ключ -c после uniq
Вывод парсинга можно перенаправить в файл, а затем простым bash-скриптом, заблокировать все IP со списка.

#!/bin/bash
BLOCKDB="ips.txt" 
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
iptables -A INPUT -s $i -j DROP

Очень похожие трюки иногда проделывают с помощью утилиты netstat.

Источник https://projects.net-simple.ru/projects/manuals/wiki/%D0%90%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7_%D0%BD%D0%B0%D0%BB%D0%B8%D1%87%D0%B8%D1%8F_DDoS-%D0%B0%D1%82%D0%B0%D0%BA%D0%B8_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_tcpdump

Запись опубликована в рубрике *Unix,*Linux, *Сети. Добавьте в закладки постоянную ссылку.

Один ответ на “Анализ наличия DDoS-атаки с помощью tcpdump

  1. Eugen говорит:

    FeaMor,
    #!/bin/sh
    # находим все соединения и записываем их во временный файл ddos.iplist в каталоге tmp
    netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n > /tmp/ddos.iplist
    # очищаем скрипт бана айпишников
    cat /dev/null > /tmp/iptables_ban.sh
    # создаем DROP правила для 50 самых агрессивных ботов
    awk ‘{if ($1 > 20) {print «/sbin/iptables -I INPUT -p tcp —dport 80 -s » $2 » -j DROP» }}’ /tmp/ddos.iplist >> /tmp/iptables_ban.sh
    # следующая строка нужна только для того, чтобы создавался файл с просмотром всех правил iptables
    echo «/sbin/iptables -L INPUT -v -n > /tmp/iptables.log» >> /tmp/iptables_ban.sh
    # запускаем скрипт бана айпишников
    bash /tmp/iptables_ban.sh
    # делаем ротацию лога
    cat /dev/null > /var/log/ddos/error.log
    [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`
    SniFFeR:
    netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n | grep -v «Ваш IP сервера» > /tmp/ddos.iplist
    — с помощью данной команды можно исключить из проверки на количество подключение IP адрес самого сервера

Добавить комментарий для Eugen Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Я не спамер This plugin created by Alexei91