Go to content Go to menu Go to search

Синхронизация настроек 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

Скриншоты

enlarge enlarge

Enjoy!


при публикации материалов с данного сайта обратная ссылка на сайт обязательна.
valynkin.ru © no rights reserved