Обновлено: 25.03.2026

Лайфхаки RouterOS 7

Pro TipsPerformanceDebugHidden Features

Производительность и оптимизация

IRQ affinity — привязка прерываний к ядрам CPU

На многоядерных устройствах (CCR, RB5009) сетевые прерывания по умолчанию могут обрабатываться одним ядром. Ручная привязка распределяет нагрузку:

# Посмотреть текущее распределение прерываний
/system/resource/irq/print

# Привязать ether1 к CPU 0, ether2 к CPU 1
/system/resource/irq
set [find users~"ether1"] cpu=0
set [find users~"ether2"] cpu=1RouterOS CLI
💡
На CCR2004/CCR2116 распределяйте WAN-интерфейсы и VPN-туннели по разным ядрам. Это может дать прирост до 30-40% на IPsec/WireGuard.

FastTrack hw-offload — аппаратное ускорение

На поддерживаемых устройствах (hAP ax2/3, RB5009, CCR2004) FastTrack с hw-offload=yes переносит трафик на switch-чип — почти wire-speed без CPU:

/ip/firewall/filter
add chain=forward action=fasttrack-connection \
    connection-state=established,related hw-offload=yes
add chain=forward action=accept \
    connection-state=established,relatedRouterOS CLI

FastPath — обход firewall для максимальной скорости

FastPath обрабатывает пакеты в ядре минуя CPU-intensive обработку. Работает только когда нет mangle, queue, IPsec policy, conntrack:

# Проверить, работает ли FastPath на интерфейсе
/interface/ethernet/print stats
# Смотрите колонку "fp-rx-byte" и "fp-tx-byte" — если растёт, FastPath работает

# Включить FastPath для bridge (отключает STP!)
/interface/bridge/set bridge-lan fast-forward=yesRouterOS CLI

FastTrack + QoS — компромисс через connection-bytes

Нужны и очереди, и скорость? FastTrack только для крупных потоков (>1 MB), мелкий трафик (DNS, VoIP) идёт через очереди:

/ip/firewall/filter/add chain=forward \
    action=fasttrack-connection \
    connection-state=established,related \
    connection-bytes=1000000-0 \
    hw-offload=yes \
    comment="FastTrack only large flows >1MB"RouterOS CLI
⚠️
FastPath vs FastTrack: FastPath — ниже уровнем (L2/L3, полный обход firewall). FastTrack — conntrack-based (только для established/related, firewall частично работает). Не путайте — они решают разные задачи.

Оптимизация MTU для туннелей

# Формулы расчёта MTU:
# WireGuard:   1500 - 60 (WG overhead) - 20 (IPv4) = 1420
# WireGuard IPv6: 1500 - 60 - 40 (IPv6) = 1400
# PPPoE + WG:  1492 - 60 - 20 = 1412
# GRE:         1500 - 24 (GRE) - 20 (IPv4) = 1456
# L2TP/IPsec:  1500 - 50 (L2TP) - 52 (ESP) - 20 = 1378

# Автоматический clamp MSS (обязательно при туннелях!)
/ip/firewall/mangle/add chain=forward \
    protocol=tcp tcp-flags=syn \
    action=change-mss new-mss=clamp-to-pmtu \
    passthrough=yes comment="Clamp MSS"RouterOS CLI

Connection Tracking — тонкая настройка

Увеличение таблицы conntrack

По умолчанию max-entries=16384. Для NAT-роутера с сотнями клиентов этого мало:

# Текущее использование
/ip/firewall/connection/print count-only

# Увеличить лимит (при 512 MB RAM можно до 131072)
/ip/firewall/connection/tracking/set max-entries=65536

# Уменьшить таймауты для агрессивного освобождения
/ip/firewall/connection/tracking/set \
    tcp-established-timeout=1h \
    udp-timeout=30s \
    udp-stream-timeout=2m \
    tcp-close-wait-timeout=30s \
    tcp-time-wait-timeout=15sRouterOS CLI
🚨
Переполнение conntrack table — частая причина «интернет пропал у всех». Мониторьте /ip/firewall/connection/print count-only и настройте алерт при достижении 80% от max-entries.

Скрипт мониторинга conntrack с оповещением

