quarta-feira, 24 de setembro de 2008

OpenVPN - grafico de usuarios conectados e trafego VPN com Cacti, SNMP e Shell Script

Faz algum tempo fiz um artigo sobre como instalar a OpenVPN (OpenVPN para acesso remoto (road-warrior)) para acesso remoto e até então, eu não tinha visto nada para estar monitorando minha VPN, onde fosse possível ter informações de quantos usuários estão conectados em um determinado momento ou ainda quanto tráfego passou por ela. Não estou dizendo o tráfego da interface eth0, eth1, e sim o que é transmitido dentro dos túneis criptografados onde representará realmente o que um usuário utilizou.

Pensando neste cenário iniciei uma busca por alternativas, a interface de gerenciamento da OpenVPN não é muito amigável e também não ajuda muito para tirar informações utilizando algum script. Acabei encontrando que a própria OpenVPN escreve um arquivo seu status atual a cada determinado tempo. Em minha instalação encontrei este arquivo executando um ps para visualizar os processos e verifiquei o parâmetro abaixo:
--status /var/run/openvpn.openvpn.status 10
Isso indica que o arquivo será escrito no diretório acima e atualizado a cada 10 segundos. Creio que é tempo suficiente para ter um arquivo que possa refletir o estado atual da nossa VPN! Ele é assim:

OpenVPN CLIENT LIST
Updated,Tue Sep 23 14:17:25 2008
CN,Real Addr,Bytes Rece,Bytes Sent,Connected Since
andre,216.106.173.161:1772,24215,26619,Tue Sep 23 13:27:50 2008
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.10.20.2,andre,216.106.173.161:1772,Tue Sep 23 13:27:59 2008
GLOBAL STATS
Max bcast/mcast queue length,0
END

A linha que nos interessa é a 4 (de cima para baixo) onde estão descritas informações sobre os usuários conectados. Ali é possível encontrar os bytes enviados/recebidos e podemos também saber quantos usuários estão conectados em um determinado momento, ou seja, temos as informações que necessitamos. Minha necessidade era a de disponibilizar esse gráfico da maneira mais fácil, e como aqui temos uma instalação do Cacti essa foi a melhor opção, porém ele não está instalado no mesmo servidor da VPN, obviamente, então eu precisava transmitir esses dados através da rede. A topologia neste caso era a seguinte:


Pesquisando na internet encontrei uma funcionalidade do agente snmpd onde é possível executar um Shell Script e retornar essas informações em um OID (Object IDentifier ou Identificador de Objeto) reservado para uso privado. Como meu servidor OpenVPN já possuía este instalado não foi necessário nenhum software adicional, só era necessário ajustar a configuração. O arquivo final ficou dessa forma:
rocommunity public
syslocation Brasil
syscontact Andre Zenun
extend .1.3.6.1.4.1.2021.50 vpnstats /bin/bash /etc/snmp/openvpn_statistics.sh
A linha responsável por fazer a transferência do resultado do script para o agente é a extend. O OID que está ali foi utilizado em um exemplo dentro do arquivo de configuração e sempre deve ser este. Após o identificador é necessário dar um nome, que no meu caso foi vpnstats um programa a ser executado, /bin/bash, e um parâmetro para ele /etc/snmp/openvpn_statistics.sh. É muito importante disponibilizar este arquivo em um local onde o usuário do daemon snmp possa executar. No meu caso precisei acrescentar uma entrada no arquivo sudoers para que fosse possível a execução do comando egrep. O script utilizado está disponibilizado neste link. A entrada no arquivo de configuração /etc/sudoers é muito simples:
snmp ALL = NOPASSWD:/bin/egrep
Muito bem, temos o script, configuramos o sudoers, acrescentamos a linha no arquivo de configuração do snmp e reiniciamos nosso agente. Com isso é possível executar um comando snmp verificando a saida do nosso script que será mais ou menos assim:
andre@linux:~$ snmpwalk -v2c -c public ipvpn -On .1.3.6.1.4.1.2021.50

.1.3.6.1.4.1.2021.50.2.1.2.8.118.112.110.115.116.97.116.115 = STRING: "/bin/bash"

.1.3.6.1.4.1.2021.50.2.1.3.8.118.112.110.115.116.97.116.115 = STRING: "/etc/snmp/openvpn_statistics.sh"

.1.3.6.1.4.1.2021.50.3.1.1.8.118.112.110.115.116.97.116.115 = STRING: "1 180156 986279"
Essa saída esta resumida porém a informação importante está em vermelho que é o OID que iremos utilizar e a resposta que iremos obter (número de usuários e bytes trafegados)! Bom, com isso feito, terminamos com a parte do lado do servidor OpenVPN, agora precisamos ir para o servidor onde está instalado o Cacti. Naquele lado criei outro script que irá executar a consulta SNMP e retornará a resposta. Eu disponibilizei o script neste link. No meu servidor eu o coloquei neste diretório /usr/share/cacti/site/scripts, verifique onde esta este diretório em sua instalação. Com tudo no lugar você pode fazer um teste executando o script na mão:
andre@linux:~#./vpn_stats.sh 10.10.10.1 public 1
vpnUsers:1 vpnBytesIn:180156 vpnBytesOut:986279
Essa será a resposta que o Cacti receberá. Para adicionar o script siga este tutorial disponível no site do Cacti onde é ensinado como partir de um Shell Script até chegar no gráfico. Algumas recomendações na hora de criar a base de dados rrd no Cacti é para o DS de usuários utilizar Gauge e para os bytes utilizar Derive com valor mínimo em zero. Com os procedimentos feitos, você poderá ter gráficos de sua vpn como esses:



Esses gráficos foram retirados do meu servidor Cacti mostrando trafego de testes em minha VPN e eu conectado ali! O Shell Script que é utilizado pelo Cacti pode facilmente ser adaptado para alimentar uma base de dados rrd. Não é necessário utilizar este front-end para o RRDTools. Caso você tenha alguma dificuldade com essa ferramenta não deixe de conferir este artigo RRDTool - Você sabe trabalhar com ele? para aprender um pouco mais sobre ele!

Caso você tenha alguma sugestão, dúvida, crítica por favor não deixe de entrar em contato! Sua opinião é importante! Espero que com este artigo tenha conseguido contribuir com idéias úteis para a administração de seu servidor!

Nenhum comentário: