mikrotik-wiki.ru
Главная
Загрузка...

Защита MikroTik от брутфорса и сканирования портов

RouterOS 7.xIP11 мин30 мар. 2026 г.
TelegramVK

MikroTik RouterOS — популярная цель для автоматических атак. По данным мониторинга honeypot-серверов, один MikroTik с белым IP получает в среднем 3000-5000 попыток подключения в сутки на стандартные порты. Причина проста: Winbox (порт 8291), SSH (порт 22) и WebFig (порт 80/443) — хорошо известные сервисы, а ботнеты сканируют весь диапазон IPv4 за считанные часы. В этом руководстве построим многоуровневую защиту от брутфорса и сканирования портов на RouterOS 7.20+.

Описание проблемы

Почему MikroTik — мишень

Роутеры MikroTik работают круглосуточно, имеют белый IP-адрес и предоставляют несколько сервисов управления по умолчанию. Стандартная установка RouterOS открывает:

СервисПорт по умолчаниюПротоколРиск
Winbox8291TCPВысокий — основной инструмент управления
SSH22TCPВысокий — универсальный доступ
WebFig80 / 443TCPСредний — веб-интерфейс
API8728TCPВысокий — программный доступ
API-SSL8729TCPВысокий — программный доступ
FTP21TCPСредний — загрузка файлов
Telnet23TCPКритический — открытый текст
BTest2000TCPНизкий — тест пропускной способности

Реальный пример: на тестовом роутере с белым IP за одну ночь было зафиксировано 41 000 попыток подключения к RDP (порт 3389), которые проходили через роутер с пробросом портов. Ещё около 8000 попыток приходилось на SSH и Winbox самого роутера. Без защиты это лишь вопрос времени, когда пароль из словаря подойдёт.

Типы атак

  • Brute-force — последовательный перебор паролей к SSH, Winbox, WebFig
  • Credential stuffing — использование утёкших пар логин/пароль из других сервисов
  • Port scanning — разведка открытых портов для последующей эксплуатации (SYN scan, XMAS scan, NULL scan)
  • Service fingerprinting — определение версии RouterOS по баннерам сервисов

Настройка

Шаг 1. Отключение ненужных сервисов

Первое и самое важное правило — отключить всё, чем не пользуетесь. По умолчанию RouterOS включает больше сервисов, чем необходимо.

[admin@MikroTik] >
# Просмотр всех сервисов и их состояния
/ip/service/print

# Отключить Telnet — никогда не используйте его
/ip/service/disable telnet

# Отключить FTP, если не загружаете файлы через FTP
/ip/service/disable ftp

# Отключить API, если нет автоматизации
/ip/service/disable api
/ip/service/disable api-ssl

# Отключить HTTP (WebFig) — используйте только HTTPS или Winbox
/ip/service/disable www

# Отключить Bandwidth Test Server
/tool/bandwidth-server/set enabled=no

Оставьте только те сервисы, которые реально используете. Для большинства администраторов достаточно Winbox + SSH.

Шаг 2. Ограничение доступа по IP

Разрешите подключение к сервисам управления только с доверенных адресов:

[admin@MikroTik] >
# Winbox — только из локальной сети и VPN
/ip/service/set winbox address=192.168.88.0/24,10.10.10.0/24

# SSH — только из локальной сети
/ip/service/set ssh address=192.168.88.0/24

# HTTPS WebFig — только из локальной сети
/ip/service/set www-ssl address=192.168.88.0/24

Если нужен доступ извне — используйте VPN (WireGuard или IPsec), а не открытие портов на WAN.

Шаг 3. Смена стандартных портов

Смена портов не является защитой сама по себе, но значительно снижает количество автоматических атак:

[admin@MikroTik] >
# Перенести Winbox на нестандартный порт
/ip/service/set winbox port=48291

# Перенести SSH на нестандартный порт
/ip/service/set ssh port=42222

После смены порта подключение через Winbox: 192.168.88.1:48291, через SSH: ssh admin@192.168.88.1 -p 42222.

Шаг 4. Многоступенчатая защита от брутфорса (Address Lists)

Это ключевой механизм. Идея: отслеживаем повторные попытки подключения и при достижении порога блокируем IP. Используем цепочку stage1 -> stage2 -> stage3 -> blacklist.

