11
Дек

Скрипт мониторинга доступности портов в сети с уведомлением на email — Mikrotik (Metarouter-OpenWrt)

Скрипт предназначен для мониторинга состояния хостов по портам в локальной сети или интернет.
Для использования данного скрипта необходимо воспользоваться возможностью создания виртуальной системе на роутерах Mikrotik
Для начала импортируем образ openwrt-mr-mips-rootfs-31411-basic.tar.gz в качестве операционной системы (как это сделать опишем в другой статье, советуем поискать в интернете, есть описания с картинками)
После чего нам понадобиться редактор nano (по желанию), обязательно пакет msmtp — для отправки почты с Mikrotik и сам скрипт.
opkg install nano
opkg install msmtp

Закидываем все в каталог /www/ping/ и даем права на выполнение всем файлам каталога.
chmod 755 -R /www/ping/

Сам скрипт /www/ping/monitor:

DATENOW=$(date +%d-%m-%Y—%T)
echo «Subject: Monitoring hosts sms Mikrotik» > /www/ping/mail
echo «From: [email protected]» >> /www/ping/mail
### Создаем при каждом запуске скрипта шапку письма
echo «To: [email protected]» >> /www/ping/mail
echo «CC: [email protected]» >> /www/ping/mail
echo «» >> /www/ping/mail
echo «server time is $DATENOW» >> /www/ping/mail
### Делаем выборку из nmap 5 раз с задержкой 5 секунд результат открытости порта
for i in 1 2 3 4 5
do
cat /www/ping/servers | while read a; do
/usr/bin/nmap `echo $a | sed -e ‘s/:/ -p /’` |
grep -q «/tcp *open » || echo $a
done >> /www/ping/serverlist_n
echo «Console number is $i»
sleep 5;
done
### Сортируем записи недоступных портов и копируем уникальную запись для отправки в тело письма
/usr/bin/sort -u /www/ping/serverlist_n > /www/ping/serverlist
### Проверяем количество ошибок в запросе, если равен 5 — то сообщаем о проблеме, если меньше — считаем что неполадки в интернете
if [[ $(cat /www/ping/serverlist_n | /usr/bin/wc -w) -ge 5 ]]
then
cat /www/ping/serverlist >> /www/ping/mail
echo «» >> /www/ping/mail
echo «serv»
else
echo «All OK» >> /www/ping/mail
echo «» >> /www/ping/mail
echo «ok»
fi
### Проверяем не пропал ли интернет
if [[ $(cat /www/ping/servers | /usr/bin/wc -w) -eq $(cat /www/ping/serverlist | /usr/bin/wc -w) ]]
then
cat /dev/null > /www/ping/serverlist_n
echo «lost internet»
exit 1
fi
### Если статус доступности порта изменился — сообщаем об этом на e-mail (при абсолютном значении) + заносим запись в лог
a=`expr $(cat /www/ping/serverlist_n | /usr/bin/wc -w) % 5`
b=`expr $(cat /www/ping/serverlist_old | /usr/bin/wc -w) % 5`
if [[ $(cat /www/ping/serverlist_old | /usr/bin/wc -w) -ne $(cat /www/ping/serverlist_n | /usr/bin/wc -w) && $a -eq 0 && $b -eq 0 ]]
then
cat /www/ping/serverlist_n | /usr/bin/wc -w >> /www/ping/mail
cat /www/ping/serverlist_old | /usr/bin/wc -w >> /www/ping/mail
/www/ping/sendmail > /dev/null
echo «————» >> /www/ping/log
echo $DATENOW >> /www/ping/log
cat /www/ping/serverlist >> /www/ping/log
cat /www/ping/serverlist_n | /usr/bin/wc -w >> /www/ping/log
cat /www/ping/serverlist_old | /usr/bin/wc -w >> /www/ping/log
echo «————» >> /www/ping/log
echo «send»
fi
### заносим данные в архив для проверки измненения
if [[ $a -eq 0 ]]
then
cat /www/ping/serverlist_n > /www/ping/serverlist_old
echo «end»
fi
cat /dev/null > /www/ping/serverlist_n
exit
fi

Файл конфига тулзы msmtp, для отправки почты через внешний smtp почтовый сервер:
nano /www/ping/sendmail

MAIL_SERVER=smtp.mail.ru
MAIL_PORT=465
MAIL_DATE=`date +»%d %b %Y %T»`
[email protected]
[email protected]
MAIL_PASSWORD=pass

cat /www/ping/mail | /usr/bin/msmtp —host=${MAIL_SERVER} —port=${MAIL_PORT} —tls=on —tls-certcheck=off —tls-starttls=off —auth=login —user=${MAIL_FROM} —passwordeval=»echo ${MAIL_PASSWORD}» -f ${MAIL_FROM} ${MAIL_TO} -d

nano /www/ping/servers — список хостов для мониторинга
192.168.0.31:80
192.168.0.30:80
hd.zp.ua:80

собственно после проделанного, добавляем наш скрипт в crontab для выполнения, например раз в час.
Чаще не советую, из-за слабого процессора на Mikrotik