# Scheduler: каждые 5 минут проверяем conntrack
/system/script/add name=conntrack-monitor source={
    :local maxEntries [/ip/firewall/connection/tracking/get max-entries]
    :local curEntries [/ip/firewall/connection/print count-only]
    :local usage ($curEntries * 100 / $maxEntries)
    :if ($usage > 80) do={
        :log warning "CONNTRACK: $usage% ($curEntries/$maxEntries)"
        # Опционально: отправить в Telegram (см. раздел скриптов)
    }
}

/system/scheduler/add name=conntrack-check \
    interval=5m on-event=conntrack-monitorRouterOS Script

Секреты отладки

/tool/profile — CPU profiler

Показывает, на что тратится CPU. Незаменим при диагностике «роутер тормозит»:

# Запуск профайлера (показывает процессы и % CPU)
/tool/profile

# Типичные «пожиратели» CPU:
# firewall   — слишком много правил или нет FastTrack
# encrypting — IPsec/WireGuard без аппаратного ускорения
# bridging   — STP или flooding на bridge
# dns        — роутер используется как DNS-резолвер для сотен клиентов
# queuing    — сложные queue tree правилаRouterOS CLI

Packet Sniffer с фильтрацией в файл

# Захват только DNS-трафика на WAN в pcap-файл
/tool/sniffer/set \
    filter-interface=ether1 \
    filter-port=53 \
    filter-protocol=udp \
    file-name=dns-capture \
    file-limit=10000KiB \
    streaming-enabled=no

/tool/sniffer/start
# ... подождать ...
/tool/sniffer/stop

# Скачать файл через Winbox: Files → dns-capture.pcap
# Или по SFTP: sftp admin@192.168.88.1:/dns-capture.pcapRouterOS CLI

Streaming sniffer в Wireshark в реальном времени

# На роутере: включить streaming на IP вашего ПК
/tool/sniffer/set \
    streaming-enabled=yes \
    streaming-server=192.168.88.100:37008

/tool/sniffer/start

# На ПК: запуск Wireshark для приёма потока
# Capture → Options → выбрать TZSP interface
# Или: wireshark -i <interface> -f "udp port 37008"RouterOS + Wireshark

Torch vs Traffic Flow — когда что использовать

ИнструментНазначениеКогда использовать
/tool/torchReal-time трафик на интерфейсе«Кто сейчас жрёт канал?»
/tool/snifferЗахват пакетов (pcap)Глубокая диагностика конкретной проблемы
/ip/traffic-flowNetFlow/IPFIX экспортДолгосрочная статистика, учёт трафика
/tool/profileCPU profiler«Почему роутер загружен?»
/tool/ping speedBandwidth testПроверка пропускной способности канала

Продвинутые скрипты

Автоматический failover через скрипт (без routing)

# Проверяем основной канал и переключаем gateway
/system/script/add name=wan-failover source={
    :local mainGw "203.0.113.1"
    :local backupGw "198.51.100.1"
    :local testHost "8.8.8.8"

    :local pingResult [/ping $testHost count=3 interface=ether1]
    :if ($pingResult = 0) do={
        :log warning "WAN1 DOWN — switching to backup"
        /ip/route/set [find comment="default-main"] disabled=yes
        /ip/route/set [find comment="default-backup"] disabled=no
    } else={
        /ip/route/set [find comment="default-main"] disabled=no
        /ip/route/set [find comment="default-backup"] disabled=yes
    }
}

/system/scheduler/add name=failover-check \
    interval=30s on-event=wan-failoverRouterOS Script

Telegram-уведомления

# Отправка сообщения в Telegram через бота
/system/script/add name=telegram-notify source={
    :local botToken "123456:ABC-DEF..."
    :local chatId "-100123456789"
    :local message "RouterOS: $[/system/identity/get name] alert!"

    /tool/fetch url="https://api.telegram.org/bot$botToken/sendMessage" \
        http-method=post \
        http-data="chat_id=$chatId&text=$message" \
        keep-result=no
}

# Вызов из другого скрипта:
# /system/script/run telegram-notifyRouterOS Script

Автоочистка DNS-кеша при смене WAN IP

/system/script/add name=dns-flush-on-ip-change source={
    :global lastWanIp
    :local currentIp [/ip/address/get [find interface=ether1] address]
    :if ($currentIp != $lastWanIp) do={
        :set lastWanIp $currentIp
        /ip/dns/cache/flush
        :log info "WAN IP changed to $currentIp, DNS cache flushed"
    }
}