[admin@MikroTik] >
/ip/firewall/filter

# === Блокировка IP из blacklist ===
add chain=input src-address-list=blacklist action=drop \
  comment="Drop blacklisted IPs"

# === Защита SSH (порт 22 или ваш кастомный) ===

# Если IP уже в stage3 и снова стучится — в blacklist на 7 дней
add chain=input protocol=tcp dst-port=22 src-address-list=ssh-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d comment="SSH brute-force: stage3 -> blacklist"

# Если IP в stage2 и снова стучится — в stage3
add chain=input protocol=tcp dst-port=22 src-address-list=ssh-stage2 \
  action=add-src-to-address-list address-list=ssh-stage3 \
  address-list-timeout=1d comment="SSH brute-force: stage2 -> stage3"

# Если IP в stage1 и снова стучится — в stage2
add chain=input protocol=tcp dst-port=22 src-address-list=ssh-stage1 \
  action=add-src-to-address-list address-list=ssh-stage2 \
  address-list-timeout=1h comment="SSH brute-force: stage1 -> stage2"

# Первая попытка — в stage1 (timeout 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 brute-force: new -> stage1"

# === Защита Winbox (порт 8291 или ваш кастомный) ===

add chain=input protocol=tcp dst-port=8291 src-address-list=winbox-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d comment="Winbox brute-force: stage3 -> blacklist"

add chain=input protocol=tcp dst-port=8291 src-address-list=winbox-stage2 \
  action=add-src-to-address-list address-list=winbox-stage3 \
  address-list-timeout=1d comment="Winbox brute-force: stage2 -> stage3"

add chain=input protocol=tcp dst-port=8291 src-address-list=winbox-stage1 \
  action=add-src-to-address-list address-list=winbox-stage2 \
  address-list-timeout=1h comment="Winbox brute-force: stage1 -> stage2"

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 brute-force: new -> stage1"

# === Защита WebFig HTTPS (порт 443) ===

add chain=input protocol=tcp dst-port=443 src-address-list=webfig-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d comment="WebFig brute-force: stage3 -> blacklist"

add chain=input protocol=tcp dst-port=443 src-address-list=webfig-stage2 \
  action=add-src-to-address-list address-list=webfig-stage3 \
  address-list-timeout=1d comment="WebFig brute-force: stage2 -> stage3"

add chain=input protocol=tcp dst-port=443 src-address-list=webfig-stage1 \
  action=add-src-to-address-list address-list=webfig-stage2 \
  address-list-timeout=1h comment="WebFig brute-force: stage1 -> stage2"

add chain=input protocol=tcp dst-port=443 connection-state=new \
  action=add-src-to-address-list address-list=webfig-stage1 \
  address-list-timeout=1m comment="WebFig brute-force: new -> stage1"

Логика работы: при первом подключении IP попадает в stage1 на 1 минуту. Если в течение этой минуты происходит повторное подключение — IP переходит в stage2 (1 час). Ещё одна попытка из stage2 — stage3 (1 день). Из stage3 — blacklist (7 дней). Легитимный администратор подключается один раз и работает через established connection, не проходя стадии.

Шаг 5. Детектирование сканирования портов

Сканеры портов отправляют специальные комбинации TCP-флагов. Детектируем три основных типа сканирования:

[admin@MikroTik] >
/ip/firewall/filter

# === SYN Scan Detection ===
# Обнаружение SYN-сканирования по множественным SYN на разные порты
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
  src-address-list=port-scanner action=add-src-to-address-list \
  address-list=blacklist address-list-timeout=14d \
  comment="Port scanner -> blacklist"

# Порог: более 10 новых SYN за 5 секунд на разные порты
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
  action=add-src-to-address-list address-list=port-scanner \
  address-list-timeout=5s \
  comment="Detect SYN scanner (threshold)"

# === XMAS Scan (все флаги установлены) ===
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="XMAS scan -> blacklist"
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
  action=drop comment="Drop XMAS scan"

# === NULL Scan (нет флагов) ===
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="NULL scan -> blacklist"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
  action=drop comment="Drop NULL scan"

# === FIN Scan ===
add chain=input protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="FIN scan -> blacklist"
add chain=input protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg \
  action=drop comment="Drop FIN scan"

