Синхронизация настроек mikrotik master-slave
Постановка задачи
Есть два роутера 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 mangle remove [/ip firewall mangle find dynamic=no] /ip firewall address-list remove [/ip firewall address-list find dynamic=no] /import $config /file remove $config } else { :put "Config form master ($config) not found" }
На slave нужно создать пользователя с разрешением на ftp, и добавить скрипты в sheduler (на мастер можно раз в сутки, на slave раз в час).
Монитоинг в zabbix
Для мониторинга нам понадобится linux машина (можно использовать сам сервер zabbix). Разместим там скрипт, который будет получать по ssh комменатий к листу sync_timestamp
с обоих микротиков и сравнивать. Результат будет отпправляться в zabbix через zabbix-sender.
Скрипт /etc/zabbix/scripts/watch_mikrotik_sync.pl
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #! /usr/bin/perl use strict; # # Config # my $fw1 = 'zabbix@192.168.1.8'; my $fw2 = 'zabbix@192.168.1.9'; my $zabbix_sender = "/usr/bin/zabbix_sender"; my $zabbix_server = "127.0.0.1"; my $zabbix_host = "New-FW2"; # Host в заббиксе my $zabbix_key = "mikrotik_slave-sync"; # Ключ в заббиксе $/ = "\r\n"; # this set a windows line separator to chomp # # Variables # my $fw1_timestamp; my $fw2_timestamp; # # Main program # $fw1_timestamp = `ssh $fw1 "/ip firewall address-list print brief" | grep timestamp: | awk '{print \$5}'`; chomp $fw1_timestamp; $fw2_timestamp = `ssh $fw2 "/ip firewall address-list print brief" | grep timestamp: | awk '{print \$5}'`; chomp $fw2_timestamp; if ( $fw1_timestamp ne $fw2_timestamp ) { &zabbix_send ("ERROR: fw1_timestamp:$fw1_timestamp NOT EQUALS fw2_timestamp:$fw2_timestamp"); } else { &zabbix_send ("OK: fw1_timestamp:$fw1_timestamp EQUALS fw2_timestamp:$fw2_timestamp"); } sub zabbix_send { my $message = shift; print "$message\n"; `$zabbix_sender -vv -z $zabbix_server -s $zabbix_host -k $zabbix_key -o "$message"`; } |
Пользователь, под которым запускается скприт должен иметь доступ на роутер по ssh без пароля (инструкция) с правами read
Шаблон для zabbix 4: Template_Mikrotik-sync.zip
Скриншоты
Enjoy!