В этой статье мы рассмотрим, как с помощью утилиты IPBan настроить защиту сервера Windows от атаки по типу отказ в обслуживании (DDoS). Идея заключатся в обнаружении нецелевого/подозрительного трафика по лог файлам (или журналам событий Windows) и блокировки обнаруженных IP адресов в файерволе Windows. Это позволит реализовать простую систему защиты Windows сервера от DDoS атаки без использования дополнительных внешних средств защиты.
Симптомы DDoS атаки на веб сервер Windows
В нашем случае на хосте Windows Server в dmz сети, на котором размещено небольшое веб приложение, обнаружилась аномально высокая загрузка сетевого интерфейса, которая практически целиком забила доступную пропускную способность WAN канала.

С помощью ResMon можно определить, что с хостом Windows одновременно устанавливают HTTP сессии сотни клиентов, что не характерно для типовых исторических нагрузок.

Вывести количество одновременных сетевых подключений к серверу по HTTPS можно, например PowerShell командой:
netstat -ano | findstr :443 |measure

Для блокировки IP адресов ботов мы воспользуемся open-source утилитой IPBan (DigitalRuby.IPBan), которая является аналогом fail2ban для Windows. Изначально утилита разрабатывалась для блокировки брутфорс атак на терминальные RDP сервера, но можно использовать ее и для блокировки DDoS атак и на другие Windows-сервисы.
Установка IPBan в Windows Server
Для разбора текстовых лог файлов веб сервиса (или событий в Event Viewer) мы воспользуемся open-source утилитой IPBan. Эта утилита с помощью регулярных выражения позволяет выполнять анализ текстовых лог файлов или журналов событий (Security/Application логи) на предмет повторяющихся нежелательных событий, извлекать из них IP адреса и после определенного количества неудачных спамных обращений, блокировать их на определенное время правилами Windows Firewall.
Установить IPBan в Windows можно с помощью готового PowerShell скрипта из GitHub репозитория:
$ProgressPreference = 'SilentlyContinue'; [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/DigitalRuby/IPBan/master/IPBanCore/Windows/Scripts/install_latest.ps1'))
Скрипт скачает файл IPBan на диск в папку C:\Program Files\IPBan и создаст в Windows новую службу

Для настройки IPBan используется конфигурационный файл ipban.config.

Файл конфигурации ipban.config представляет собой XML файл, содержащий следующие верхнеуровневые секций:
- LogFilesToParse – правила, в который определяются текстовые лог файлы, которые нужно парсить, регулярные выражения извлечения из них информации, паттерны детектирования нежелательных событий
- ExpressionsToBlock – паттерны и регулярные выражения для извлечения подозрительных событий и IP адресов из журналов событий Windows для блокировки в файерволе
- ExpressionsToNotify – аналогично предыдущему, но только для уведомлений (без немедленной блокировки)
- appSettings – секция с базовыми настройками службы IPBan

По умолчанию в файле ipban.config уже включены несколько правил отслеживания неудачных попыток входа. Например:
- В секции LogFiles включен парсинг логов следующих сервисов: SSH, IPBanCustom (используется в качестве шаблона для парсинга любых текстовых логов), логов аутентификации Exchange, логов SmarterMail, MailEnable, Apache, логов входа в RDWeb
- В секции ExpressionsToBlock настроен аудит событий в журналов Event Viewer следующий сервисов: события входа по RDP (см. как настроить блокировку при переборе паролей по RDP), MSSQL, PostgreSQL, MSExchange, phpMyAdmin, логи входа OpenSSH сервера для Windows, VNC, RRAS, SVN
Удалите правила для всех неиспользуемых сервисов из ipban.config, или воспользуйтесь пустым файлом ipban.override.config в качестве шаблона для вашей конфигурации ipban.
В секции appSettings я настроил следующие параметры:
- BanTime – время блокировки IP адреса в файерволе (после истечения которой IP адрес разблокируется). Я блокирую адреса на 1 сутки (
value="01:00:00:00"/) - Whitelist – белый список IP адресов и подсетей, которые никогда не должны быть заблокированы (диапазоны вашего провайдера, подсети клиентов, и т.д.). Формат списка белых IP:
value="12.11.128.0/17,72.19.328.0/18,29.140.16.0/20"

Блокируем спамные IP адреса в Windows Firewall по логам IIS
В нашем случае DDoS выполнятся против небольшого веб сайта IIS, который запущен на Windows Server и опубликован в Интернете. Кроме того, на сервере развернута роль шлюза доступа RD Gateway для подключения удаленных пользователей.
Наличие активной DOS атаки на IIS подтверждалось огромными файлами логов IIS в каталоге
C:\inetpub\logs\LogFiles\W3SVC1
(по несколько Гб). Чтобы IPBan было проще разбирать лог файлы IIS, мы в консоли IIS Manager (
inetmgr
) изменили формат логов с формата новый лог каждый день (по умолчанию) на новый лог при достижении указанного размера файла (мы указали тут 95 Мб): IIS -> Web Site -> Ведение журнала -> переход на новый файл журнала -> при достижении максимального размера файла.

Далее вам нужно определить по логам IIS каким типом обращений перегружен ваш сайт. В моем случае в логе оказалось десятки тысяч запросов с разных IP с HTTP кодом ошибки 405 (Method Not Allowed).

Я сформировал следующее правило для раздела
<LogFilesToParse> <LogFiles>
:
<LogFile>
<Source>IIS405</Source>
<PathAndMask>C:/inetpub/logs/LogFiles/W3SVC1/*.log</PathAndMask>
<FailedLoginRegex>
<![CDATA[
^(?<timestamp_utc>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\S+\s+\S+\s+\S+\s-\s\d+\s-\s(?<ipaddress>\S+).*?\s405\s+\d+\s+\d+\s+\d+$
]]>
</FailedLoginRegex>
<PlatformRegex>Windows</PlatformRegex>
<PingInterval>5000</PingInterval>
<MaxFileSize>100000000</MaxFileSize>
<FailedLoginThreshold>5</FailedLoginThreshold>
<MinimumTimeBetweenFailedLoginAttempts>00:00:5</MinimumTimeBetweenFailedLoginAttempts>
</LogFile>
- PathAndMask – путь к логам (обратите внимание, что слеши в пути должны быть инвертированы)
- FailedLoginRegex – regexp выражение для поиска событий с кодом ответа 405 и извлечением из них IP адреса
- FailedLoginThreshold – порог неудачных попыток входа перед блокировкой IP
В вашем случае может быть другой regexp. Для его тестирования можно воспользоваться PowerShell. Скопируйте строку из лога IIS и проверьте ее через вашу регулярку:
$logLine = " 2025-12-08 19:37:39 192.168.0.100 POST / - 443 - 95.128.157.17 Mozilla/5.0+(Macintosh;+Intel+Mac+OS+X+10.15;+rv:128.0)+Gecko/20100101+Firefox/128.0 https://123 405 0 1 172 "
$regex = '^(?<timestamp_utc>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\S+\s+\S+\s+\S+\s-\s\d+\s-\s(?<ipaddress>\S+).*?\s405\s+\d+\s+\d+\s+\d+$'
if ($logLine -match $regex) {
Write-Host "✓ Совпадение: нежелательный IP: $($Matches.ipaddress)" -ForegroundColor Green
} else {
Write-Host "✗ NO MATCH!" -ForegroundColor Red
}

Перезапустите службу IPBan, чтобы перечитать правила:
Restart-Service ipban
Информацию о всех своих действиях и срабатываниях IPBan пишет в файл logfile.txt.
+
404
ответ. Для их блокировки мы добавили дополнительное правило:
<LogFile>
<Source>IIS404</Source>
<PathAndMask>C:/inetpub/logs/LogFiles/W3SVC1/u_extend*.log</PathAndMask>
<FailedLoginRegex>
<![CDATA[
^(?<timestamp_utc>\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})\s+\S+\s+\S+\s+\S+\s-\s\d+\s-\s(?<ipaddress>\S+).*?\s404\s+\d+\s+\d+\s+\d+$
]]>
</FailedLoginRegex>
<PlatformRegex>Windows</PlatformRegex>
<PingInterval>5000</PingInterval>
<MaxFileSize>206777216</MaxFileSize>
<FailedLoginThreshold>4</FailedLoginThreshold>
<MinimumTimeBetweenFailedLoginAttempts>00:00:5</MinimumTimeBetweenFailedLoginAttempts>
</LogFile>
Для полной блокировки IP адресов, для которых превышен порог срабатывания, IPBan создает правила Windows Firewall с именем
IPBan_Block_0
,
IPBan_Block_1000
и т.д. (из-за ограниченного максимального размера правила файервола, каждая следующая 1000 заблокированных IP адресов добавляется в новое правило).

Список заблокированных IP адресов в правиле IPBan и их количество можно вывести с помощью PowerShell:
(Get-NetFirewallrule -DisplayName 'IPBan_Block_4000'|Get-NetFirewallAddressFilter).remoteaddress
(Get-NetFirewallrule -DisplayName 'IPBan_Block_4000'|Get-NetFirewallAddressFilter).remoteaddress |measure

В моем случае за неполные сутки работы IPBan было заблокирована почти 5000 IP адресов, с которых осуществлялась DOS атака. После чего, нагрузка на сетевой интерфейс сервера нормализовалась, а количество активных подключений к IIS уменьшилось с нескольких тысяч до сотни.

После истечения времени блокировки, IP адрес удаляется из правила.
Дополнительно можно через IIS Filtering заблокировать явно спамные User-Agent: iismanager -> Фильтрация запросов -> Правила -> заголовок:
user-agent
-> запретить строки: добавьте все явно спамные заголовки в соответствии с вашим логом IIS (например,
AppleWebKit
,
lynx
и прочие).

При обращении агентов с такими заголовками IIS будет возвращать 404 ошибку.
Таким образом, с помощью IPBan мы реализовали простейшую защиту от DDoS атаки на веб-сервер Windows. По аналогии, вы можете анализировать логи или журналы событий других приложений и блокировать IP адрес с подозрительным/спамным трафиком.

