Брутфорс-атаки остаются одной из самых распространённых угроз для RDP-серверов. Злоумышленники используют слабые или компрометированные пароли, чтобы получить доступ к системе. Эта угроза базируется не на уязвимостях протокола RDP, а на нарушении политики безопасности паролей, что делает её особенно опасной.
RDP с поддержкой SSL и проверки подлинности на уровне сети (NLA) достаточно безопасен для работы без VPN, если используются актуальные версии ОС и установлены все обновления. Однако пароли остаются слабым местом, а стандартные средства Windows не предоставляют защиты от их перебора. В этом руководстве мы рассмотрим, как с помощью механизма Connection Tracking настроить эффективную защиту от брутфорса.
Принцип работы Connection Tracking
Connection Tracking позволяет анализировать состояние соединений и пакетов, классифицируя их на четыре состояния:
— NEW: новый пакет, не принадлежащий ни одному соединению.
— ESTABLISHED: пакет, принадлежащий уже существующему соединению.
— RELATED: пакет, связанный с существующим соединением (например, дополнительные соединения FTP).
— INVALID: пакет, который не соответствует вышеуказанным состояниям.
При работе RDP клиент сначала проходит аутентификацию. Если данные введены неверно, каждый новый запрос создаёт пакет с состоянием NEW. При успешной аутентификации создаётся RDP-сессия, в которой пакеты переходят в состояние ESTABLISHED.
Таким образом, большое количество пакетов NEW, отправленных за короткий промежуток времени, свидетельствует о брутфорс-атаке.
Шаг 1: Создание списка подозрительных адресов
Мы будем использовать механизм Address List и таблицу Mangle. Это позволит фиксировать IP-адреса, с которых поступает слишком много пакетов NEW.
1) Откройте IP → Firewall → Mangle и создайте новое правило:
— Chain: forward
— Protocol: tcp
— Dst. Port: 3389
— Connection State: new
На вкладке Action:
— Укажите Add src to address list.
— Введите имя списка rdp_stage1.
— Установите Timeout: 1 минута.
Команда в терминале:
/ip firewall mangle add action=add-src-to-address-list address-list=rdp_stage1 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp
Шаг 2: Эскалация списков
Мы создаём последовательные списки (rdp_stage2, rdp_stage3 и т.д.) для фиксации повторных запросов. Если адрес уже находится в rdp_stage1 и поступает ещё один пакет NEW, он перемещается в rdp_stage2.
Пример команды для второго этапа:
/ip firewall mangle add action=add-src-to-address-list address-list=rdp_stage2 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage1
Повторите это для rdp_stage3, rdp_stage4 и rdp_stage5.
Шаг 3: Блокировка адресов
После попадания адреса в rdp_stage5 он перемещается в список rdp_drop, с блокировкой на 30 минут.
Создайте новое правило:
— Chain: forward
— Protocol: tcp
— Dst. Port: 3389
— Src. Address List: rdp_stage5
На вкладке Action укажите:
— Add src to address list.
— Введите rdp_drop.
— Установите Timeout: 30 минут.
Команда в терминале:
/ip firewall mangle add action=add-src-to-address-list address-list=rdp_drop address-list-timeout=30m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage5
Как это работает? Адрес источника первого пакета с состоянием NEW добавляется в список rdp_stage1 на 1 минуту. Если за это время от того же адреса придёт ещё один новый пакет, он попадёт в rdp_stage2. Этот процесс продолжается: каждый новый пакет переводит адрес на следующий этап (rdp_stage3, rdp_stage4 и т.д.).
После шестого пакета адрес попадает в список rdp_drop на 30 минут. Время блокировки можно настроить самостоятельно, но не рекомендуется ставить слишком большие значения, чтобы избежать долгих блокировок в случае ошибки. Например, полчаса предпочтительнее, чем сутки, если администратор недоступен.
Важно: правила нужно размещать в обратном порядке — от rdp_stage5 к rdp_stage1. Это связано с тем, что действие add src to address list не завершает обработку пакета, и он продолжает движение по цепочке. Если оставить порядок от первого к последнему, пакет будет сразу добавляться во все списки, включая rdp_drop, что нарушит логику.
Если вы работаете в терминале, то правильная последовательность действий будет выглядеть так:
/ip firewall mangle
add action=add-src-to-address-list address-list=rdp_drop address-list-timeout=30m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage5
add action=add-src-to-address-list address-list=rdp_stage5 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage4
add action=add-src-to-address-list address-list=rdp_stage4 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage3
add action=add-src-to-address-list address-list=rdp_stage3 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage2
add action=add-src-to-address-list address-list=rdp_stage2 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp src-address-list=rdp_stage1
add action=add-src-to-address-list address-list=rdp_stage1 address-list-timeout=1m chain=forward connection-state=new dst-port=3389 protocol=tcp
Теперь проверим работу наших правил, выполним подключение к RDP одновременно контролируя IP — Firewall — Address Lists. Если все прошло нормально, то мы увидим наш адрес-источник в списках rdp_stage1 и rdp_stage2.
Теперь попробуем три раза ошибиться и на четвертый зайти:
Как видим, практика полностью совпадает с теорией, следовательно, можно переходить к блокировкам, не опасаясь, что пострадают легальные пользователи. Блокировать мы будем в таблице Raw, почему? Raw содержит «сырые» данные о пакетах, до того, как они будут переданы Connection Tracking, а так как определение состояния пакета достаточно ресурсозатратная операция, то отсекая лишний трафик в Raw мы снижаем нагрузку на процессор роутера, что важно в случае достаточно большого списка.
Шаг 4: Блокировка трафика
Теперь мы блокируем адреса из списка rdp_drop.
1) Откройте IP → Firewall → Raw и создайте правило:
— Chain: prerouting
— Protocol: tcp
— Dst. Port: 3389
— Src. Address List: rdp_drop
На вкладке Action выберите drop.
Команда в терминале:
/ip firewall raw add action=drop chain=prerouting dst-port=3389 protocol=tcp src-address-list=rdp_drop
Обратите внимание: в предложенной схеме мы блокируем злоумышленнику только доступ к RDP. Если убрать ограничения по протоколу и порту, можно полностью блокировать источник, но делать этого не рекомендуется. Даже сам администратор может ошибочно несколько раз ввести пароль, а при полной блокировке он потеряет возможность подключиться к сети. Если блокируется только RDP, администратор сможет зайти на роутер и снять блокировку.
Защиту от брутфорса можно считать настроенной. На первых этапах рекомендуется периодически проверять содержимое списка rdp_drop, чтобы исключить попадание туда легальных пользователей. В случае необходимости следует корректировать настройки или информировать пользователей о новых правилах.
Этот подход универсален и может применяться для любого сервиса, не только RDP. Для настройки достаточно определить допустимое количество новых пакетов для выбранного протокола и установить границу, после которой трафик можно считать подозрительным.