/system/scheduler/add name=dns-monitor interval=1m \
    on-event=dns-flush-on-ip-changeRouterOS Script

JSON-парсинг в скриптах (ROS 7)

# RouterOS 7 поддерживает :deserialize для разбора JSON!
:local jsonStr "{\"name\":\"test\",\"value\":42}"
:local parsed [:deserialize from=json value=$jsonStr]
:put ($parsed->"name")
# Вывод: test

# Полезно для интеграции с REST API через /tool/fetch
/tool/fetch url="https://api.example.com/data" \
    dst-path=api-response.json
:local content [/file/get api-response.json contents]
:local data [:deserialize from=json value=$content]RouterOS Script

Firewall-трюки

Raw table — DDoS-защита ДО conntrack

Таблица raw обрабатывает пакеты до connection tracking. Дропнутые здесь пакеты не создают conntrack-записей — экономия CPU и памяти под атакой:

# SYN flood protection в raw table
/ip/firewall/raw
add chain=prerouting src-address-list=ddos-blackhole action=drop
add chain=prerouting protocol=tcp tcp-flags=syn \
    limit=200,5:packet action=accept
add chain=prerouting protocol=tcp tcp-flags=syn \
    action=drop comment="SYN flood protection"RouterOS CLI

Динамические address-list через DNS

Автоматическое обновление списка IP по доменному имени — идеально для блокировки/разрешения облачных сервисов:

# Address-list, который автоматически резолвит домен
/ip/firewall/address-list/add list=allowed-services \
    address=api.example.com comment="auto-resolves"

# RouterOS автоматически резолвит FQDN и обновляет
# IP-адреса при изменении DNS-записей!

# Использование в firewall:
/ip/firewall/filter/add chain=forward \
    dst-address-list=allowed-services action=acceptRouterOS CLI
💡
Это работает из коробки! MikroTik автоматически делает DNS-lookup и обновляет IP в address-list. Идеально для доступа к сервисам, которые часто меняют IP (CDN, облака).

Port Knocking — скрытый доступ к управлению

# Трёхэтапный port knock: 1234 → 5678 → 9012
# После правильной последовательности открывается SSH на 60 сек

/ip/firewall/filter
add chain=input protocol=tcp dst-port=1234 \
    action=add-src-to-address-list \
    address-list=knock-stage1 address-list-timeout=15s

add chain=input protocol=tcp dst-port=5678 \
    src-address-list=knock-stage1 \
    action=add-src-to-address-list \
    address-list=knock-stage2 address-list-timeout=15s

add chain=input protocol=tcp dst-port=9012 \
    src-address-list=knock-stage2 \
    action=add-src-to-address-list \
    address-list=knock-granted address-list-timeout=1m

# Разрешить SSH только для «постучавших»
add chain=input protocol=tcp dst-port=22 \
    src-address-list=knock-granted action=accept

# Клиент стучит: nmap -Pn --host-timeout 201 -p 1234,5678,9012 router-ipRouterOS CLI

Автобан сканеров портов

# Ловушка на нестандартных портах: кто сканирует — в бан
/ip/firewall/filter/add chain=input protocol=tcp \
    dst-port=23,3389,5900,445,135 \
    action=add-src-to-address-list \
    address-list=port-scanners address-list-timeout=7d \
    comment="trap: honeypot ports"

/ip/firewall/raw/add chain=prerouting \
    src-address-list=port-scanners action=drop \
    comment="drop port scanners"RouterOS CLI

Аппаратные хитрости

SFP-модули: проверка совместимости и диагностика

# Полная информация о вставленном SFP модуле
/interface/ethernet/monitor sfp-sfpplus1 once

# Ключевые параметры для диагностики:
# sfp-temperature — нормально 25-65°C, >70°C — перегрев
# sfp-tx-power    — мощность передачи (dBm)
# sfp-rx-power    — мощность приёма (dBm, <-30 — проблема)
# sfp-supply-voltage — питание модуля (3.3V ±5%)RouterOS CLI
ℹ️
Если SFP не определяется: попробуйте /interface/ethernet/set sfp-sfpplus1 auto-negotiation=no speed=1Gbps. Некоторые SFP-модули (особенно BiDi) не поддерживают auto-negotiation корректно.

Управление PoE через скрипты

