Лайфхаки RouterOS 7
Производительность и оптимизация
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
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
Оптимизация 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 с оповещением
# 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/torch | Real-time трафик на интерфейсе | «Кто сейчас жрёт канал?» |
| /tool/sniffer | Захват пакетов (pcap) | Глубокая диагностика конкретной проблемы |
| /ip/traffic-flow | NetFlow/IPFIX экспорт | Долгосрочная статистика, учёт трафика |
| /tool/profile | CPU profiler | «Почему роутер загружен?» |
| /tool/ping speed | Bandwidth 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
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
Управление 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
Малоизвестные возможности
Безопасный режим (Safe Mode)
В CLI нажмите Ctrl+X для входа в Safe Mode. Все изменения будут автоматически отменены, если:
- Вы потеряете связь с роутером
- Другой администратор отменит safe mode
- Пройдёт 9 минут без подтверждения (Ctrl+X повторно)
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
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