Важно размещать правила детекции сканирования перед правилами разрешения established/related.

Шаг 6. Port Knocking

Port Knocking — это техника, при которой для открытия доступа к сервису нужно "постучать" в определённую последовательность портов. Только знающий правильную последовательность получит доступ.

Реализуем Port Knocking для SSH: стучим в порты 1000 -> 2000 -> 3000, после чего SSH открывается на 30 секунд.

[admin@MikroTik] >
/ip/firewall/filter

# Шаг 3: Если IP в knock-stage2 и стучится на порт 3000 — разрешаем SSH
add chain=input protocol=tcp dst-port=3000 src-address-list=knock-stage2 \
  action=add-src-to-address-list address-list=knock-allowed \
  address-list-timeout=30s comment="Port knock: step 3 -> allowed"
add chain=input protocol=tcp dst-port=3000 action=drop \
  comment="Port knock: drop port 3000"

# Шаг 2: Если IP в knock-stage1 и стучится на порт 2000 — переход в stage2
add chain=input protocol=tcp dst-port=2000 src-address-list=knock-stage1 \
  action=add-src-to-address-list address-list=knock-stage2 \
  address-list-timeout=10s comment="Port knock: step 2"
add chain=input protocol=tcp dst-port=2000 action=drop \
  comment="Port knock: drop port 2000"

# Шаг 1: Стук на порт 1000 — начало последовательности
add chain=input protocol=tcp dst-port=1000 \
  action=add-src-to-address-list address-list=knock-stage1 \
  address-list-timeout=10s comment="Port knock: step 1"
add chain=input protocol=tcp dst-port=1000 action=drop \
  comment="Port knock: drop port 1000"

# Разрешить SSH только для IP из knock-allowed
add chain=input protocol=tcp dst-port=22 src-address-list=knock-allowed \
  action=accept comment="Allow SSH after port knock"
add chain=input protocol=tcp dst-port=22 action=drop \
  comment="Drop SSH without port knock"

Для использования Port Knocking с Linux/macOS:

[admin@MikroTik] >
# Стучим в порты последовательно
nmap -Pn --host-timeout 100 --max-retries 0 -p 1000 192.168.88.1
nmap -Pn --host-timeout 100 --max-retries 0 -p 2000 192.168.88.1
nmap -Pn --host-timeout 100 --max-retries 0 -p 3000 192.168.88.1

# Теперь SSH доступен в течение 30 секунд
ssh admin@192.168.88.1

Шаг 7. Защита от брутфорса проброшенных сервисов

Если вы пробрасываете RDP, VNC или другие сервисы через NAT — защитите их аналогично:

[admin@MikroTik] >
/ip/firewall/filter

# Защита проброшенного RDP (порт 3389) в chain=forward
add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-blacklist \
  action=drop comment="Drop RDP blacklisted"

add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-stage3 \
  action=add-src-to-address-list address-list=rdp-blacklist \
  address-list-timeout=30d comment="RDP: stage3 -> blacklist 30 days"

add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-stage2 \
  action=add-src-to-address-list address-list=rdp-stage3 \
  address-list-timeout=1d comment="RDP: stage2 -> stage3"

add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-stage1 \
  action=add-src-to-address-list address-list=rdp-stage2 \
  address-list-timeout=4h comment="RDP: stage1 -> stage2"

add chain=forward protocol=tcp dst-port=3389 connection-state=new \
  action=add-src-to-address-list address-list=rdp-stage1 \
  address-list-timeout=1m comment="RDP: new -> stage1"

Проверка

Мониторинг address-lists

[admin@MikroTik] >
# Просмотр всех заблокированных IP
/ip/firewall/address-list/print where list=blacklist

# Количество IP в blacklist
/ip/firewall/address-list/print count-only where list=blacklist

# Просмотр IP на разных стадиях (SSH)
/ip/firewall/address-list/print where list~"ssh-stage"

# Удалить конкретный IP из blacklist (если заблокировали себя)
/ip/firewall/address-list/remove [find where list=blacklist address=1.2.3.4]

Мониторинг логов

[admin@MikroTik] >
# Включить логирование попыток подключения
/system/logging/add topics=firewall,info action=memory
/system/logging/add topics=ssh,info action=memory
/system/logging/add topics=error action=memory

