Zabbix — мониторинг Mikrotik

"mikrotik_logo"

Понадобилось мониторить клиентское оборудование (MikroTik). Установил Zabbix и задался вопросом о том как это всё мониторить.

Самих роутеров чуть больше десятка, один из них в центральном офисе а остальные по средствам PPPtP+EoIP подключаются к нему — образуя чудесную, локальную сеть.

Всё это добро досталось мне в наследство, некоторые вещи в конфигурации меня не устраивают но пока трогать нельзя :(

Так как я не могу (точнее не хочу) поставить сервер мониторинга у клента в сети да и PPPtP соединение также нет желание постоянно держать, то мониторить придётся удалённо и тут возникают нюансы с безопасностью и т.п..

Сходу решил использовать SNMP v3 — так-как он поддерживает авторизацию и можно спокойно выставить порт в эти ваши интернеты. Но что-то пошло не так … :)

Сделав шаблон для Zabbix и всё настроив, я начал создавать узлы.

Хосты определились и даже начали грузится данные, но смущало то, что данные или подтягивались не полностью или хосты вообще отваливались через некоторое время и так по кругу.

Порылся по интернетам и почитав форумы, поспрашивал в Twitter, вышел на то, что MikroTik некорректно обрабатывает «Массовые запросы», поправил настройки хостов и снял галку «Использовать массовые запросы» (по умолчанию стоит). Ситуация вроде наладилась, данные стали подружатся корректно но часть хостов всё равно отваливалось через некоторое время, час/два повисит и обратно подключается. Проверил с помощью snmpwalk , все данные корректно получаются но вот Zabbix что-то не особо это воспринимал.

Сделал шаблон для MikroTik с использованием SNMP v3 но без авторизации, применил его к «проблемным» хостам, Zabbix радостно подключился и полностью начал грузить все данные, после несколько часового теста, я не заметил потери статистики или отвала хостов.

Разбираться что к чему и где MikroTik попортили, где я скриворучил или что более реально Zabbix выделывается. Решил пойти другим путём — настроить SNMP без авторизации и фаерволом дать доступ только моему серверу.

Сложность в том, что сервер находится дома и IP адрес у меня динамический. Учитывая ситуацию в регионе, разрывы частое явление. Встала задача обновлять в клиентских «микротиках», в правилах FireWall, мой IP адрес. На домашнем роутере настроен DDNS и соответственно постоянно ссылающееся на меня доменное имя (no-ip.com). Осталось дело за малым — подружиться с MikroTik.

Решил что самым простым и не нагружающим методом, будет использовать скрипты. (можно было использовать Layer7 но как-то не очень хочется, больно тяжел)

Скрипт был давно найден где-то на просторах офф. wiki MikroTik. Всё что он делает — ищет в Address-List записи начинающиеся с host_ , берёт доменное имя из коментария такой записи, резолвит IP и назначает его записи.

Добавляем наш скрипт:

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
/system script add \
   name=resolvehostnames policy=write,read \
   source="# define variables\r\
   \n:local list\r\
   \n:local comment\r\
   \n:local newip\r\
   \n:local oldip\r\
   \n\r\
   \n# Loop through each entry in the address list.\r\
   \n:foreach i in=[/ip firewall address-list find] do={\r\
   \n\r\
   \n# Get the first five characters of the list name\r\
   \n  :set list [:pick [/ip firewall address-list get \$i list] 0 5]\r\
   \n\r\
   \n# If they're 'host_', then we've got a match - process it\r\
   \n  :if (\$list = \"host_\") do={\r\
   \n\r\
   \n# Get the comment for this address list item (this is the host name to u\
   se)\r\
   \n    :set comment [/ip firewall address-list get \$i comment]\r\
   \n    :set oldip [/ip firewall address-list get \$i address]\r\
   \n\r\
   \n# Resolve it and set the address list entry accordingly.\r\
   \n    : if (\$newip != \$oldip) do={:set newip [:resolve \$comment]\r\
   \n    /ip firewall address-list set \$i address=\$newip}\r\
   \n    }\r\
   \n  }"

и запись в Address-List:

1
/ip firewall address-list add address=0.0.0.0 comment=YOR-DOMAIN-NAME list=host_resolv

Тут YOR-DOMAIN-NAME ваше доменное имя, как можно видеть является комментарием.

После, нужно добавить задание в планировщик (scheduler) — на исполнение нашего скрипта через определённое время, так как статистика дело тонкое то я проверяю адрес каждые 10 минут

1
2
3
/system scheduler add \
   comment="" disabled=no interval=10m name=resolveIp on-event=resolvehostnames \
   start-date=jan/01/1970 start-time=00:00:00

Эта задача будет каждые 10 минут запускать скрипт resolvehostnames и обновлять наш адрес.

Добавляем правило FireWall:

1
/ip firewall filter add action=accept chain=input dst-port=161 protocol=udp src-address-list=host_resolv

и настраиваем SNMP

1
2
3
/snmp community set public read=no
/snmp community add addresses=0.0.0.0/0 read=yes write=no name=zabbix
/snmp set contact=admin@server.com enabled=yes location="Gdeto tam na severe" trap-community=zabbix trap-version=3

После всего, в address-list — host_resolv должен принять наш адрес и мы можем спокойно получить статистику с железки.

«Отпаданий» хостов не заметил, вс работает как часы.

"health"

 

Конечно можно было не извращаться с Address-List и менять значение поля «address=» в Community но у этого скрипта могут быть и другие задачи, а если нет разницы, то зачем плодить скрипты :)

А ещё можно было через API это всё менять, но это уже из разряда «от нечего делать», но этот метод бы решал проблему долго-го обновления адреса у No-ip. Нужно будет всё-же подумать над этим вариантом.

Комментарии