Em um artigo anterior eu mostrei como configurar um bot para receber mensagens de status do seu sistema Linux e mantê-lo informado via Telegram sobre o que ocorre em sua máquina ou rede. Agora eu vou mostrar como fazer o mesmo com o seu Mikrotik.
Mikrotik já foi o patinho feio das redes, mas há muito tempo eles tem apresentado soluções com custo relativamente baixo e no entanto com recursos que só encontramos em equipamentos com licenciamento caro, o que aumentou o seu prestígio e uso.
Em que contexto eu passei a usar o Mikrotik em casa
Esta parte é irrelevante para o restante do texto, mas achei interessante mencionar aqui, caso alguém esteja com a mesma situação, mas vocêpo de pular esta seção seguramente sem que isso impacte o seu entendimento principal do artigo.
Eu comecei a voltar os olhos para ele quando notei que o cable-modem fornecido pelo meu provedor de Internet era o grande gargalo da minha Internet.
O equipamento que deveria resolver todos os problemas do usuário de forma mágica como roteador, access-point, MTA (estação de telefone VOIP) etc, não funciona com a performance esperada para tantas funções então a solução mais racional, sem ter que ficar dando chilique com a operadora que se trocar vai colocar outro aparelho tão ruim quanto, é você comprar seu próprio roteador (se você está com sua Internet ruim, fica ai a dica).
Depois de muito pesquisar me convenci de que só teria Internet decente se trouxesse meus conhecimentos do trabalho para casa então comprei uma Mikrotik RB750 que não é nenhum equipamento top de linha mas que possui tudo o que eu precisava e muito mais.
Coloquei meu cable-modem em modo BRIDGE (o modo original é o ROUTER) e mesmo sem nunca ter mexido em um Mikrotik antes em menos de 30 minutos já estava com o equipamento roteando minha rede interna, com mais algumas horas já tinha IPv6, DNS interno, Firewall controle parental entre outros.
Mas isso assunto para outra hora, o nosso foco agora é: Tenho um equipamento Mikrotik na rede e quero receber algumas mensagens de status via Telegram.
Criando o bot, grupo e obtendo os dados do Telegram que serão usados
O processo de criação do bot e do grupo, bem como a obtenção do token e chatid podem ser vistas em detalhes no artigo anterior https://blog.welrbraga.eti.br/?p=3373, mas para quem não quiser ler todo aquele artigo segue um resumo:
- Procurar por BotFather dentro do Telegram
- Adicionar um novo bot no ambiente (comando /newbot)
- Escolher um nome para o bot
- MeuMikrotik
- Escolher um login para o bot (obrigatorio terminar com bot)
- meumikrotikbot
- Anotar o Token (guardá-lo em segredo)
- 1234567890:AABccDEfGh1IJKlMNOPQR2STuvwXYZa3BCD
- Criar um grupo no Telegram adicionando você e o bot como membros
- Verificar se o token está funcionando com a URL de atualizações (no seu navegador WEB)
- https://api.telegram.org/bot1234567890:AABccDEfGh1IJKlMNOPQR2STuvwXYZa3BCD/getUpdates
- Na saída acima, já pegar e anotar o ChatID do grupo (um número negativo):
- -999999999
- Fazer teste de envio usando o curl com URL abaixo em uma caixa Linux ou Mikrotik
Na caixa Linux use o Curl:
curl "https://api.telegram.org/bot1234567890:AABccDEfGh1IJKlMNOPQR2STuvwXYZa3BCD/sendMessage?chat_id=-999999999&text=MensagemTeste"
Na caixa Mikrotik use o /tool fetch:
/tool fetch url="https://api.telegram.org/bot1234567890:AABccDEfGh1IJKlMNOPQR2STuvwXYZa3BCD/sendMessage?chat_id=-999999999&text=MensagemTeste" keep-result=no
Caso tenha dúvidas com os passo abaixo veja o artigo anterior onde ele está mais detalhado e com explicações para ajudá-lo.
Vale ainda lembrar que, se você já possuir um outro Bot e ChatID que queira reaproveitar, você não precisa nem criar outros novos, você pode usar os mesmos. Mas apesar desta possibilidade, a menos que queira algo bem simples para uso doméstico, particularmente eu sugiro que haja um bot para cada equipamento, assim você pode ter o nome do bot como nome do equipamento, e mantém só um grupo com o nome da empresa, ou do setor o qual receberá as mensagens.
Função para envio de mensagens
A função abaixo foi criada da forma mais genérica possível para que possa ser aproveitada em outros projetos. De antemão eu destaco aqui que não sou nenhum expert em Mikrotik e o resultado obtido embora adequado talvez possa ser melhorado (aceito sugestões).
Para que os comandos fiquem mais legíveis eu vou considerar a sintaxe deles sendo digitadas na interface WEB o que nos poupa de digitar um monte de caracteres de escape qu edificultam a legibilidade então, vá em System > Scripts > Scripts > Add New e crie uma função com o nome “function-telegramsend”, e tendo como única permissão a politica “read”.
O código da função será o que segue abaixo a ser colado na seção “source”:
:global TelegramSend do={ :local tgBotToken "1234567890:AABccDEfGh1IJKlMNOPQR2STuvwXYZa3BCD" :local tgGroupId "-999999999" :local tgMessage "$1" :local tgUrl ("https://api.telegram.org/bot".$tgBotToken."/sendMessage\?chat_id=".$tgGroupId."&text=".$tgMessage) /tool fetch url="$tgUrl" keep-result=no }
Este código cria uma função chamada “TelegramSend” que pode ser invocada seja pela linha de comandos ou por outras funções, e o resultado será o envio da mensagem passada como parâmetro para o seu grupo no Telegram.
Para usá-la você deverá primeiramente carregar a função (como se fosse um include ou import de outras linguagens) e depois invocá-la com a sua mensagem
/system script run function-telegramsend
$SendTelegram “Minha mensagem do Mikrotik”
Executando a partir do terminal do Mikrotik o que você verá será algo como mostrado na imagem abaixo, e ao abrir o seu grupo no Telegram a mensagem estará lá publica para quem puder ler.
Função para receber o seu IP público dinâmico
Isso seria suficiente para enviar mensagens a partir de seu roteador via Telegram mas para termos um exemplo prático de uso da função, eu criei um outro script que obtém o meu IP público, o salva em uma “address-list” para ser usado em algumas regras do meu firewall e me notifica do evento por Telegram, caso o endereço tenha mudado, informando o IP antigo e o novo.
Segue o código. Tal como na função anterior, em System > Scripts > Scripts > Add New, crie um novo script desta vez com o nome “atualiza-lista-meuippublico”, e com as políticas “read”, “write”, “test” e “sensitive”.
/system script run function-telegramsend { :global TelegramSend :local myip [/ip cloud get public-address] :local savedip [/ip firewall address-list get [find list=MEUIPPUBLICO] address] :if ($savedip = $myip) do={ :log info "IP publico inalterado $savedip" } else={ :log info "IP publico alterado de $savedip para $myip" :ip firewall address-list set [/ip firewall address-list find list=MEUIPPUBLICO address=$savedip] address=$myip :local message "Mikrotik IP $myip" $TelegramSend $message } }
Observe que além de importar a função (/system script …) eu precisei informar que TelegramSend é um objeto global. O interessante disso é que a função não ficará carregada no seu Environment o tempo todo. Ela será carregada apenas no momento da execução e depois será removida, liberando recursos do equipamento que possui pouca memória.
Criando a lista MEUIPPUBLICO
Eu já disse isso acima, mas é importante enfatizar aqui novamente. Eu gravo o IP na address-list de nome “MEUIPUBLICO”.
Eu poderia ter usado uma variável global ou um arquivo para manter este IP mas, como eu disse, eu uso esta função para manter meu IP atualizado em algumas regras do firewall e que já contam com a existência da lista, então antes de executar a função acima, crie manualmente esta lista, você só terá que fazer isso uma vez, ou então fique a vontade em altera a rotina para funcionar de outro modo como desejar.
/ip firewall address-list add address=192.168.1.1 comment="Meu IP publico" list=MEUIPPUBLICO
No exemplo acima eu coloquei um IP que obviamente não é válido, mas isso é irrelevante. Só precisamos que tenha um valor qualquer ali e que será alterado pelo script “atualiza-lista-meuippublico”.
Executando a função e descobrindo seu IP
Para executar a rotina, após salvá-la você pode clicar no botão “Run script” ou pela linha de comandos digitar o comando:
/system script run atualiza-lista-meuippublico
Você só receberá o alerta no Telegram quando o IP registrado na lista for alterado, o que só deverá ocorrer se você alterar a lista manualmente, reiniciar o seu modem ou seu “lease time” expirar no provedor. Do contrário você só terá uma mensagem no log informando que o IP não foi alterado.
Automatizando
Eu não quero ficar digitando aquele comando a todo tempo para saber se meu IP mudou então esta é a parte que eu gosto. Quando as máquinas fazem o trabalho por mim.
O ideal seria existir um evento que pudesse invocar scripts em certas ocasiões como a renovação do IP, por exemplo, mas embora o Mikrotik seja muito bom ele ainda tem algumas limitações e a falta de tratativas por eventos é uma delas.
A solução para contornar esta limitação é então invocar esta função usando o “scheduler” que funciona como o “cron” do Linux, ou seja, periodicamente nós chamamos a função e verificamos o que for necessário.
Em uma só linha você pode criar o seu agendamento digitando no terminal o comando abaixo:
/system scheduler add comment="IP publico atualizado a cada 5min" interval=5m name=atualiza-ippublico on-event=atualiza-lista-meuippublico policy=read,write,test,sensitive start-time=startup
Pelo administrador WEB, você pode chegar ao mesmo resultado indo em em System > Scheduler > Add New e por lá é só e definir o agendamento com os dados acima.
Lembrando sempre que o crítico aqui é o nome do script a ser executado (atualiza-lista-meuippublico). Se você o salvou anteriormente com outro nome não deixe de mudá-lo aqui também.
O intervalo de 5min é perfeitamente aceitável para mim, mas sinta-se confortável em alterá-lo também conforme necessidade.
Conclusão
Talvez as rotinas possam ser muito melhoradas e com certeza adaptadas ao gosto de cada um. Estejam a vontade a melhorar e não deixem de compartilhar o resultado.
Até a próxima.
Muito bom tudo isso! Primeira vez que ao procurar por uma solução de um problema de brinde recebo outras. Blog adicionado nos favoritos! Agora vou colocar em pratica os conhecimentos adquiridos hoje! Estou até curioso para ler seus outros Textos! Obrigado!