# Перезагрузить IP-камеру через PoE power cycle
/interface/ethernet/poe/set ether5 poe-out=off
:delay 5s
/interface/ethernet/poe/set ether5 poe-out=auto-on

# Мониторинг потребления PoE
/interface/ethernet/poe/monitor ether5 once
# Показывает: poe-out-voltage, poe-out-current, poe-out-powerRouterOS CLI

LED-индикация как мониторинг

# Мигать LED при загрузке CPU > 80%
/system/leds/add leds=user-led type=on \
    interface=""

# Или: LED горит при наличии интернета
/system/leds/add leds=led1 type=interface-status \
    interface=ether1RouterOS CLI

Контейнеры — практические рецепты

AdGuard Home в контейнере

# Подготовка: включить контейнеры и создать VETH
/container/config/set registry-url=https://registry-1.docker.io \
    tmpdir=usb1/pull

/interface/veth/add name=veth-adguard \
    address=172.17.0.2/24 gateway=172.17.0.1

/interface/bridge/port/add bridge=containers interface=veth-adguard

# Запуск контейнера
/container/add remote-image=adguard/adguardhome:latest \
    interface=veth-adguard \
    root-dir=usb1/adguard \
    start-on-boot=yes

# DNS роутера → AdGuard
/ip/dns/set servers=172.17.0.2RouterOS CLI

Prometheus Node Exporter для мониторинга

# Запускаем node-exporter для сбора метрик
/interface/veth/add name=veth-metrics \
    address=172.17.0.3/24 gateway=172.17.0.1

/container/add remote-image=prom/node-exporter:latest \
    interface=veth-metrics \
    root-dir=usb1/node-exporter \
    start-on-boot=yes

# Метрики доступны на http://172.17.0.3:9100/metrics
# Добавьте в prometheus.yml как targetRouterOS CLI

WireGuard — выжимаем максимум

Persistent Keepalive для NAT

# Если одна сторона за NAT — keepalive обязателен
/interface/wireguard/peers/set [find endpoint-address="..."] \
    persistent-keepalive=25s

# 25 секунд — оптимальное значение
# Меньше 20 — лишняя нагрузка, больше 30 — NAT может дропнуть сессиюRouterOS CLI

Множественные endpoint для failover

# Скрипт: автоматическая смена endpoint при падении туннеля
/system/script/add name=wg-failover source={
    :local peer [/interface/wireguard/peers/find comment="main-peer"]
    :local mainEp "203.0.113.1"
    :local backupEp "198.51.100.1"

    # Пинг через WG интерфейс
    :local result [/ping 10.0.0.1 count=3 interface=wg-tunnel]
    :if ($result = 0) do={
        :local curEp [/interface/wireguard/peers/get $peer endpoint-address]
        :if ($curEp = $mainEp) do={
            /interface/wireguard/peers/set $peer \
                endpoint-address=$backupEp
            :log warning "WG: switched to backup endpoint"
        } else={
            /interface/wireguard/peers/set $peer \
                endpoint-address=$mainEp
            :log warning "WG: switched to main endpoint"
        }
    }
}RouterOS Script

Split tunneling — только часть трафика через WireGuard

# Только трафик определённых клиентов в VPN, остальное напрямую
/ip/firewall/mangle/add chain=prerouting \
    src-address-list=vpn-clients \
    dst-address-list=!local-networks \
    action=mark-routing new-routing-mark=via-wg \
    passthrough=no

/ip/route/add dst-address=0.0.0.0/0 gateway=wg-tunnel \
    routing-table=via-wg

# Добавляем клиентов в список
/ip/firewall/address-list/add list=vpn-clients \
    address=192.168.88.50RouterOS CLI

Резервное копирование и восстановление

Автоматический бэкап на email

# Еженедельный бэкап на email
/system/script/add name=auto-backup source={
    :local hostname [/system/identity/get name]
    :local date [/system/clock/get date]
    :local filename "$hostname-$date"

    # Создать бэкап (бинарный) и экспорт (текстовый)
    /system/backup/save name=$filename
    /export file=$filename

    # Отправить по email
    /tool/e-mail/send \
        to="admin@company.com" \
        subject="Backup: $hostname ($date)" \
        body="Auto-backup from $hostname" \
        file="$filename.backup,$filename.rsc"

    # Удалить локальные копии через 5 минут
    :delay 5m
    /file/remove "$filename.backup"
    /file/remove "$filename.rsc"
}

