TEMPLATE - DNS RECURSIVO - MONITORAR

Criada por Danilo Tomich, Modificado em Seg, 20 Out na (o) 6:21 PM por Danilo Tomich

# Monitoramento de servidores DNS (Unbound ou Bind), homologado com Debian 11, Debian 12, Ubuntu Server 22.04 LTS, python3.11, Zabbix 6.x, Grafana 10.x e Infinity


Obs: No Zabbix basta importar os templates e vincular ao host, a criacao da api deve ser feita no proprio servidor DNS.



# Verifique a sua distribuição SO e faca a instalação do zabbix-agent no servidor DNS que será monitorado (Siga as instruções de instalação pela página de download oficial do Zabbix)

cat /etc/os-release 

https://www.zabbix.com/br/download


# Após fazer a instalação libere o ip do seu servidor zabbix e também a execução de scripts:


nano /etc/zabbix/zabbix_agentd.conf

Server=127.0.0.1,ip-do-seu-zabbix-aqui


### Option: EnableRemoteCommands - Deprecated, use AllowKey=system.run[*] or DenyKey=system.run[*] instead

#       Internal alias for AllowKey/DenyKey parameters depending on value:

#       0 - DenyKey=system.run[*]

#       1 - AllowKey=system.run[*]

#

# Mandatory: no


AllowKey=system.run[*] # Adicione essa linha aqui para liberar a execução de scripts pelo Zabbix-agent.


# Apos os ajustes reinicie o zabbix-agent no servidor DNS

systemctl restart zabbix-agent


-----------------------------------------------


# Instale as dependências do Linux para o projeto (No servidor DNS, base Debian, se tiver usando Rhel ou outra distribuição, pesquise como instalar essas dependências)

apt install tcpdump dnstop uuid jq net-tools


# Criando diretório de scripts no servidor DNS

mkdir -p /usr/lib/zabbix/externalscripts/



# Criando diretório de logs e de leitura para o zabbix

mkdir /usr/lib/zabbix/externalscripts/beedns

chown -R zabbix:zabbix /usr/lib/zabbix/externalscripts/beedns/


# Criando e navegando ate o diretório base do projeto (ATENCAO: Não mude o nome dos diretórios base ou você vai ter que adaptar varias coisas '-')

mkdir /opt/bee

cd /opt/bee/


# Baixe o diretório do projeto para a API (beesoftDNS) no diretório recém criado /opt/bee/ (Voce pode usar o WinSCP ou FileZilla)


# Navegue até o diretório do projeto

cd /opt/bee/beesoftDNS/


# Mova os scripts para o diretorio de scrips do Zabbix no servidor DNS /usr/lib/zabbix/externalscripts/

mv /opt/bee/beesoftDNS/bee_captura_clientes_dns.sh /usr/lib/zabbix/externalscripts/

mv /opt/bee/beesoftDNS/bee_consulta_clientes_dns.sh /usr/lib/zabbix/externalscripts/

mv /opt/bee/beesoftDNS/bee_consulta_status_dns.sh /usr/lib/zabbix/externalscripts/


# Ajuste as permissoes dos scripts

chmod +x /usr/lib/zabbix/externalscripts/bee_*


# Verifique o caminho completo para os executáveis e ajuste se necessário nos scripts bee_captura_clientes_dns.sh e beedns_executor.sh (Evitar problemas com o crontab em distribuições mais antigas)

which timeout

which tcpdump

which dnstop


root@DNS-MASTER[/opt/bee/beesoftDNS]# which timeout

/usr/bin/timeout

root@DNS-MASTER[/opt/bee/beesoftDNS]# which tcpdump

/usr/bin/tcpdump

root@DNS-MASTER[/opt/bee/beesoftDNS]# which dnstop

/usr/bin/dnstop

root@DNS-MASTER[/opt/bee/beesoftDNS]# 



# Ajuste a interface no script de captura dos clientes (Configure o nome da sua interface seguindo o exemplo da ens18)

nano /usr/lib/zabbix/externalscripts/bee_captura_clientes_dns.sh


# Faca a instalacao do python-venv (Necessario para criacao de ambientes virtuais do python no Linux)

apt install python3-venv


# Crie o seu ambiente virtual e o ative (Basicamente aqui voce esta dizendo que ao executar scripts com o python sera usado o python que esta no venv, nao o python padrao do Linux)


python3 -m venv venv

source venv/bin/activate


# Faca a instalacao das dependencias do python para esse projeto (Alguem pra fazer o decouple? hehe)

pip install django


# Faca um teste na aplicacao (Pare com CTRL + C)

python manage.py runserver


# Crie o service que vamos utilizar pra rodar a API em segundo plano (Maneira simplificada, caso prefira pode subir via Nginx)

nano /etc/systemd/system/beedns-server.service
[Unit]

Description=Beedns Server



[Service]

ExecStart=/opt/bee/beesoftDNS/venv/bin/python /opt/bee/beesoftDNS/manage.py runserver 0.0.0.0:8053

Restart=always

User=root

Group=root



[Install]

WantedBy=default.target