# Просмотр логов
/log/print where topics~"firewall"
/log/print where message~"login failure"

# Логирование заблокированных пакетов (добавить log=yes к правилу drop)
/ip/firewall/filter/set [find where comment="Drop blacklisted IPs"] \
  log=yes log-prefix="BLACKLIST"

Статистика правил firewall

[admin@MikroTik] >
# Просмотр счётчиков срабатывания правил
/ip/firewall/filter/print stats where chain=input

# Сброс счётчиков для чистого теста
/ip/firewall/filter/reset-counters-all

Проверка открытых портов извне

Для проверки, какие порты видны из интернета, используйте внешний сканер:

[admin@MikroTik] >
# С другого хоста в интернете
nmap -sS -p 22,80,443,8291,8728,8729 YOUR_PUBLIC_IP

# Проверка конкретного порта
nc -zv YOUR_PUBLIC_IP 8291

Мониторинг в реальном времени

[admin@MikroTik] >
# Наблюдение за firewall в реальном времени
/ip/firewall/filter/print stats interval=2

# Наблюдение за address-list в реальном времени
/ip/firewall/address-list/print interval=2 where list=blacklist

# Текущие подключения к роутеру
/ip/firewall/connection/print where dst-address~":8291"

Типичные ошибки

1. Заблокировал сам себя

Самая частая ошибка при настройке защиты от брутфорса. Если вы подключаетесь через Winbox и тестируете SSH-подключение, ваш IP может попасть в blacklist.

Решение: всегда добавляйте свои IP в whitelist и ставьте whitelist-правило перед всеми блокирующими правилами:

[admin@MikroTik] >
# Создать whitelist
/ip/firewall/address-list/add list=whitelist address=192.168.88.0/24 \
  comment="Local network"
/ip/firewall/address-list/add list=whitelist address=10.10.10.0/24 \
  comment="VPN network"

# Первое правило в input — пропускать whitelist
/ip/firewall/filter/add chain=input src-address-list=whitelist \
  action=accept comment="Allow whitelist" place-before=0

2. Неправильный порядок правил

Правила firewall обрабатываются сверху вниз. Если правило drop стоит перед правилом accept — трафик будет заблокирован:

[admin@MikroTik] >
# Проверка порядка правил
/ip/firewall/filter/print where chain=input

# Переместить правило на нужную позицию
/ip/firewall/filter/move [find where comment="Allow whitelist"] destination=0

Правильный порядок:

  1. Accept whitelist
  2. Drop blacklist
  3. Accept established, related
  4. Drop invalid
  5. Stage-правила брутфорса
  6. Accept нужные сервисы
  7. Drop all

3. Забыли про IPv6

Все правила выше работают только для IPv4. Если на роутере включён IPv6, атакующий может обойти защиту через IPv6:

[admin@MikroTik] >
# Проверить статус IPv6
/ipv6/settings/print

# Если IPv6 не используется — отключить
/ipv6/settings/set disable-ipv6=yes

# Если IPv6 нужен — создайте аналогичные правила
/ipv6/firewall/filter/add chain=input src-address-list=blacklist6 \
  action=drop comment="Drop blacklisted IPv6"

4. Слишком агрессивные таймауты

Если поставить address-list-timeout=1s на stage1, любое нормальное подключение может вызвать блокировку. Рекомендуемые значения:

СтадияТаймаутНазначение
stage11mФиксация первого подключения
stage21hПовторная попытка — подозрительно
stage31dТретья попытка — вероятная атака
blacklist7d-30dБлокировка подтверждённого атакующего

5. Не мониторят логи

Настроить правила мало — нужно регулярно проверять, что они работают. Настройте отправку логов на syslog-сервер:

[admin@MikroTik] >
# Настройка удалённого syslog
/system/logging/action/add name=remote-syslog target=remote \
  remote=192.168.88.100 remote-port=514

# Отправка firewall-логов на syslog
/system/logging/add topics=firewall action=remote-syslog

6. Открытые сервисы без ограничения по IP

Даже с brute-force защитой, если Winbox доступен из всего интернета — это избыточный риск. Всегда комбинируйте:

  • Ограничение по IP в /ip/service
  • Firewall правила с address-list
  • VPN для удалённого доступа

