Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версия | |||
| dpi:dpi_options:use_cases:dpi_bestpractice_ddos_find_activity [2026/02/14 15:35] – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1 | dpi:dpi_options:use_cases:dpi_bestpractice_ddos_find_activity [2026/02/14 15:35] (текущий) – ↷ Страница перемещена из archive:dpi_bestpractice_ddos_find_activity в dpi:dpi_options:use_cases:dpi_bestpractice_ddos_find_activity elena.krasnobryzh | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== Простой DDoS анализ через CLI ====== | ||
| + | {{indexmenu_n> | ||
| + | |||
| + | ===== Проблема ===== | ||
| + | Исходные данные: | ||
| + | График DDoS атаки далее, видно, что мощность DDoS атаки в сумме с текущим трафиком превышает емкость канала. | ||
| + | {{ : | ||
| + | ===== Решение ===== | ||
| + | Так как быстро расширить канал и увеличить мощность DPI не представлялось возможным, | ||
| + | 1. вычисляем список IP которые подверглись DDoS | ||
| + | 2. переводим IP в null route ( в blackhole ) | ||
| + | ==== Настройка ==== | ||
| + | - создаем директорию / | ||
| + | - устанавливаем [[dpi: | ||
| + | # | ||
| + | protocol=udp | ||
| + | host=0.0.0.0 | ||
| + | port=1599 | ||
| + | |||
| + | [dump] | ||
| + | rotate_minutes=1 | ||
| + | processcmd=/ | ||
| + | dumpfiledir=/ | ||
| + | |||
| + | [InfoModel] | ||
| + | XMLElements = / | ||
| + | |||
| + | [Template] | ||
| + | Elements = octetDeltaCount, | ||
| + | |||
| + | [ExportModel] | ||
| + | Elements = session_id, octetDeltaCount, | ||
| + | |||
| + | |||
| + | [logging] | ||
| + | loggers.root.level = information | ||
| + | loggers.root.channel = fileChannel | ||
| + | channels.fileChannel.class = FileChannel | ||
| + | channels.fileChannel.path = / | ||
| + | channels.fileChannel.rotation = 1 M | ||
| + | channels.fileChannel.archive = timestamp | ||
| + | channels.fileChannel.purgeCount = 5 | ||
| + | channels.fileChannel.formatter.class = PatternFormatter | ||
| + | channels.fileChannel.formatter.pattern = %Y-%m-%d %H:%M:%S.%i [%P] %p %s - %t | ||
| + | channels.fileChannel.formatter.times = local | ||
| + | |||
| + | </ | ||
| + | - вносим в iptables разрешение для порта 1599 - UDP, запускаем ipfixreceiver.< | ||
| + | # | ||
| + | netstat -anpl | grep 1599 | ||
| + | udp | ||
| + | </ | ||
| + | - создаем файл обработки потока / | ||
| + | |||
| + | export PATH=/ | ||
| + | export LD_LIBRARY_PATH=/ | ||
| + | |||
| + | gzip $1 | ||
| + | echo "DDoS statistics" | ||
| + | date >> / | ||
| + | |||
| + | echo -e " | ||
| + | / | ||
| + | |||
| + | echo -e " | ||
| + | / | ||
| + | |||
| + | echo -e " | ||
| + | / | ||
| + | |||
| + | echo -e " | ||
| + | / | ||
| + | |||
| + | |||
| + | mv -f / | ||
| + | chown apache / | ||
| + | chmod a+w / | ||
| + | chcon -v --type=httpd_sys_content_t / | ||
| + | - создаем скрипт расчета к-ва сессий top-20 / | ||
| + | s=`echo " | ||
| + | ip=`printf ' | ||
| + | echo -n $ip | ||
| + | } | ||
| + | |||
| + | zcat $1 | awk -F ' | ||
| + | |||
| + | head -20 tmp$$$ > tmp2$$$ | ||
| + | |||
| + | echo -e " | ||
| + | while read p; do | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | done < tmp2$$$ | ||
| + | |||
| + | |||
| + | rm -f tmp$$$ tmp2$$$ | ||
| + | |||
| + | </ | ||
| + | - устанавливаем bc< | ||
| + | - создаем скрипт / | ||
| + | - создаем скрипт ТОП-20 по максимальному объему трафика / | ||
| + | # usage: | ||
| + | # by source ip | ||
| + | #./topsize arch/ | ||
| + | # by destination ip | ||
| + | #./topsize arch/ | ||
| + | # | ||
| + | |||
| + | import sys, os, logging, ConfigParser, | ||
| + | |||
| + | def main(): | ||
| + | delim=' | ||
| + | accumulater={} | ||
| + | for line in openinfile(sys.argv[1]): | ||
| + | acc=long(0) | ||
| + | fields = line.rstrip(' | ||
| + | if(sys.argv[2]==" | ||
| + | # by src | ||
| + | | ||
| + | acc=accumulater[fields[5]] | ||
| + | accumulater[fields[5]]=acc+long(fields[1]) | ||
| + | | ||
| + | accumulater[fields[5]]=long(fields[1]) | ||
| + | if(sys.argv[2]==" | ||
| + | #by dsc | ||
| + | try: | ||
| + | acc=accumulater[fields[7]] | ||
| + | accumulater[fields[7]]=acc+long(fields[1]) | ||
| + | | ||
| + | accumulater[fields[7]]=long(fields[1]) | ||
| + | |||
| + | for key, value in accumulater.iteritems(): | ||
| + | print str(value)+' | ||
| + | |||
| + | |||
| + | # open input file | ||
| + | def openinfile(filename): | ||
| + | if filename is None: | ||
| + | inf = sys.stdin | ||
| + | logging.debug(" | ||
| + | else: | ||
| + | if " | ||
| + | inf = gzip.open(filename, | ||
| + | else: | ||
| + | inf = open(filename, | ||
| + | logging.debug(" | ||
| + | return inf | ||
| + | |||
| + | def ipv4str(ipv4): | ||
| + | return str((ipv4 >> 24) & 0xFF) + ' | ||
| + | |||
| + | if __name__ == " | ||
| + | main() | ||
| + | |||
| + | </ | ||
| + | - добавляем строку в / | ||
| + | - устанавливаем параметры на DPI< | ||
| + | netflow_full_collector_type=1 | ||
| + | netflow_dev=eth2 | ||
| + | netflow_timeout=10 | ||
| + | # | ||
| + | netflow_full_collector=127.0.0.1: | ||
| + | netflow_passive_timeout=20 | ||
| + | netflow_active_timeout=60 | ||
| + | </ | ||
| + | ==== Работа со скриптами ==== | ||
| + | После перезагрузки fastdpi если все сконфигурировали правильно ipfixreceiver начнет принимать данные в директорию / | ||
| + | cd / | ||
| + | ./topcnt flow/ | ||
| + | ip hits | ||
| + | 77.XXX.XX.64 | ||
| + | 77.88.8.8 | ||
| + | 128.128.128.8 | ||
| + | 77.88.8.1 | ||
| + | ... | ||
| + | 77.XXX.XX.208 | ||
| + | </ | ||
| + | видим 1 шт. ip в топе с очень большим отрывом, | ||
| + | Проверяем top по размеру по всем src и dsc IP: | ||
| + | ./topsize arch/ | ||
| + | 5380.01 77.XXX.XX.64 | ||
| + | 165.881 81.XXX.XXX.79 | ||
| + | ... | ||
| + | 27.2184 74.XXX.XXX.27 | ||
| + | видим что в текущую минуту данный IP получил и отдал 5.4 Гбайт трафика, | ||
| + | Данный адрес отправляем в blackhole, так как мощности канала не хватает, | ||
| + | |||
| + | ==== Настройка httpd ==== | ||
| + | Для оперативного доступа при наличии http на сервере где происходит прием IPFX можно прописать в конфигурации / | ||
| + | < | ||
| + | < | ||
| + | Options Indexes FollowSymLinks | ||
| + | AllowOverride None | ||
| + | Order allow,deny | ||
| + | Allow from all | ||
| + | </ | ||
| + | |||
| + | Alias / | ||
| + | </ | ||
| + | Желательно еще добавить ограничение доступа, | ||
| + | Соответственно после рестарта httpd можно получить страницу по ссылке | ||
| + | < | ||
| + | http://< | ||
| + | </ | ||
| + | {{ : | ||
| + | ==== Что в остатке? | ||
| + | Интересно было понять м.б. можно заблокировать только ip извне? или их там пара десятков? | ||
| + | создаем скрипт для подсчета мощности атаки / | ||
| + | #!/bin/bash | ||
| + | |||
| + | function getipv4() { | ||
| + | s=`echo " | ||
| + | ip=`printf ' | ||
| + | echo -n $ip | ||
| + | } | ||
| + | |||
| + | zcat $1 | grep $2 | awk -F ' | ||
| + | |||
| + | echo -e " | ||
| + | echo -n " | ||
| + | head -20 tmp$$$ > top20$$$ | ||
| + | while read p; do | ||
| + | | ||
| + | | ||
| + | | ||
| + | done < | ||
| + | |||
| + | rm -f tmp$$$ top20$$$ | ||
| + | </ | ||
| + | запускаем, | ||
| + | < | ||
| + | ./topip ' | ||
| + | ip hits | ||
| + | unique ip=58261 | ||
| + | 202.92.200.6 | ||
| + | 110.76.131.6 | ||
| + | 119.235.28.59 | ||
| + | 38.70.202.194 | ||
| + | 177.38.144.14 | ||
| + | 138.204.18.18 | ||
| + | 212.119.180.222 | ||
| + | 88.220.134.2 | ||
| + | 200.186.13.86 | ||
| + | ... | ||
| + | </ | ||
| + | как видно из таблицы в атаке участвуют 58 тысяч адресов. | ||
| + | ===== Ссылки по теме ===== | ||
| + | * [[https:// | ||
| + | |||
| + | |||
| + | |||