MikroTik – скрипт мониторинга локальных устройств

MikroTik - скрипт мониторинга

Добрый день, уважаемые читатели.

Я думаю многим опытным пользователям ПК, особенно IT-специалистам, хочется контролировать всё и вся. В эту категорию входит и мониторинг домашнего интернета и подключенных к нему устройств, особенно в ваше отсутствие. Многие, кто работают за ПК, часто используют удаленное подключение к домашнему ПК, чтобы заниматься попутно какими либо своими делами. Для этого было бы неплохо точно знать когда и что происходило с интернет-соединением, а также происходило ли отключение электричества. Если у вас есть Микротик, обязательно закажите внешний IP и тогда вы по-настоящему сможете все держать под контролем. В этой статье речь пойдет о мониторинге доступности подключенного к Микротику ПК с грамотным логированием.

Представляю вашему вниманию скрипт для Микротика на базе RouterOS, который ставится на запуск каждую минуту и выполняет следующий функционал:

  • Мониторинг доступности запущенного ПК
  • Логирование недоступности ПК, отсутствия линка до ПК
  • Скрипт различает недоступность ПК от выключенного ПК и не засоряет логи

В логах MikroTik используется 3 цвета:

  • серый – info-сообщения
  • синий – warning-сообщения
  • красный – error-сообщения

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

Для хранения информации (пропал пинг ПК, пропал линк к ПК) используются глобальные переменные (раздел System->Scripts вкладка Environment). Если у вас пропал интернет, например авария у провайдера), в логе будет только одно сообщение об этом и скрипт не будет писать в лог об отсутствии пинга каждый свой запуск (каждую минуту).

Давайте рассмотрим скрипт по частям:

:global linkdown
:global landown
:local checklan [/ping 10.10.1.10 count=5]
:local link
/interface ethernet cable-test eth2-lan once do={
:set $link $"status";
};

Это первая часть кода, здесь объявляются переменные, выполняется пинг локального ip подключенного ПК и проверка линка на нужном порту (тест кабеля). IP вам нужно заменить на IP вашего ПК (или иного устройства), а название порта к которому подключен ПК тоже заменить на свое (раздел Interfaces).

:if ($link = "link-ok") do={
	:if ($linkdown = true) do={
		/log warning "LAN LINK UP"
		:set $linkdown false
	}

Если линк есть, проверяется глобальная переменная отсутствия линка на ПК и если его не было, глобальная переменная обновляется, а в лог пишется сообщение о том что линк снова появился.

	:if ($checklan = 0) do={
		:if ($landown != true) do={
			/log error "PING LAN FAILED"
			:set $landown true
			interface ethernet set eth2-lan disabled=yes
			:delay 5
			interface ethernet set eth2-lan disabled=no
			:delay 2
		}

Если ПК не пингуется и в глобальной переменной не указано что нет линка, то в лог пишется сообщение PING LAN FAILED, делается запись в глобальную переменную, а затем самое интересное. Бывают случаи, когда ПК находится включенным по несколько дней и иногда пропадает интернет, при этом линк на Микротике есть. Лично у меня интернет постоянно пропадал когда истекал срок аренды DHCP, почему то настройки просто не перезапрашивались моим компьютером, поэтому я специально сделал в скрипте проверку “Если линк на ПК есть, но ПК не пингуется – перезагрузить нужный порт на Микротике.” Собственно эти действия и происходят в части скрипта выше.

else={
		:if ($landown = true) do={
			/log warning "PING LAN OK"
			:set $landown false
		}
	}

Если пинг ПК есть, а до этого не было, в лог пишется сообщение.

else={
	:if ($linkdown != true) do={
		/log error "LAN LINK DOWN"
		:set $linkdown true
	}

Если линка до ПК нет, а до этого он был, то в лог пишется сообщение.

Скрипт добавляется в раздел System->Scripts. Для запуска каждую минуту (или другой промежуток времени) его следует добавить в System->Scheduler.

В On Event пишем: system script run ping-lan, где ping-lan – название скрипта, которое вы указали при добавлении в System->Scripts.

Полный код скрипта:

:global linkdown
:global landown
:local checklan [/ping 10.10.1.10 count=5]
:local link
/interface ethernet cable-test eth2-lan once do={
:set $link $"status";
};

:if ($link = "link-ok") do={
	:if ($linkdown = true) do={
		/log warning "LAN LINK UP"
		:set $linkdown false
	}
	:if ($checklan = 0) do={
		:if ($landown != true) do={
			/log error "PING LAN FAILED"
			:set $landown true
			interface ethernet set eth2-lan disabled=yes
			:delay 5
			interface ethernet set eth2-lan disabled=no
			:delay 2
		}
	} else={
		:if ($landown = true) do={
			/log warning "PING LAN OK"
			:set $landown false
		}
	}
} else={
	:if ($linkdown != true) do={
		/log error "LAN LINK DOWN"
		:set $linkdown true
	}
}

Вы можете легко изменить скрипт для мониторинга нескольких устройств в вашей локальной сети. Для этого используйте циклы и массивы. Для проверки наличия интернет-соединения вы можете использовать скрипт или часть скрипта, который я опубликую завтра.

P.S. Завтра будет статья со скриптом для мониторинга интернета и любого внешнего узла, например вашего сервера, с оповещением по СМС/Телеграм.

UPD 2022: проверено, работает и на RouterOS 7.