Полный пример: защита production-роутера

Собираем всё вместе в один скрипт:

[admin@MikroTik] >
# === 1. Отключаем ненужные сервисы ===
/ip/service/disable telnet,ftp,api,api-ssl,www

# === 2. Ограничиваем доступ к оставшимся сервисам ===
/ip/service/set winbox address=192.168.88.0/24,10.10.10.0/24
/ip/service/set ssh address=192.168.88.0/24,10.10.10.0/24
/ip/service/set www-ssl address=192.168.88.0/24

# === 3. Меняем порты ===
/ip/service/set winbox port=48291
/ip/service/set ssh port=42222

# === 4. Whitelist ===
/ip/firewall/address-list/add list=whitelist address=192.168.88.0/24
/ip/firewall/address-list/add list=whitelist address=10.10.10.0/24

# === 5. Firewall rules ===
/ip/firewall/filter

# Whitelist — всегда первое правило
add chain=input src-address-list=whitelist action=accept \
  comment="Allow whitelist"

# Блокировка blacklist
add chain=input src-address-list=blacklist action=drop \
  log=yes log-prefix="BLACKLIST" comment="Drop blacklisted IPs"

# Established / Related
add chain=input connection-state=established,related action=accept
add chain=input connection-state=invalid action=drop

# Brute-force protection для SSH (порт 42222)
add chain=input protocol=tcp dst-port=42222 src-address-list=ssh-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d
add chain=input protocol=tcp dst-port=42222 src-address-list=ssh-stage2 \
  action=add-src-to-address-list address-list=ssh-stage3 \
  address-list-timeout=1d
add chain=input protocol=tcp dst-port=42222 src-address-list=ssh-stage1 \
  action=add-src-to-address-list address-list=ssh-stage2 \
  address-list-timeout=1h
add chain=input protocol=tcp dst-port=42222 connection-state=new \
  action=add-src-to-address-list address-list=ssh-stage1 \
  address-list-timeout=1m

# Brute-force protection для Winbox (порт 48291)
add chain=input protocol=tcp dst-port=48291 src-address-list=winbox-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d
add chain=input protocol=tcp dst-port=48291 src-address-list=winbox-stage2 \
  action=add-src-to-address-list address-list=winbox-stage3 \
  address-list-timeout=1d
add chain=input protocol=tcp dst-port=48291 src-address-list=winbox-stage1 \
  action=add-src-to-address-list address-list=winbox-stage2 \
  address-list-timeout=1h
add chain=input protocol=tcp dst-port=48291 connection-state=new \
  action=add-src-to-address-list address-list=winbox-stage1 \
  address-list-timeout=1m

# Port scan detection
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="XMAS scan"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="NULL scan"

# ICMP с ограничением
add chain=input protocol=icmp limit=5,5:packet action=accept
add chain=input protocol=icmp action=drop

# LAN доступ
add chain=input in-interface-list=LAN action=accept

# Drop всё остальное на input
add chain=input action=drop comment="Drop all other input"

# === 6. Логирование ===
/system/logging/add topics=firewall,info action=memory
/system/logging/add topics=ssh,info action=memory

Этот набор правил обеспечивает комплексную защиту: отключены ненужные сервисы, ограничен доступ по IP, стоит многоуровневая защита от брутфорса, детектируется сканирование портов, ведётся логирование. Проверяйте blacklist и логи регулярно — хотя бы раз в неделю.

[admin@MikroTik] >
# Просмотр всех сервисов и их состояния
/ip/service/print

# Отключить Telnet — никогда не используйте его
/ip/service/disable telnet

# Отключить FTP, если не загружаете файлы через FTP
/ip/service/disable ftp

# Отключить API, если нет автоматизации
/ip/service/disable api
/ip/service/disable api-ssl

# Отключить HTTP (WebFig) — используйте только HTTPS или Winbox
/ip/service/disable www

# Отключить Bandwidth Test Server
/tool/bandwidth-server/set enabled=no
# Winbox — только из локальной сети и VPN
/ip/service/set winbox address=192.168.88.0/24,10.10.10.0/24

# SSH — только из локальной сети
/ip/service/set ssh address=192.168.88.0/24

