quinta-feira, 31 de janeiro de 2008

Tutorial para utilização do Ruby Bandwidth Monitor

Como várias pessoas estava solicitando auxílio para utilização do Ruby Bandwidth Monitor (RBM) e também eu estava fazendo várias alterações nele, agora que está em um estágio um pouco mais usável e com alguns recursos, vou descrever o método de instalação do Ruby e Libpcap-Ruby e onde alterar o código-fonte do rbm.rb para informar os parâmetros (que ainda não consigo enviar por linha de comando).

Tenho utilizado o RBM, constantemente, em sistemas Debian, tanto Etch (stable) como Lenny (testing), com Ruby1.8 e Libpcap-Ruby1.8, para instalá-los faça o seguinte, como root:
#apt-get install ruby1.8 libpcap-ruby1.8

Antes de iniciar, o RBM é utilizado em computadores que servem como roteadores de uma rede, fazendo NAT da rede interna para acesso a uma rede externa como a internet. Em todas as minhas configurações, sempre tenho a eth0 como dispositivo conectado à internet e eth1 para a rede interna.

Feito isto o sistema já estará pronto para rodar o RBM, para baixar o código-fonte, vá em http://www.katyphotoart.com/ruby/rbm.rb e para visualizar o codigo-fonte com a sintaxe colorida vá em http://www.katyphotoart.com/ruby/rbm.rb.html, portanto wget nele:

$wget http://www.katyphotoart.com/ruby/ruby.rb

Edite o arquivo e altere as variáveis globais que estão definidas a partir da linha 24 até a linha 29, onde explico a função de cada uma:
* $gateway_ip: o número de ip atribuído à interface que comunica-se com a rede interna, ou seja, o ip do gateway dos clientes.
* $device: dispositivo (eth0, eth1, etc) que comunica-se com a rede interna. Em uma próxima versão vai ser necessário informar só o dispositivo que o RBM será capaz de obter o $gateway_ip
* $sort_by: como explicado no código-fonte, indica por qual dos campos será classificado o resultado, ip (ou nome de máquina), traffic_in ou traffic_ou (para tráfegos de download ou upload), packets_in ou packets_out (para número de pacotes de download ou upload). Colocando um "-" (hífen) antes do parâmetro, a ordem de classificação será descendente, exemplo, "-ip".
* $refresh: o tempo em segundos para acúmulo e exibição dos resultados.
* $pcapoptions: para adicionar argumentos extras à biblioteca libpcap (responsável pela captura de pacotes), no estilo tcpdump. Digamos que eu queira obter somente o tráfego do cliente com ip 192.168.1.20, $pcapoptions terá como valor "host 192.168.1.20". Surigo a leitura do manpage do tcpdump para maiores detalhes.
* $nameshow: permite mostrar nome de máquina (obtida através do arquivo /etc/hosts) em detrimento ao número ip. Para tanto, defina o valor desta variável como "hostname", qualquer outro valor significa que deve ser exibido o número ip. (Em uma versão futura pretendo utilizar chamadas ao dns para conversão de nomes se isto mostrar-se realmente útil)

Feitas as alterações no código-fonte, basta rodar o programa, como root (pois é necessário para que a interface seja posta em modo promíscuo pela biblioteca libpcap):
#ruby1.8 rbm.rb

Para cancelar a execução do programa tecle a combinação CTRL+C.

Logo em seguida vou seguir a sugestão do keynes (eu acho) e permitir a exibição de "10.0.0.30" (exemplo), ao invés de "010.000.000.030" como acontece agora.

Era isto pessoal, qualquer dúvida é só perguntar

7 comentários:

bardo disse...

Muito bom! :-)

Um próximo passo legal seria transformá-lo num daemon, a gente configura a freqüência de checagens e geraria arquivos de log. ;-)

Aí quem sabe, uma interface web com gráficos de uso... ;-)

[]s!

Anônimo disse...

internet241:~# ruby1.8 rbm.rb
Warning:/usr/lib/ruby/1.8/pcaplet.rb:2: getopts is deprecated after Ruby 1.8.1; use optparse instead
3 packets received by filter
0 packets dropped by kernel
rbm.rb:69:in `sprintf': invalid value for Integer: "serial12-0-2-1-mpi-mg-rota-07" (ArgumentError)
from rbm.rb:69:in `fmt_ip'
from rbm.rb:173
from rbm.rb:172:in `loop'
from /usr/lib/ruby/1.8/pcaplet.rb:80:in `each_packet'
from rbm.rb:172
internet241:~#

Se puder ajudar, agradeço.. edu.galvao@gmail.com

biande disse...

Buenas galera!
Bom idéia bardo, vou pensar numa forma de transformá-lo em um daemon, ou mesmo uma forma de utilizá-lo em background gerando uma base de dados de estatística e uma interface web para visualização destes dados. De forma alguma tenho a pretensão de fazer frente o MTRG, mas realmente é uma idéia bem legal.
Anônimo, poderias me dizer qual a configuração do ambiente que tu está tentando rodar o RBM? Sistema Operacional [x86, x64]. O Ruby parece o 1.8 e qual tuas versões das bibliotecas libpcap e libpcap-ruby1.8.
Abraços

NetWalker disse...

saudacoes Flavio.
tudo blz?
dei uma rapida olhada no seu codigo e desde ja, parabens pela iniciativa.
o erro que o anonimo descreve eh com relacao a surgir ao inves de um ip, um hostname para fmt_ip resolver. e como vc espera algo no formato 000.000.000.000, vem o erro. (hostnames de dns por exemplo)
tomei liberdade de corrigir isso (fazendo resolucao de nomes) e a funcao de leitura do arquivo /etc/hosts para nao pegar comentarios, linhas vazias e outras coisas.
nao posso garantir q esta feito da melhor forma possivel, mas pelo menos esta corrigido para os erros obtidos.
jah te adianto q seria muito util pra evolucao do programa e mesmo pra conhecimento, aplicar algum refactoring. principalmente com relacao as classes. sobretudo pra aplicar mais OO e menos estrutural. e o programa "tah pedindo" mais classes. :)
de resto creio q eh soh.
se quiser alguma ajuda, me mande um email.
abracos.

Codigo revisado:
http://docs.google.com/Doc?id=dd7sbk9g_1c8shdwdc

biande disse...

Beleza netwalker! Realmente, em breve,vou meter a mão na massa e refatorar o projeto. Está mesmo bagunçado, mas como não sou muito bom em OO é certo que vou precisar da sua ajuda para isto. Bom, pelo que eu entendi, o que o anônimo quis era poder mostrar um ip o ip 192.168.0.2, assim mesmo, ou seja, 192.168.0.2, ao invés, de 192.168.000.002, como acontece no RBM agora. Quanto à função fmt_ip, ele espera mesmo um IP válido, até porque como ainda não está fatorado e eu sempre informava um IP "bem formado", não tinha me preocupado com verificação de erros. Gostei da contribuição.
Em breve mesmo, atualizações! Abraços

Paulo Lima disse...

Cara, parabéns pela iniciativa, era o que eu estava precisando, simples e objetivo!!
Parabéns mesmo!!

Catarini disse...

Não entendo nada! Mais tá bonito!
até logo!