Постановка задачи
Есть два роутера mikrotik сконфигурированных в отказоустойчивой конфигурации при помощи VRRP. Необходимо синхронизировать конфигурацию Firewall с мастера на slave.
Решение
На мастере будет запускаться (через sheduler) скрипт, который будет делать экспорт конфигурации в файл и затем будет заливать его на slave по ftp.
На slave будет запускаться скрипт, который импортирует конфигурацию из залитого с мастера файла.
Для проверки синхронизации в разделе /ip firewall address-list будет создаваться фиктивный лист с названием sync_timestamp (в состоянии disabled). Во время экспорта в комментарий к указанному листу будет добавлена дата и время экспорта. Таким образом по этому листу можно сверять версии конфигурации.
Скрипт export_firewall_to_slave на мастере:
:local ftpuser "user"
:local ftppassword "password"
:local ftphost "192.168..."
:local config "master"
# set timestamp for monitoring
:if ( [:len [/ip firewall address-list find where list=sync_timestamp address="0.0.0.0" disabled=yes]] = 0 ) do={
/ip firewall address-list add list=sync_timestamp address="0.0.0.0" disabled=yes
}
:local date [/system clock get date]
:local time [/system clock get time]
:local timestamp "$date_$time"
/ip firewall address-list set [/ip firewall address-list find where list=sync_timestamp address="0.0.0.0" disabled=yes] comment="timestamp: $timestamp"
#export config
/ip firewall
export file="$config"
/
# put config to slave
tool fetch address=$ftphost user=$ftpuser password=$ftppassword mode=ftp src-path=($config.".rsc") dst-path=($config.".rsc") upload=yes;
Скрипт apply_master_config на slave:
:local config "master.rsc"
:if ([:len [/file find name=$config]] > 0) do={
:put "Found config from master!"
/ip firewall filter remove [/ip firewall filter find dynamic=no]
/ip firewall nat remove [/ip firewall nat find dynamic=no]
/ip firewall raw remove [/ip firewall raw find dynamic=no]
/ip firewall mangle remove [/ip firewall mangle find dynamic=no]
/ip firewall address-list remove [/ip firewall address-list find dynamic=no]
/ip firewall layer7-protocol remove [/ip firewall layer7-protocol find]
/import $config
/file remove $config
} else { :put "Config form master ($config) not found" }
На slave нужно создать пользователя с разрешением на ftp, и добавить скрипты в sheduler (на мастер можно раз в сутки, на slave раз в час).
Эта инструкция была найдена на просторах интернета (https://valynkin.ru/sinhronizaciya-nastroek-mikrotik-master-slave.html?ysclid=ltofhwupla676540643)
Ну и как обычно, скрипт приема пришлось дорабатывать. Я выложил уже доработанную версию, в оригинале не очищало 2 таблицы, и импорт падал с ошибкой параметр существует. При этом остальные правила оказывались удаленными