# HTTPS WebFig — только из локальной сети
/ip/service/set www-ssl address=192.168.88.0/24
# Перенести Winbox на нестандартный порт
/ip/service/set winbox port=48291

# Перенести SSH на нестандартный порт
/ip/service/set ssh port=42222
/ip/firewall/filter

# === Блокировка IP из blacklist ===
add chain=input src-address-list=blacklist action=drop \
  comment="Drop blacklisted IPs"

# === Защита SSH (порт 22 или ваш кастомный) ===

# Если IP уже в stage3 и снова стучится — в blacklist на 7 дней
add chain=input protocol=tcp dst-port=22 src-address-list=ssh-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d comment="SSH brute-force: stage3 -> blacklist"

# Если IP в stage2 и снова стучится — в stage3
add chain=input protocol=tcp dst-port=22 src-address-list=ssh-stage2 \
  action=add-src-to-address-list address-list=ssh-stage3 \
  address-list-timeout=1d comment="SSH brute-force: stage2 -> stage3"

# Если IP в stage1 и снова стучится — в stage2
add chain=input protocol=tcp dst-port=22 src-address-list=ssh-stage1 \
  action=add-src-to-address-list address-list=ssh-stage2 \
  address-list-timeout=1h comment="SSH brute-force: stage1 -> stage2"

# Первая попытка — в stage1 (timeout 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 brute-force: new -> stage1"

# === Защита Winbox (порт 8291 или ваш кастомный) ===

add chain=input protocol=tcp dst-port=8291 src-address-list=winbox-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d comment="Winbox brute-force: stage3 -> blacklist"

add chain=input protocol=tcp dst-port=8291 src-address-list=winbox-stage2 \
  action=add-src-to-address-list address-list=winbox-stage3 \
  address-list-timeout=1d comment="Winbox brute-force: stage2 -> stage3"

add chain=input protocol=tcp dst-port=8291 src-address-list=winbox-stage1 \
  action=add-src-to-address-list address-list=winbox-stage2 \
  address-list-timeout=1h comment="Winbox brute-force: stage1 -> stage2"

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 brute-force: new -> stage1"

# === Защита WebFig HTTPS (порт 443) ===

add chain=input protocol=tcp dst-port=443 src-address-list=webfig-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d comment="WebFig brute-force: stage3 -> blacklist"

add chain=input protocol=tcp dst-port=443 src-address-list=webfig-stage2 \
  action=add-src-to-address-list address-list=webfig-stage3 \
  address-list-timeout=1d comment="WebFig brute-force: stage2 -> stage3"

add chain=input protocol=tcp dst-port=443 src-address-list=webfig-stage1 \
  action=add-src-to-address-list address-list=webfig-stage2 \
  address-list-timeout=1h comment="WebFig brute-force: stage1 -> stage2"

add chain=input protocol=tcp dst-port=443 connection-state=new \
  action=add-src-to-address-list address-list=webfig-stage1 \
  address-list-timeout=1m comment="WebFig brute-force: new -> stage1"
/ip/firewall/filter

# === SYN Scan Detection ===
# Обнаружение SYN-сканирования по множественным SYN на разные порты
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
  src-address-list=port-scanner action=add-src-to-address-list \
  address-list=blacklist address-list-timeout=14d \
  comment="Port scanner -> blacklist"

# Порог: более 10 новых SYN за 5 секунд на разные порты
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
  action=add-src-to-address-list address-list=port-scanner \
  address-list-timeout=5s \
  comment="Detect SYN scanner (threshold)"

# === XMAS Scan (все флаги установлены) ===
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="XMAS scan -> blacklist"
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
  action=drop comment="Drop XMAS scan"

# === NULL Scan (нет флагов) ===
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="NULL scan -> blacklist"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
  action=drop comment="Drop NULL scan"

# === FIN Scan ===
add chain=input protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="FIN scan -> blacklist"
add chain=input protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg \
  action=drop comment="Drop FIN scan"
/ip/firewall/filter

# Шаг 3: Если IP в knock-stage2 и стучится на порт 3000 — разрешаем SSH
add chain=input protocol=tcp dst-port=3000 src-address-list=knock-stage2 \
  action=add-src-to-address-list address-list=knock-allowed \
  address-list-timeout=30s comment="Port knock: step 3 -> allowed"
