L'article sera plus intéressant pour les spécialistes utilisant une petite flotte d'appareils (n'utilisant pas de serveur séparé, pour un système de surveillance ou de journalisation), les utilisateurs à domicile, ceux qui commencent à écrire des scripts de périphérique pour la première fois et ceux qui n'ont pas le temps / le désir de le comprendre.
J'ai été invité à écrire mon propre script par le désir de simplifier les scripts monstrueux que l'on peut trouver pour cette requête sur Internet, en effectuant cette action simple ( un exemple de script du MikroTik Wiki), ainsi que de montrer pourquoi les ingénieurs de MikroTik ont rendu impossible une méthode d'analyse simple si vous n'êtes pas un résident de Londres. :)
L'article analyse un exemple de notification sur la connexion et la déconnexion d'un utilisateur à partir d'un appareil MikroTik, mais montre également des exemples:
Organisation du temps dans le journal de l'appareil;
Analyse du journal de l'appareil, recherche d'événements par critères;
Envoi de notifications par e-mail;
Envoi d'un message Telegram.
Contexte. Pourquoi les scripts d'analyse des journaux MikroTik sont-ils «monstrueux»?
Par monstruosité, nous entendons une grande quantité de logique de script et de construction du formulaire:
:set tmpstring ([:pick [:tostr $tmpstring] 0 $findindex] . [:pick [:tostr $tmpstring] ($findindex + [:len [:tostr $ruleop]]) [:len [:tostr $tmpstring]]])
"" , .
MIkroTik, . :)
: " "account", (UTC+06)?
/log find where time > $LastRunTime topics ~ "account"
, 23:59:59 . 12 , 00:00:00 . ?
MikroTik : , , , , "" . , /, , .
? , MikroTik 00:00:00 UTC±0:00. , .. (UTC+06), 6 , . 06:00:00 .
(UTC±0:00), , .
( ), .
, , MikroTik id , (.id , , 0).
ParseLogAccountEndArrayID - .id ;
IDsEventsAccount .id , "account" - (: , ). 1000 , ;
LenArrayIDs - , StartArrayID - ( ID ), EndArrayID - 1( 0).
.id (IDsEventsAccount) .id (ParseLogAccountEndArrayID) (.. "account") (ParseLogAccountEndArrayID) - ( / ) ;
"account", (IDsEventsAccount) , " +1" ( ) " -1" (.. 0);
.id (IDMessage) ;
email, MikroTik;
Telegram , %0D%0A ;
ParseLogAccountEndArrayID ID "account" (EndArrayID).
email;
Telegram;
: read, write, test, policy.
[System] -> [Scripts] -> [+] -> [Name: ParseLogAccountEvents] -> [Policy: read, write, test, policy]
:local DeviceName [/system identity get name];
:local Time [/system clock get time];
:local Date [/system clock get date];
:local EmailMessageText;
:local TelegramMessageText;
:global ParseLogAccountEndArrayID;
:local IDsEventsAccount [/log find where topics ~ "account"];
:local LenArrayIDs [:len $IDsEventsAccount];
:local StartArrayID [:find $IDsEventsAccount $ParseLogAccountEndArrayID];
:local EndArrayID ($IDsEventsAccount -> ($LenArrayIDs-1));
:if ($EndArrayID != $ParseLogAccountEndArrayID and [:tobool $ParseLogAccountEndArrayID] ) do={
:local StartArray [:find $IDsEventsAccount $ParseLogAccountLastRunID];
:for KeyArray from=($StartArrayID+1) to=($LenArrayIDs-1) do={
:local IDMessage ($IDsEventsAccount ->$KeyArray );
:set EmailMessageText "$EmailMessageText \n\r $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
:set TelegramMessageText "$TelegramMessageText %0D%0A $[/log get number=$IDMessage time] - $[/log get number=$IDMessage message];";
}
:set ParseLogAccountEndArrayID $EndArrayID;
# START SEND EMAIL
:local SendFrom "ToMail@mail.ru";
:local PasswordMail "yourpassword";
:local SmtpServer [:resolve "smtp.mail.ru"];
:local UserName "FromMail@mail.ru";
:local SmtpPort 465;
:local UseTLS "tls-only";
:local SendTo "ToMail@mail.ru";
:local Subject "\F0\9F\94\93 AUTH: $DeviceName [$Date $Time]";
:local MessageText $EmailMessageText;
/tool e-mail send to=$SendTo server=$SmtpServer port=$SmtpPort start-tls=$UseTLS user=$SendFrom password=$PasswordMail from=$SendFrom subject=$Subject body=$MessageText;
# END SEND EMAIL
# START SEND TELEGRAM MESSAGE
:local BotToken "YourBotID";
:local ChatID "YourChatID";
:local ParseMode "html";
:local DisableWebPagePreview True;
:local SendText "\F0\9F\94\93 <b>$DeviceName: AUTH</b> $TelegramMessageText";
:local tgUrl "https://api.telegram.org/bot$BotToken/sendMessage?chat_id=$ChatID&text=$SendText&parse_mode=$ParseMode&disable_web_page_preview=$DisableWebPagePreview";
/tool fetch http-method=get url=$tgUrl keep-result=no;
# END SEND TELEGRAM MESSAGE
}
: read, write, test, policy.
[System] -> [Schedule] -> [+] -> [Name: ParseLogAccountEvents] —> [Interval: 00:05:00] -> [Policy: read, write, policy, test]
:
/system scheduler add name=ParseLogAccountEvents policy=read,write,policy,test on-event="/system script run ParseLogAccountEvents" interval=5m
, MikroTik , .
, Logging:
[System] -> [Logging] -> [Rules] -> [+] -> [Topics]
:
[/log find where message ~ "log"]
, / , ( Firewall , MikroTik Safe Mode) .
, , .
, Telegram , , . : " Email" " Telegram", , MikroTik.
: hAP ac lite, RouterOS 6.47.8 (stable).
PS C'est mon premier article sur Habré, vous pouvez juger strictement, mais équitablement. L'article ne donnera rien de nouveau aux spécialistes utilisant des systèmes de surveillance ou des serveurs de journaux séparés. Mais pour les débutants, les utilisateurs à domicile, les administrateurs avec une petite flotte de périphériques réseau - j'espère que cela sera utile.