/system/scheduler/add name=weekly-backup \
    interval=7d on-event=auto-backupRouterOS Script
⚠️
.backup vs .rsc: Файл .backup — бинарный, восстанавливается только на том же устройстве. Файл .rsc — текстовый экспорт, можно редактировать и применять на другом устройстве. Храните оба!

Малоизвестные возможности

Безопасный режим (Safe Mode)

В CLI нажмите Ctrl+X для входа в Safe Mode. Все изменения будут автоматически отменены, если:

💡
Всегда используйте Safe Mode при удалённой настройке firewall! Если случайно заблокируете себя — изменения откатятся через ~9 минут.

Scheduler с on-event в одну строку

# Перезагрузка каждое воскресенье в 4:00
/system/scheduler/add name=weekly-reboot \
    start-time=04:00:00 interval=7d \
    on-event="/system/reboot"

# Обновление прошивки с автопроверкой каждый день
/system/scheduler/add name=check-update \
    interval=1d \
    on-event="/system/package/update/check-for-updates once"RouterOS CLI

Быстрый экспорт только изменённых настроек

# Показать только то, что отличается от заводских настроек
/export compact

# Экспорт конкретного раздела
/ip/firewall/filter/export
/interface/wireguard/export

# Verbose-экспорт (включает дефолтные значения)
/export verboseRouterOS CLI

DHCP lease-script — автоматика при подключении клиентов

# Скрипт выполняется при каждом DHCP lease событии
# Доступные переменные: $leaseBound (1=assign, 0=release)
# $leaseActIP, $leaseActMAC, $leaseServerName

/ip/dhcp-server/set dhcp-lan lease-script={
    :if ($leaseBound = 1) do={
        :log info "DHCP: $leaseActMAC got $leaseActIP"
        # Можно добавить MAC в address-list, отправить уведомление и т.д.
    } else={
        :log info "DHCP: $leaseActMAC released $leaseActIP"
    }
}RouterOS Script

Скрытый REST API (RouterOS 7.1+)

# RouterOS 7 имеет встроенный REST API!
# Включить: /ip/service/set www-ssl disabled=no

# Получить список интерфейсов:
# curl -k -u admin:password https://192.168.88.1/rest/interface

# Добавить firewall правило через REST:
# curl -k -u admin:password -X PUT \
#   https://192.168.88.1/rest/ip/firewall/filter \
#   -d '{"chain":"input","action":"accept","protocol":"tcp","dst-port":"8291"}'

# Мониторинг через REST:
# curl -k -u admin:password \
#   https://192.168.88.1/rest/system/resourceREST API
🚨
REST API использует те же credentials что и Winbox/SSH. Обязательно ограничьте доступ к www-ssl через /ip/service/set www-ssl address=192.168.88.0/24 и используйте TLS-сертификат.

DNS-over-HTTPS (DoH) — шифрованные DNS-запросы

# Импортируем корневой сертификат
/tool/fetch url="https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem"
/certificate/import file-name=DigiCertGlobalRootG2.crt.pem

# Включаем DoH
/ip/dns/set use-doh-server=https://cloudflare-dns.com/dns-query \
    verify-doh-cert=yesRouterOS CLI

LED Dark Mode — полное отключение индикаторов

# Мгновенное отключение всех LED (ROS 7)
/system/leds/settings/set all-leds-off=immediate

# Или по расписанию (ночью выключить, утром включить):
/system/scheduler/add name=leds-off start-time=23:00 \
    interval=1d on-event="/system/leds/settings/set all-leds-off=immediate"
/system/scheduler/add name=leds-on start-time=07:00 \
    interval=1d on-event="/system/leds/settings/set all-leds-off=never"RouterOS CLI

LACP Bonding — агрегация каналов

# 802.3ad (LACP) bonding для удвоения пропускной способности
/interface/bonding/add name=bond0 \
    slaves=ether3,ether4 mode=802.3ad \
    transmit-hash-policy=layer-3-and-4 \
    lacp-rate=fast link-monitoring=mii \
    mii-interval=100msRouterOS CLI

Supout.rif — полная диагностика в одном файле

# Генерирует файл с полной диагностикой устройства
/system/sup-output
# Файл supout.rif можно загрузить на mikrotik.com/client/supout
# для автоматического анализа — полезно даже без тикета в поддержкуRouterOS CLI