# Ajuste para a interface que tem o Ip do seu servidor DNS (Padrao ens18)

nano /opt/bee/beesoftDNS/beedns_executor.sh 


# Iniciando a API, verificando o status e habilitando para iniciar junto ao boot

systemctl start beedns-server.service 

systemctl status beedns-server.service

systemctl enable beedns-server.service


# Validando se a API foi iniciada com sucesso (Verifique se a porta 8053 e listada como aberta)

netstat -tulpn


# Ajuste as permissoes e teste o script que gera os arquivos json (Veja a saida dos arquivos 1.json ate o 13.json no diretorio /opt/bee/beesoftDNS/tmp)

chmod +x /opt/bee/beesoftDNS/beedns_executor.sh 

chmod +x /opt/bee/beesoftDNS/dnstop.py


# Teste do executor, a saida deve ser parecida com essa

/opt/bee/beesoftDNS/beedns_executor.sh

tcpdump: listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes

11792 packets captured

11836 packets received by filter

0 packets dropped by kernel


Caso de erro, pode ser o caminho do arquivo. mude essa linha:

Acesse:

nano /opt/bee/beesoftDNS/beedns_executor.sh


Mude:

/usr/bin/timeout 10 /usr/sbin/tcpdump -ni $interface udp port 53 -w /opt/bee/beesoftDNS/tmp/dns.pcap


Por:

/usr/bin/timeout 10 /usr/bin/tcpdump -ni $interface udp port 53 -w /opt/bee/beesoftDNS/tmp/dns.pcap




# Crie uma chave Token para a sua API

uuid


A2:

3bea24aa-ab7e-11f0-a193-d2d63eb283bf


# Adicione a sua chave Token no seu arquivo views.py

nano /opt/bee/beesoftDNS/beeapi/views.py

VALID_TOKEN = "Sua-Chave-Token-uuid-Aqui"


# Libere no arquivo settings.py os ips que podem requisitar a API beedns (Uma seguranca a mais seria adicionar um iptables ou ufw, fica a seu criterio)

nano /opt/bee/beesoftDNS/beesoft/settings.py

# Lista de IPs permitidos

ALLOWED_IPS = [

    'ip-do-seu-grafana',

    'ip-de-onde-voce-quiser-testar',

    '127.0.0.1',  # Localhost

]



# Reinicie a API

systemctl restart beedns-server.service


# Faca um teste direto da API (A partir do IP que voce liberou na lista anterior, tenha cuidado com possiveis NATs no caminho):

Instale:

apt install curl -y



http://ip-do-seu-servidor-dns:8053/api/consulta/?token=Seu-Token-uuid-Aqui&file=9

curl "http://10.100.100.2:8053/api/consulta/?token=3bea24aa-ab7e-11f0-a193-d2d63eb283bf&file=9"


Exemplo feito direto no servidor ZABBIX para o Server DNS


# Adicione a atualização dos dados no crontab (Adicione no final do arquivo no servidor DNS)

crontab -e

# Atualizando informacoes de DNS | A cada 5min

*/5 * * * * /opt/bee/beesoftDNS/beedns_executor.sh > /opt/bee/beesoftDNS/logs/log_beedns_executor.txt


# Atualizando o total de clientes do DNS | A cada 5min

*/5 * * * * /usr/lib/zabbix/externalscripts/bee_captura_clientes_dns.sh > /usr/lib/zabbix/externalscripts/beedns/log_bee_captura_clientes_dns.txt


--------------


# Liste os seus agendamentos com crontab -l (l de list)

crontab -l


###########


# Caso eu passe pra voce testar os scripts que estao no crontab diretamente, sempre remove o redirecionamento com >, ex:

/opt/bee/beesoftDNS/beedns_executor.sh

ou

/usr/lib/zabbix/externalscripts/bee_captura_clientes_dns.sh


###########


# No Zabbix importe os templates:

--> Linux by Zabbix agent - BEE.yaml ou Linux by Zabbix agent padrao (Linux padrao by zabbix-agent)

--> Template Monitoramento DNS - BEE.yaml (Especifico do DNS)


##Cuidado com NAT



# No Grafana importe o json, selecione as datasources do Zabbix e do Infinity (Caso nao tenha o Infinity faca a instalacao, nao precisa configurar nada nele inicialmente).


# Ajuste as variaveis do Dashboard:

Coloque o IP do DNS e o TOKEN




# E pronto, seja feliz ;)

Tem dois templates diferentes.
Um para
DNS RECURSIVO - MASTER
DNS RECURSIVO - SLAVE


###########


Ref:

https://github.com/measurement-factory/dnstop

https://t.me/beesolutions

https://t.me/fernandoalmondes




#variavel grafana do hd

/Space: Used, in %|Space utilization/

Este artigo foi útil?

Que bom!

Obrigado pelo seu feedback

Desculpe! Não conseguimos ajudar você

Obrigado pelo seu feedback

Deixe-nos saber como podemos melhorar este artigo!

Selecione pelo menos um dos motivos

Feedback enviado

Agradecemos seu esforço e tentaremos corrigir o artigo