Monitorando no Zabbix as sessões BGP do RouterOS v6 (Mikrotik) via SNMP
Neste tutorial vamos aprender a monitorar o status da sessão BGP no RouterOS v6 o nosso “querido” Mikrotik, bem como receber notificações se a sessão cair ou reconectar.
Como a mikrotik não disponibiliza essas informações via SNMP das sessões BGP, usaremos das artimanhas. Então juntamente com meu amigo Saulo Costa qual identificou que existe uma OID dos script que estão no RouterOS (1.3.6.1.4.1.14988.1.1.8.1.1.2) e outra (1.3.6.1.4.1.14988.1.1.18.1.1.2.***) que é possivel executar-lo bem como ter retornos, e ai meu amigo as mentes voaram longe!
Acompanhe o raciocínio:
1º Crie um script em seu RouterOS
Darei o nome do script de bgp_snmp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
:put "{\"peer\": ["; :global lista [/routing bgp peer find]; :global contador 0; :foreach i in=$lista do={ :global disabled [/routing bgp peer get value-name=disabled number=$i]; :global name [/routing bgp peer get value-name=name number=$i]; :global remoteaddress [/routing bgp peer get value-name=remote-address number=$i]; :global remoteas [/routing bgp peer get value-name=remote-as number=$i]; :global state [/routing bgp peer get value-name=state number=$i]; :if (state = "idle") do={:set state 1;}; :if (state = "connect") do={:set state 2;} :if (state = "active") do={:set state 3;}; :if (state = "opensent") do={:set state 4;} :if (state = "openconfirm") do={:set state 5;}; :if (state = "established") do={:set state 6;} :if (disabled = true) do={:set state 1;} :global prefix [/routing bgp peer get value-name=prefix number=$i]; :if (prefix < 1) do={:set prefix 0;} :global uptime [/routing bgp peer get value-name=uptime number=$i]; :if (uptime < 1) do={:set uptime 0;} :global uptimeseconds 0; :global weekend 0; :global dayend 0; :global weeks 0; :global days 0; :if ([:find $uptime "w" -1] > 0) do={ :set weekend [:find $uptime "w" -1]; :set weeks [:pick $uptime 0 $weekend]; :set weekend ($weekend+1); }; :if ([:find $uptime "d" -1] > 0) do={ :set dayend [:find $uptime "d" -1]; :set days [:pick $uptime $weekend $dayend]; }; :global time [:pick $uptime ([:len $uptime]-8) [:len $uptime]]; :global hours [:pick $time 0 2]; :global minutes [:pick $time 3 5]; :global seconds [:pick $time 6 8]; :set uptimeseconds [($weeks*86400*7+$days*86400+$hours*3600+$minutes*60+$seconds)]; :set contador ($contador + 1); :if ( $contador < [:len $lista]) do={ :put "{\"Id\": \"$contador\",\"Disabled\": \"$disabled\",\"Name\": \"$name\",\"Remote-Address\": \"$remoteaddress\",\"Remote-AS\": \"$remoteas\",\"State\": \"$state\",\"Prefix\": \"$prefix\",\"Uptime\": \"$uptimeseconds\"}," } else={ :put "{\"Id\": \"$contador\",\"Disabled\": \"$disabled\",\"Name\": \"$name\",\"Remote-Address\": \"$remoteaddress\",\"Remote-AS\": \"$remoteas\",\"State\": \"$state\",\"Prefix\": \"$prefix\",\"Uptime\": \"$uptimeseconds\"}" }; }; :put "]}"; |
A idéa é pegar as informações no scrip e apenas imprimi-las. Experimente executar o script agora!
1 |
[user@mikrotik] > system script run bgp_snmp |
Você terá uma saída em JSON com as informações que iremos coletar lá no Zabbix.
1 2 3 4 |
{"peer": [ {"Id": "1","Disabled": "false","Name": "VS_BORDA_IPv4","Remote-Address": "10.50.50.29","Remote-AS": "1234","State": "6","Prefix": "1","Uptime": "83235"}, {"Id": "2","Disabled": "false","Name": "VS_BORDA_IPv6","Remote-Address": "fd00:bacb:50:28::1","Remote-AS": "1234","State": "6","Prefix": "1","Uptime": "3500"} ]} |
2º Configure o SNMP
Será necessário habiliar o write-access, então tenha certeza de ter uma community fora dos padrões (ex public {mando te matar!}) bem como restringir o acesso apenas para IP ou Prefixos de seus servidores.
Segue um exemplo:
1 2 |
/snmp community set [ find default=yes ] addresses=200.200.200.0/28 name=sUpErS3cret0 write-access=yes /snmp set contact="noc@remontti.com.br" enabled=yes location="Seu Local" trap-version=2 |
3º Teste do seu servidor Zabbix
No exemplo meu router tem o IP 10.50.50.30 e minha community é sUpErS3cret0. Se você não tem as MIBS e o comando snmpwalk não “funciona” leia aqui.
1 |
# snmpwalk -v2c -c sUpErS3cret0 10.50.50.30 1.3.6.1.4.1.14988.1.1.8.1.1.2 |
Você tera um resultado com todos os seus scripts:
1 2 3 |
SNMPv2-SMI::enterprises.14988.1.1.8.1.1.2.1 = STRING: "bakup_ftp" SNMPv2-SMI::enterprises.14988.1.1.8.1.1.2.4 = STRING: "script_da_morte" SNMPv2-SMI::enterprises.14988.1.1.8.1.1.2.7 = STRING: "bgp_snmp" |
O que é iportante para nós é esse numerozinho aqui: 14988.1.1.8.1.1.2.7, mais propriamente dito o final dele, neste exemplo o nº 7, este é o identificador do script. Anote ele, vamos precisar ele lá no nosso template.
Agora vamos rodar o script e fazer um get para ver se temos o retorno com o OID 1.3.6.1.4.1.14988.1.1.18.1.1.2.X. Onde X é o nº do identificador do script (neste ex 7).
1 |
# snmpget -v2c -c sUpErS3cret0 10.50.50.30 1.3.6.1.4.1.14988.1.1.18.1.1.2.7 | sed -e 's/\\//g' |
Você irá receber uma saída com todos os peers do seu router:
1 2 3 4 |
SNMPv2-SMI::enterprises.14988.1.1.18.1.1.2.8 = STRING: "{"peer": [ {"Id": "1","Disabled": "false","Name": "VS_BORDA_IPv4","Remote-Address": "10.50.50.29","Remote-AS": "1234","State": "6","Prefix": "1","Uptime": "84508"}, {"Id": "2","Disabled": "false","Name": "VS_BORDA_IPv6","Remote-Address": "fd00:bacb:50:28::1","Remote-AS": "1234","State": "6","Prefix": "1","Uptime": "4773"} ]}" |
4º Importando o template para o Zabbix
Faça download do template RR Mikrotik – BGP – SNMP Script.xml e importe o mesmo.
5º Crie/Edite um host usando o template
Informe o Nome, grupo bem como IP com agente SNMP.
Selecione o template RR Mikrotik – BGP – SNMP Script
Lembra do identificador, precisamos informa-lo aqui.
Acesse os dados recentes para verificar se os itens foram criados (lembrado que ele é executado a cada 5min) então tenha paciência de aguardar 10min ou execute manualmente.
Bem mais simplique que o metodo do outro tutorial com script python.
Espero que tenha gostado! E mais uma vez deixo meu agradecimento ao parceio Saulo. Se fizer algo legal não deixe de compartilhar! Com isso você pode criar até mesmo outros templates, para coletar outras informações. Isso é o legal de compartilhar!
Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!
Se não puder doar pode deixar seu agradecimento nos comentário também ficarei feliz em saber que ajudei. Se tiver qualquer pergunta deixe-a também. Se preferir entrar em Contato clique aqui.
Alguém já encontrou uma forma para monitorar sessões BGP no ROS V7?
Alguma adaptação para o ROS V7?
alguém já adaptou esse script para a versão mikrotik v7 ?
o que seria esse item disable que pega true quando o state por 1=idle?
Essa config foi testada em qual V6 do router OS? eu tenho um BGP na V6.45.9 e tenho sessões full route e ptt com ix, e depois de todos os passos quando executo o comando snmpget da timeout na solicitação pois o print do comando fica lento com todas essas sessões e depois de tentar executar mais de uma vez o snmwalk ja não encontra mais o index do script ai preciso excluir e criar outro pra voltar a encontrar! Alguma ideia no que possa ser?
Excelente projetinho, funcionou perfeitamente.
Detalhe é só editarem o Template na OID , pois vem com o OID padrão ai cada Router terá o seu OID.
Esse template dá para usar para monitorar o tráfego e as rotas pelo Grafana?
Alguém consegue dar um help ai ???
Parabéns pelo tópico! Muito bom, funcionou certinho.
Uma dúvida: Como consigo alterar o valor do item State = established(6)? Gostaria de monitorar pelo grafana, mas consigo obter somente o “numeral 6”
Parabéns pelo trabalho e por compartilhar seus conhecimentos conosco, aqui já tenho várias ferramentas rodando somente seguindo seus tutoriais, muito agradecido, Deus abençoe!
😊
Olá , ao executar o comando snmpwalk não retorna os valores de execução , só mostra linha que informa o nome do script. ao executar o script local no mikrotik , os valores retornam OK. o que poderia ser ?
snmpwalk -v2c -c sUpErS3cret0 X.X.X.X 1.3.6.1.4.1.14988.1.1.8.1.1.2.12
iso.3.6.1.4.1.14988.1.1.8.1.1.2.12 = STRING: “bgp_snmp”
Corrigindo ..
snmpget -v2c -c sUpErS3cret0 X.X.X.X 1.3.6.1.4.1.14988.1.1.8.1.1.2.12
iso.3.6.1.4.1.14988.1.1.8.1.1.2.12 = STRING: “bgp_snmp”
Não retorna os valores … ja executando o script local , funciona normalmente.
Amigo vc pois no seu Mikrotik mesmo nome em community sUpErS3cret0 ? ou seu esta public?
public é padrão, como vc vai ativar no SNMP para escrita, se deixar public sua caixa pode ficar exposta para qqr um mexer nela através do SNMP! É importantíssimo vc nunca usar PUBLIC!
Excelente, parabéns…
Boa tarde. Primeiramente parabéns pelo projeto, funcionou perfeitamente quando tem poucas sessões BGP’s configuradas. Sabes me dizer onde posso alterar as restrições para o SNMP pegar um JSOn maior, pois tenho alguns mikrotiks com + de 12 sessões configuradas e ele da erro de “Cannot receive string value: out of memory.” na tentativa de coleta por parte do item SNMP. Abraço.
Verifica o nome do peer, se tiver algum caracter especial, espaço poderá dar erro.
Quanto aos nomes só tinha letras, numeros, “-” e “_”.
Pelo terminal, consigo pegar todos normalmente pelo snmpwalk.
Renomeei todos os Peers de 1 até 16(1,2,3,4…..16) e fui removendo um por um até chegar em 11.
Parece como se o resultado do Json no itém do Zabbix comporta um determinado tamanho de string.
No retorno dentro da opção “Testar > Obter valor” dentro do item SNMP(Retorno Json) acredito que talvez tenha alguma variável no zabbix que possa alterar o tamanho maximo da string.
Fiz mais um teste. Peguei o resultado pego via snmpwalk e coloquei o resultado em “valor” em vez de “Obter valor do host”. Desta forma não deu erro. Logo acredito que seja algo com o Zabbix+apache, pois o Script e o item em si funciona corretamente. O erro só dá quando o zabbix vai obter o resultado do host.
Quando ele obtém um resultado com mais de 1703 caracteres ele da erro(usei o site quantasletras.com para contar caracteres).
Peguei os 11 que estavam funcionando e fui adicionando um numero ao final deles(ex: a1, a12,a123,a1234) até dar o erro. O meu estava dando 1621 caracteres[funcionando].A estrutura de retorno começa em {“peer”: [ e vai até ]}(Sem usar as ” no inicio e no fim)
Quando adicionei 83 caracteres distribuídos 10 a 10 em cada Peer ocorreu o erro. Deve ser algo relacionado a alocação de memória no Zabbix.
Ciao … anche io ho lo stesso problema. Come hai risolto la cosa?
Muito bom seu tutorial, estava precisando monitorar as sessões BGP é funcionou massa de mais, testado e aprovado, muito obrigado por postar esse conteúdo. Testado e aprovado. fica minha contribuição como forma de agradecimento. Abç.
tentei de todas as formas fazer funcionar com o zabbix versao 4.4 , teria como me manda o script do xml para esta versao ? tentei alterar apenas o xml para o meu zabbix aceitar o arquivo xml porem percebi que faltou alguns itens do xml .
Foram feito na v5 infelizmente não tenho da v4
Otimo artigo, muito bom mesmo. funciona perfeitamente na V6, mas meu amigo, não consigo fazer funcionar também na v6, o template não é importado. Sabe se funciona? Senão ficarei correndo atras de algo que não funciona, achando que é erro no meu sistema zabbix.
Funciona na V5 e na V6 não consigo add o template
Excelente artigo, ajudou muito. Amigo, ele funciona apenas na V5, pois na V6 o template nem é importado.