Защита MikroTik от брутфорса и сканирования портов
MikroTik RouterOS — популярная цель для автоматических атак. По данным мониторинга honeypot-серверов, один MikroTik с белым IP получает в среднем 3000-5000 попыток подключения в сутки на стандартные порты. Причина проста: Winbox (порт 8291), SSH (порт 22) и WebFig (порт 80/443) — хорошо известные сервисы, а ботнеты сканируют весь диапазон IPv4 за считанные часы. В этом руководстве построим многоуровневую защиту от брутфорса и сканирования портов на RouterOS 7.20+.
Описание проблемы
Почему MikroTik — мишень
Роутеры MikroTik работают круглосуточно, имеют белый IP-адрес и предоставляют несколько сервисов управления по умолчанию. Стандартная установка RouterOS открывает:
| Сервис | Порт по умолчанию | Протокол | Риск |
|---|---|---|---|
| Winbox | 8291 | TCP | Высокий — основной инструмент управления |
| SSH | 22 | TCP | Высокий — универсальный доступ |
| WebFig | 80 / 443 | TCP | Средний — веб-интерфейс |
| API | 8728 | TCP | Высокий — программный доступ |
| API-SSL | 8729 | TCP | Высокий — программный доступ |
| FTP | 21 | TCP | Средний — загрузка файлов |
| Telnet | 23 | TCP | Критический — открытый текст |
| BTest | 2000 | TCP | Низкий — тест пропускной способности |
Реальный пример: на тестовом роутере с белым 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
Правильный порядок:
- Accept whitelist
- Drop blacklist
- Accept established, related
- Drop invalid
- Stage-правила брутфорса
- Accept нужные сервисы
- 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, любое нормальное подключение может вызвать блокировку. Рекомендуемые значения:
| Стадия | Таймаут | Назначение |
|---|---|---|
| stage1 | 1m | Фиксация первого подключения |
| stage2 | 1h | Повторная попытка — подозрительно |
| stage3 | 1d | Третья попытка — вероятная атака |
| blacklist | 7d-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 и логи регулярно — хотя бы раз в неделю.
# Просмотр всех сервисов и их состояния /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