add chain=input protocol=tcp dst-port=3000 action=drop \
  comment="Port knock: drop port 3000"

# Шаг 2: Если IP в knock-stage1 и стучится на порт 2000 — переход в stage2
add chain=input protocol=tcp dst-port=2000 src-address-list=knock-stage1 \
  action=add-src-to-address-list address-list=knock-stage2 \
  address-list-timeout=10s comment="Port knock: step 2"
add chain=input protocol=tcp dst-port=2000 action=drop \
  comment="Port knock: drop port 2000"

# Шаг 1: Стук на порт 1000 — начало последовательности
add chain=input protocol=tcp dst-port=1000 \
  action=add-src-to-address-list address-list=knock-stage1 \
  address-list-timeout=10s comment="Port knock: step 1"
add chain=input protocol=tcp dst-port=1000 action=drop \
  comment="Port knock: drop port 1000"

# Разрешить SSH только для IP из knock-allowed
add chain=input protocol=tcp dst-port=22 src-address-list=knock-allowed \
  action=accept comment="Allow SSH after port knock"
add chain=input protocol=tcp dst-port=22 action=drop \
  comment="Drop SSH without port knock"
# Стучим в порты последовательно
nmap -Pn --host-timeout 100 --max-retries 0 -p 1000 192.168.88.1
nmap -Pn --host-timeout 100 --max-retries 0 -p 2000 192.168.88.1
nmap -Pn --host-timeout 100 --max-retries 0 -p 3000 192.168.88.1

# Теперь SSH доступен в течение 30 секунд
ssh admin@192.168.88.1
/ip/firewall/filter

# Защита проброшенного RDP (порт 3389) в chain=forward
add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-blacklist \
  action=drop comment="Drop RDP blacklisted"

add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-stage3 \
  action=add-src-to-address-list address-list=rdp-blacklist \
  address-list-timeout=30d comment="RDP: stage3 -> blacklist 30 days"

add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-stage2 \
  action=add-src-to-address-list address-list=rdp-stage3 \
  address-list-timeout=1d comment="RDP: stage2 -> stage3"

add chain=forward protocol=tcp dst-port=3389 src-address-list=rdp-stage1 \
  action=add-src-to-address-list address-list=rdp-stage2 \
  address-list-timeout=4h comment="RDP: stage1 -> stage2"

add chain=forward protocol=tcp dst-port=3389 connection-state=new \
  action=add-src-to-address-list address-list=rdp-stage1 \
  address-list-timeout=1m comment="RDP: new -> stage1"
# Просмотр всех заблокированных IP
/ip/firewall/address-list/print where list=blacklist

# Количество IP в blacklist
/ip/firewall/address-list/print count-only where list=blacklist

# Просмотр IP на разных стадиях (SSH)
/ip/firewall/address-list/print where list~"ssh-stage"

# Удалить конкретный IP из blacklist (если заблокировали себя)
/ip/firewall/address-list/remove [find where list=blacklist address=1.2.3.4]
# Включить логирование попыток подключения
/system/logging/add topics=firewall,info action=memory
/system/logging/add topics=ssh,info action=memory
/system/logging/add topics=error action=memory

# Просмотр логов
/log/print where topics~"firewall"
/log/print where message~"login failure"

# Логирование заблокированных пакетов (добавить log=yes к правилу drop)
/ip/firewall/filter/set [find where comment="Drop blacklisted IPs"] \
  log=yes log-prefix="BLACKLIST"
# Просмотр счётчиков срабатывания правил
/ip/firewall/filter/print stats where chain=input

# Сброс счётчиков для чистого теста
/ip/firewall/filter/reset-counters-all
# С другого хоста в интернете
nmap -sS -p 22,80,443,8291,8728,8729 YOUR_PUBLIC_IP

# Проверка конкретного порта
nc -zv YOUR_PUBLIC_IP 8291
# Наблюдение за firewall в реальном времени
/ip/firewall/filter/print stats interval=2

# Наблюдение за address-list в реальном времени
/ip/firewall/address-list/print interval=2 where list=blacklist

# Текущие подключения к роутеру
/ip/firewall/connection/print where dst-address~":8291"
# Создать whitelist
/ip/firewall/address-list/add list=whitelist address=192.168.88.0/24 \
  comment="Local network"
