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: mail@hd.zp.ua.ru" >> /www/ping/mail
### Создаем при каждом запуске скрипта шапку письма
echo "To: mail@hdtv.zp.ua" >> /www/ping/mail
echo "CC: mail2@hdtv.zp.ua" >> /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"`
MAIL_FROM=mail@mail.ru
MAIL_TO=mail@hd.zp.ua
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