Защита от брутфорса
Принцип защиты
Защита от брутфорса в RouterOS реализуется через механизм address-list с поэтапной эскалацией (stage-based protection). Суть метода: каждое новое подключение к защищаемому порту добавляет IP-адрес источника в список (stage). При повторном подключении в течение таймаута IP перемещается на следующий stage. После прохождения всех стадий IP попадает в чёрный список (blacklist) и блокируется.
Типичная цепочка стадий:
- stage1 — первое подключение (таймаут 1 минута)
- stage2 — второе подключение за 1 минуту (таймаут 1 минута)
- stage3 — третье подключение за 1 минуту (таймаут 1 минута)
- blacklist — четвёртое подключение — IP блокируется (таймаут от 1 часа до 30 дней)
Принцип работы основан на том, что легитимный пользователь вводит пароль 1-2 раза, а бот перебирает сотни комбинаций. Таким образом, обычный пользователь не достигает blacklist, а атакующий блокируется после 4 попыток подключения.
Защита SSH
SSH (порт 22) — одна из самых атакуемых служб. Следующий набор правил реализует 4-стадийную защиту с блокировкой на 1 день после 4 неудачных попыток подключения в течение 1 минуты.
# === Защита SSH от брутфорса ===
/ip/firewall/filter
# 1. Блокируем IP из чёрного списка
add chain=input protocol=tcp dst-port=22 \
src-address-list=ssh-blacklist action=drop \
comment="SSH: drop blacklisted"
# 2. Stage3 → Blacklist (4-я попытка = бан на 1 день)
add chain=input protocol=tcp dst-port=22 \
connection-state=new src-address-list=ssh-stage3 \
action=add-src-to-address-list \
address-list=ssh-blacklist address-list-timeout=1d \
comment="SSH: stage3 → blacklist (1 day)"
# 3. Stage2 → Stage3 (3-я попытка)
add chain=input protocol=tcp dst-port=22 \
connection-state=new src-address-list=ssh-stage2 \
action=add-src-to-address-list \
address-list=ssh-stage3 address-list-timeout=1m \
comment="SSH: stage2 → stage3"
# 4. Stage1 → Stage2 (2-я попытка)
add chain=input protocol=tcp dst-port=22 \
connection-state=new src-address-list=ssh-stage1 \
action=add-src-to-address-list \
address-list=ssh-stage2 address-list-timeout=1m \
comment="SSH: stage1 → stage2"
# 5. Новое подключение → Stage1 (1-я попытка)
add chain=input protocol=tcp dst-port=22 \
connection-state=new \
action=add-src-to-address-list \
address-list=ssh-stage1 address-list-timeout=1m \
comment="SSH: new connection → stage1"RouterOS CLI
Защита Winbox
Winbox использует TCP-порт 8291. Защита строится аналогично SSH, но с увеличенным таймаутом блокировки, так как Winbox обычно используется реже.
# === Защита Winbox от брутфорса ===
/ip/firewall/filter
# 1. Блокируем IP из чёрного списка
add chain=input protocol=tcp dst-port=8291 \
src-address-list=winbox-blacklist action=drop \
comment="Winbox: drop blacklisted"
# 2. Stage3 → Blacklist (бан на 3 дня)
add chain=input protocol=tcp dst-port=8291 \
connection-state=new src-address-list=winbox-stage3 \
action=add-src-to-address-list \
address-list=winbox-blacklist address-list-timeout=3d \
comment="Winbox: stage3 → blacklist (3 days)"
# 3. Stage2 → Stage3
add chain=input protocol=tcp dst-port=8291 \
connection-state=new src-address-list=winbox-stage2 \
action=add-src-to-address-list \
address-list=winbox-stage3 address-list-timeout=1m \
comment="Winbox: stage2 → stage3"
# 4. Stage1 → Stage2
add chain=input protocol=tcp dst-port=8291 \
connection-state=new src-address-list=winbox-stage1 \
action=add-src-to-address-list \
address-list=winbox-stage2 address-list-timeout=1m \
comment="Winbox: stage1 → stage2"
# 5. Новое подключение → Stage1
add chain=input protocol=tcp dst-port=8291 \
connection-state=new \
action=add-src-to-address-list \
address-list=winbox-stage1 address-list-timeout=1m \
comment="Winbox: new connection → stage1"RouterOS CLI
Защита VPN (L2TP/PPTP/SSTP)
VPN-сервисы также подвержены брутфорс-атакам. L2TP использует UDP-порт 1701, PPTP — TCP-порт 1723, SSTP — TCP-порт 443. Для каждого протокола применяется аналогичная стратегия с address-list.
# === Защита L2TP от брутфорса ===
/ip/firewall/filter
# L2TP (UDP 1701)
add chain=input protocol=udp dst-port=1701 \
src-address-list=vpn-blacklist action=drop \
comment="VPN: drop blacklisted"
add chain=input protocol=udp dst-port=1701 \
connection-state=new src-address-list=vpn-stage3 \
action=add-src-to-address-list \
address-list=vpn-blacklist address-list-timeout=7d \
comment="VPN: stage3 → blacklist (7 days)"
add chain=input protocol=udp dst-port=1701 \
connection-state=new src-address-list=vpn-stage2 \
action=add-src-to-address-list \
address-list=vpn-stage3 address-list-timeout=1m \
comment="VPN: stage2 → stage3"
add chain=input protocol=udp dst-port=1701 \
connection-state=new src-address-list=vpn-stage1 \
action=add-src-to-address-list \
address-list=vpn-stage2 address-list-timeout=1m \
comment="VPN: stage1 → stage2"
add chain=input protocol=udp dst-port=1701 \
connection-state=new \
action=add-src-to-address-list \
address-list=vpn-stage1 address-list-timeout=1m \
comment="VPN: new → stage1"
# === Защита PPTP (TCP 1723) ===
add chain=input protocol=tcp dst-port=1723 \
src-address-list=vpn-blacklist action=drop \
comment="PPTP: drop blacklisted"
add chain=input protocol=tcp dst-port=1723 \
connection-state=new src-address-list=vpn-stage3 \
action=add-src-to-address-list \
address-list=vpn-blacklist address-list-timeout=7d \
comment="PPTP: stage3 → blacklist (7 days)"
add chain=input protocol=tcp dst-port=1723 \
connection-state=new src-address-list=vpn-stage2 \
action=add-src-to-address-list \
address-list=vpn-stage3 address-list-timeout=1m \
comment="PPTP: stage2 → stage3"
add chain=input protocol=tcp dst-port=1723 \
connection-state=new src-address-list=vpn-stage1 \
action=add-src-to-address-list \
address-list=vpn-stage2 address-list-timeout=1m \
comment="PPTP: stage1 → stage2"
add chain=input protocol=tcp dst-port=1723 \
connection-state=new \
action=add-src-to-address-list \
address-list=vpn-stage1 address-list-timeout=1m \
comment="PPTP: new → stage1"
# === Защита SSTP (TCP 443) ===
add chain=input protocol=tcp dst-port=443 \
src-address-list=vpn-blacklist action=drop \
comment="SSTP: drop blacklisted"
add chain=input protocol=tcp dst-port=443 \
connection-state=new src-address-list=vpn-stage3 \
action=add-src-to-address-list \
address-list=vpn-blacklist address-list-timeout=7d \
comment="SSTP: stage3 → blacklist (7 days)"
add chain=input protocol=tcp dst-port=443 \
connection-state=new src-address-list=vpn-stage2 \
action=add-src-to-address-list \
address-list=vpn-stage3 address-list-timeout=1m \
comment="SSTP: stage2 → stage3"
add chain=input protocol=tcp dst-port=443 \
connection-state=new src-address-list=vpn-stage1 \
action=add-src-to-address-list \
address-list=vpn-stage2 address-list-timeout=1m \
comment="SSTP: stage1 → stage2"
add chain=input protocol=tcp dst-port=443 \
connection-state=new \
action=add-src-to-address-list \
address-list=vpn-stage1 address-list-timeout=1m \
comment="SSTP: new → stage1"RouterOS CLI
Комплексная защита всех сервисов
Вместо создания отдельных стадий для каждого сервиса можно использовать единый набор address-list для всех управляющих портов. Это упрощает администрирование и обеспечивает единую политику блокировки: атакующий, попавший в blacklist при атаке SSH, будет заблокирован и на Winbox, WebFig, API.
# === Комплексная защита от брутфорса ===
# Порты: SSH(22), Winbox(8291), WebFig(80,443), API(8728,8729)
/ip/firewall/filter
# Whitelist — пропускаем доверенные IP без проверки
add chain=input src-address-list=whitelist \
action=accept \
comment="Bruteforce: allow whitelist"
# Блокировка чёрного списка на всех сервисных портах
add chain=input protocol=tcp \
dst-port=22,80,443,8291,8728,8729 \
src-address-list=bruteforce-blacklist action=drop \
comment="Bruteforce: drop blacklisted on all services"
# Stage3 → Blacklist (бан на 10 дней)
add chain=input protocol=tcp \
dst-port=22,80,443,8291,8728,8729 \
connection-state=new src-address-list=bruteforce-stage3 \
action=add-src-to-address-list \
address-list=bruteforce-blacklist address-list-timeout=10d \
log=yes log-prefix="BLACKLISTED" \
comment="Bruteforce: stage3 → blacklist (10 days)"
# Stage2 → Stage3
add chain=input protocol=tcp \
dst-port=22,80,443,8291,8728,8729 \
connection-state=new src-address-list=bruteforce-stage2 \
action=add-src-to-address-list \
address-list=bruteforce-stage3 address-list-timeout=1m \
comment="Bruteforce: stage2 → stage3"
# Stage1 → Stage2
add chain=input protocol=tcp \
dst-port=22,80,443,8291,8728,8729 \
connection-state=new src-address-list=bruteforce-stage1 \
action=add-src-to-address-list \
address-list=bruteforce-stage2 address-list-timeout=1m \
comment="Bruteforce: stage1 → stage2"
# Новое подключение → Stage1
add chain=input protocol=tcp \
dst-port=22,80,443,8291,8728,8729 \
connection-state=new \
action=add-src-to-address-list \
address-list=bruteforce-stage1 address-list-timeout=1m \
comment="Bruteforce: new → stage1"
# === Whitelist: добавляем доверенные адреса ===
/ip/firewall/address-list
add list=whitelist address=192.168.88.0/24 comment="LAN"
add list=whitelist address=10.0.0.0/24 comment="VPN clients"
add list=whitelist address=203.0.113.50 comment="Admin office"RouterOS CLI
Мониторинг заблокированных IP
После настройки защиты важно контролировать, какие адреса попадают в чёрный список, и своевременно добавлять исключения.
Просмотр заблокированных адресов
# Показать все адреса в blacklist
/ip/firewall/address-list/print where list=bruteforce-blacklist
# Показать количество заблокированных
/ip/firewall/address-list/print count-only where list=bruteforce-blacklist
# Показать все stage-списки
/ip/firewall/address-list/print where list~"bruteforce"RouterOS CLI
Удаление IP из чёрного списка
# Найти и удалить конкретный IP из blacklist
/ip/firewall/address-list/remove \
[find list=bruteforce-blacklist address=198.51.100.25]
# Очистить весь blacklist
/ip/firewall/address-list/remove \
[find list=bruteforce-blacklist]RouterOS CLI
Добавление исключений (Whitelist)
# Добавить доверенный IP
/ip/firewall/address-list/add list=whitelist \
address=198.51.100.10 comment="Partner office"
# Добавить целую подсеть
/ip/firewall/address-list/add list=whitelist \
address=198.51.100.0/28 comment="Partner network"RouterOS CLI
Автоматическое уведомление по e-mail
Следующий скрипт проверяет blacklist и отправляет уведомление администратору при появлении новых заблокированных адресов.
# === Скрипт уведомления о блокировке ===
# Добавить в System → Scripts
/system/script/add name="bruteforce-notify" source={
:local blacklist [/ip/firewall/address-list/find \
list=bruteforce-blacklist dynamic=yes]
:local count [:len $blacklist]
:if ($count > 0) do={
:local body "Blocked IPs:\r\n"
:foreach i in=$blacklist do={
:local addr [/ip/firewall/address-list/get $i address]
:local timeout [/ip/firewall/address-list/get $i timeout]
:set body ($body . $addr . " (timeout: " . $timeout . ")\r\n")
}
/tool/e-mail/send to="admin@example.com" \
subject="[RouterOS] Bruteforce blacklist report" \
body=$body
}
}
# Запуск скрипта по расписанию каждый час
/system/scheduler/add name="bruteforce-report" \
interval=1h on-event="bruteforce-notify" \
start-time=00:00:00RouterOS CLI
Мониторинг через системный лог
# Просмотр логов блокировки
/log/print where message~"BLACKLISTED"
# Настройка логирования в отдельный файл
/system/logging/add topics=firewall action=disk \
prefix="FW"
# Просмотр статистики правил (hit counters)
/ip/firewall/filter/print stats where comment~"Bruteforce"RouterOS CLI