DoS Emulator
Not logged in

В общем

Данный "эмулятор" - простой питоновый (python) скрипт, генерирующий лог frontend-сервера во время DDoS-атаки.

Теория

Атака

Скрипт эмулирует DDoS-атаку на http-frontend демон.
Выявить такую атаку можно на сетевом уровне (куча пакетов, tcp-соединений), или на уровне приложений, которые эти соединения обрабатывают. Последнее обычно проще, если приложения справляются с нагрузкой, что как правило справедливо для event-loop демонов типа lighttpd или nginx.

Лог

Демон ведет лог-файл, куда записывает все обработаные запросы. Тестовый скрипт эмулирует этот процесс (рост лога) во время DDoS-атаки.
Лог ведется в стандартном формате, совместимом с access-логами apache. Атака идет с разных IP-адресов ботсети.

Firewall

Кроме лога, по задумке, имеется интерфейс к firewall'у, который можно использовать чтобы блокировать такие нежелательные запросы. Интерфейс реализован максимально просто - текстовый файл, куда можно записывать IP-адреса, подлежащие блокировке, по одному на строку.

Данный файл перечитывается через указанный интервал (по умолчанию 5 секунд), и список IP полностью обновляется (не дополняется, т.е. можно по идее "разбанить" IP, убрав их оттуда).
Обработка (чтение) файла сопровождается получением на него блокировки (POSIX advisory lock, shared), поэтому чтобы убедиться в том, что файл будет прочитан в актуальном состоянии (а не, к примеру, после записи в него первых строк), желательно использовать его блокировку (см. man fcntl).

Запросы с IP, подлежащих такой блокировке, уже не доходят до http-демона, поэтому в лог не попадают.

Задача

Спойлеры

Запуск скрипта

RTFM

Актуальное описание всех параметров можно получить, просто запустив его с параметром "-h" или "--help":
fraggod@malediction:-hatch/dos_emulator% py log_generator.py -h
Usage: log_generator.py [options] [ logname ]

Creates and rotates DoS-attack-like log.

Options:
  -h, --help            show this help message and exit
  -d BOT_DELAY, --delay=BOT_DELAY
                        Start DoS attack after specified number of seconds
                        (default: 0).
  -n BOT_SPECIES, --bot-species=BOT_SPECIES
                        Number of different bot request species (default: 5).
  -l LIMIT, --limit=LIMIT
                        Number of lines to write to resulting log (default:
                        100).
  --flow-real=FLOW_REAL
                        Number of real requests per second (default: 0.25).
  --flow-bot=FLOW_BOT   Number of DoS requests per second (default: 1).
  -s SOURCE, --source=SOURCE
                        Source ("real") log, to mix with autogenerated bot-
                        entries (default: access.source.log.gz).
  -f FIREWALL, --firewall-db=FIREWALL
                        Use firewall imitation file.
  --firewall-rehash=FIREWALL_REHASH
                        Seconds between rebuilding hash of firewalled IPs
                        (default: 5).
  --mark                Mark bot lines.
  --debug               Verbose operation mode.

Проще

Вкратце это значит примерно следующее:

python log_generator.py --flow-real=10 --flow-bot=100 --limit 1000 -f firewall.txt access_test.log

Это запустит генерацию лога "access_test.log", в который будет лететь 10 запросов в секунду от "реальных" юзеров и 100/с от ботов. Забаненые IP читаются из файла "firewall.txt". Генерация идет до 1000 строк (меньше 10 секунд).

Перечитываться "фаервол" будет раз в 5 секунд (см. "--firewall-rehash"), боты будут слать запросы пяти разных типов (см. "--bot-species").

Зависимости