/ip/firewall/address-list/add list=whitelist address=10.10.10.0/24 \
  comment="VPN network"

# Первое правило в input — пропускать whitelist
/ip/firewall/filter/add chain=input src-address-list=whitelist \
  action=accept comment="Allow whitelist" place-before=0
# Проверка порядка правил
/ip/firewall/filter/print where chain=input

# Переместить правило на нужную позицию
/ip/firewall/filter/move [find where comment="Allow whitelist"] destination=0
# Проверить статус IPv6
/ipv6/settings/print

# Если IPv6 не используется — отключить
/ipv6/settings/set disable-ipv6=yes

# Если IPv6 нужен — создайте аналогичные правила
/ipv6/firewall/filter/add chain=input src-address-list=blacklist6 \
  action=drop comment="Drop blacklisted IPv6"
# Настройка удалённого syslog
/system/logging/action/add name=remote-syslog target=remote \
  remote=192.168.88.100 remote-port=514

# Отправка firewall-логов на syslog
/system/logging/add topics=firewall action=remote-syslog
# === 1. Отключаем ненужные сервисы ===
/ip/service/disable telnet,ftp,api,api-ssl,www

# === 2. Ограничиваем доступ к оставшимся сервисам ===
/ip/service/set winbox address=192.168.88.0/24,10.10.10.0/24
/ip/service/set ssh address=192.168.88.0/24,10.10.10.0/24
/ip/service/set www-ssl address=192.168.88.0/24

# === 3. Меняем порты ===
/ip/service/set winbox port=48291
/ip/service/set ssh port=42222

# === 4. Whitelist ===
/ip/firewall/address-list/add list=whitelist address=192.168.88.0/24
/ip/firewall/address-list/add list=whitelist address=10.10.10.0/24

# === 5. Firewall rules ===
/ip/firewall/filter

# Whitelist — всегда первое правило
add chain=input src-address-list=whitelist action=accept \
  comment="Allow whitelist"

# Блокировка blacklist
add chain=input src-address-list=blacklist action=drop \
  log=yes log-prefix="BLACKLIST" comment="Drop blacklisted IPs"

# Established / Related
add chain=input connection-state=established,related action=accept
add chain=input connection-state=invalid action=drop

# Brute-force protection для SSH (порт 42222)
add chain=input protocol=tcp dst-port=42222 src-address-list=ssh-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d
add chain=input protocol=tcp dst-port=42222 src-address-list=ssh-stage2 \
  action=add-src-to-address-list address-list=ssh-stage3 \
  address-list-timeout=1d
add chain=input protocol=tcp dst-port=42222 src-address-list=ssh-stage1 \
  action=add-src-to-address-list address-list=ssh-stage2 \
  address-list-timeout=1h
add chain=input protocol=tcp dst-port=42222 connection-state=new \
  action=add-src-to-address-list address-list=ssh-stage1 \
  address-list-timeout=1m

# Brute-force protection для Winbox (порт 48291)
add chain=input protocol=tcp dst-port=48291 src-address-list=winbox-stage3 \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=7d
add chain=input protocol=tcp dst-port=48291 src-address-list=winbox-stage2 \
  action=add-src-to-address-list address-list=winbox-stage3 \
  address-list-timeout=1d
add chain=input protocol=tcp dst-port=48291 src-address-list=winbox-stage1 \
  action=add-src-to-address-list address-list=winbox-stage2 \
  address-list-timeout=1h
add chain=input protocol=tcp dst-port=48291 connection-state=new \
  action=add-src-to-address-list address-list=winbox-stage1 \
  address-list-timeout=1m

# Port scan detection
add chain=input protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="XMAS scan"
add chain=input protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg \
  action=add-src-to-address-list address-list=blacklist \
  address-list-timeout=14d comment="NULL scan"

# ICMP с ограничением
add chain=input protocol=icmp limit=5,5:packet action=accept
add chain=input protocol=icmp action=drop

# LAN доступ
add chain=input in-interface-list=LAN action=accept

# Drop всё остальное на input
add chain=input action=drop comment="Drop all other input"

# === 6. Логирование ===
/system/logging/add topics=firewall,info action=memory
/system/logging/add topics=ssh,info action=memory
IP / Защита MikroTik от брутфорса и сканирования портов