Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
dpi:qoe:use_cases:dpi_bestpractice_ddos_find_activity [2023/08/25 12:57] – ↷ Страница перемещена из dpi:dpi_bestpractice:dpi_bestpractice_ddos_find_activity в dpi:qoe:use_cases:dpi_bestpractice_ddos_find_activity elena.krasnobryzh | dpi:qoe:use_cases:dpi_bestpractice_ddos_find_activity [2024/04/25 07:26] (текущий) – удалено elena.krasnobryzh | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Простой DDoS анализ через CLI ====== | ||
- | {{indexmenu_n> | ||
- | ===== Проблема ===== | ||
- | Исходные данные : канал 10Гбит, периодическая мощная DDoS атака на один из ip в сети приводит к деградации сервиса. | ||
- | График 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:// | ||
- | |||
- | |||
- | |||