Como obter gráficos de tráfego por AS utilizando AS-STATS (open source)

AS-Stats é uma ferramenta simples para gerar gráficos de tráfego por AS a partir de registros NetFlow / sFlow criada
por Manuel Kasper para Monzoon Networks AG está na versão 1.6 (2014-09-12) e atualmente não tem mais tempo para manter AS-Stats. No entanto houve algumas contribuições e além disso, Nicolas Debrigode lançou uma IU da Web mais moderna para AS-Stats, bem como o Jack Slateur que contribui para o mapeamento de IP para ASN.

Com todas essas melhorias fiz um novo fork do projeto AS-Stats atualizado varias coisas e unificando todo o projeto.

Como funciona

Um script Perl (asstatd.pl) coleta registros de agregação do NetFlow v8/v9 AS ou amostras sFlow v5 de um ou mais roteadores. Ele os armazena em cache por cerca de um minuto (para evitar gravações excessivas em arquivos RRD), identifica o link a que cada registro se refere (por meio do índice de interface de entrada/saída SNMP), mapeia-o para um “link conhecido” correspondente e dados RRD fonte e, em seguida, executa o RRDtool. Para evitar a perda de novos registros enquanto os arquivos RRD são atualizados, a tarefa de atualização é executada em um processo separado.

Para cada AS, um arquivo RRD separado é criado conforme necessário. Ele contém duas fontes de dados para cada link – uma para o tráfego de entrada e outra para o tráfego de saída. Em gráficos de tráfego por AS gerados, o tráfego de entrada é mostrado como positivo, enquanto o tráfego de saída é mostrado como valores negativos.

Outro script Perl, rrd-extractstats.pl, deve ser executado uma vez por hora. Ele soma o tráfego por AS e link durante as últimas 24 horas, classifica os AS pelo tráfego total (decrescente) e grava os resultados em um arquivo de texto. Isso é então usado para exibir os “principais N AS” e outras estatísticas dos scripts PHP fornecidos.

Considerações

Os arquivos RRD são pequenos, mas existem em grande quantidade. Você verá um ganho de desempenho em um sistema de arquivos como XFS sobre EXT4. Considere em qual sistema de arquivos você colocou os arquivos RRD se o desempenho for um fator para suas necessidades.

Pré-requisitos

Debian 11 Bullseye – Instalação Limpa

Hardware vai depender muito da quantidade de flows coletado, mas ele é muito mais modesto em relação ao elastflow, vou deixar aqui um exemplo, de um servidor que subi com o Rudson para coletar ~5GB de um Huawei NE40 coletando de 4 interfaces. (4CPU 2.20GHz + 8GB Ram) mas como pode ver no print está super de boa 🙂

Na questão de espaço em disco vai depender de quantas interfaces vc irá coletar, mas se prepare com ~50GB para não ter dor de cabeça, e na pior das hipóteses #format 😀

Ajustes seu repositório para pacotes non-free e contrib:

# vim /etc/apt/sources.list

Ajuste:

deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free

deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free

deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free

Instalaremos todos os pacotes necessários para o projeto

# apt update
# apt install \
  unzip wget git net-tools curl dnsutils whois build-essential \
  perl libnet-patricia-perl libjson-xs-perl netcat python3-requests \
  libdbd-sqlite3-perl libtrycatch-perl rrdtool-tcl libgd-graph-perl \
  librrds-perl librrdp-perl librrdtool-oo-perl \
  rrdtool python3-rrdtool python3-rrdtool-dbg librrd-dev rrdcollect \
  apache2 libapache2-mod-php php php-sqlite3 \
  php-cli php-gmp php-gd php-bcmath php-mbstring \
  php-pear php-curl php-xml php-zip libyaml-perl
# perl -MCPAN -e 'install Net::sFlow'

Responta YES

Would you like to configure as much as possible automatically? [yes]

Último resultado será:

/usr/bin/make install  -- OK
# perl -MCPAN -e 'install File::Find::Rule'

Último resultado será:

/usr/bin/make install  -- OK

Como dito unifique todo o projeto, então vamos baixa-lo em uma pasta /data onde ficará todos os arquivos.

# mkdir /data/
# cd /data/
# git clone https://github.com/remontti/AS-Stats.git asstats
# mkdir /data/asstats/rrd

Pesquisas adicionais (em caso de Mikrotik será necessário um complemento a mais já que o flow enviado não vem informação do AS, a solução gambiarra é usar um “tradutor de IPs para AS”.

# cp /data/asstats/ip2asn/ip2as.pm /usr/share/perl5/

Vai ser necessário instalar o snmpwalk e as MIBs para coletarmos informações do router, pois é com essas informações que vamos dizer qual interface vamos coletar os flows.

# apt install snmp snmp-mibs-downloader
# cp  /etc/snmp/snmp.conf   /etc/snmp/snmp.conf.old
# echo "" > /etc/snmp/snmp.conf

Para fazer a coleta precisamos saber o identificador (ifIndex) da interface, para isso então vamos usar o snmpwalk para descobrir qual os nomes (ifDescr) primeiro e em seguida o identificador (ifIndex).

Exemplo de saída snmpwalk de um huawei:

# snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifDescr
IF-MIB::ifDescr.1 = STRING: Virtual-Template0
IF-MIB::ifDescr.2 = STRING: NULL0
IF-MIB::ifDescr.3 = STRING: InLoopBack0
IF-MIB::ifDescr.4 = STRING: Ethernet0/0/0
IF-MIB::ifDescr.6 = STRING: GigabitEthernet0/7/0
IF-MIB::ifDescr.7 = STRING: GigabitEthernet0/7/1
IF-MIB::ifDescr.8 = STRING: GigabitEthernet0/7/2
IF-MIB::ifDescr.9 = STRING: GigabitEthernet0/7/3
IF-MIB::ifDescr.10 = STRING: GigabitEthernet0/7/4
IF-MIB::ifDescr.11 = STRING: GigabitEthernet0/7/5
IF-MIB::ifDescr.12 = STRING: GigabitEthernet0/7/6
IF-MIB::ifDescr.13 = STRING: GigabitEthernet0/7/7
IF-MIB::ifDescr.14 = STRING: GigabitEthernet0/7/8
IF-MIB::ifDescr.15 = STRING: GigabitEthernet0/7/9
IF-MIB::ifDescr.32 = STRING: LoopBack1023
IF-MIB::ifDescr.33 = STRING: Eth-Trunk100
IF-MIB::ifDescr.34 = STRING: Eth-Trunk100.2022
IF-MIB::ifDescr.35 = STRING: Eth-Trunk100.309
IF-MIB::ifDescr.36 = STRING: Eth-Trunk100.700
IF-MIB::ifDescr.37 = STRING: Eth-Trunk100.701
IF-MIB::ifDescr.38 = STRING: Eth-Trunk100.928
IF-MIB::ifDescr.39 = STRING: Eth-Trunk100.929
IF-MIB::ifDescr.40 = STRING: LoopBack0
IF-MIB::ifDescr.41 = STRING: Eth-Trunk100.200
IF-MIB::ifDescr.42 = STRING: Eth-Trunk100.2371
IF-MIB::ifDescr.44 = STRING: Eth-Trunk100.3675
IF-MIB::ifDescr.45 = STRING: Eth-Trunk100.3672
# snmpwalk -v2c -c public 10.250.250.1 IF-MIB::ifIndex
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifIndex.6 = INTEGER: 6
IF-MIB::ifIndex.7 = INTEGER: 7
IF-MIB::ifIndex.8 = INTEGER: 8
IF-MIB::ifIndex.9 = INTEGER: 9
IF-MIB::ifIndex.10 = INTEGER: 10
IF-MIB::ifIndex.11 = INTEGER: 11
IF-MIB::ifIndex.12 = INTEGER: 12
IF-MIB::ifIndex.13 = INTEGER: 13
IF-MIB::ifIndex.14 = INTEGER: 14
IF-MIB::ifIndex.15 = INTEGER: 15
IF-MIB::ifIndex.32 = INTEGER: 32
IF-MIB::ifIndex.33 = INTEGER: 33
IF-MIB::ifIndex.34 = INTEGER: 34
IF-MIB::ifIndex.35 = INTEGER: 35
IF-MIB::ifIndex.36 = INTEGER: 36
IF-MIB::ifIndex.37 = INTEGER: 37
IF-MIB::ifIndex.38 = INTEGER: 38
IF-MIB::ifIndex.39 = INTEGER: 39
IF-MIB::ifIndex.40 = INTEGER: 40
IF-MIB::ifIndex.41 = INTEGER: 41
IF-MIB::ifIndex.42 = INTEGER: 42
IF-MIB::ifIndex.44 = INTEGER: 44
IF-MIB::ifIndex.45 = INTEGER: 45

Exemplo de saída snmpwalk de um RouterOS/Mikrotik:

# snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifDescr
IF-MIB::ifDescr.1 = STRING: sfp-sfpplus1
IF-MIB::ifDescr.2 = STRING: sfp-sfpplus2
IF-MIB::ifDescr.3 = STRING: ether1
IF-MIB::ifDescr.4 = STRING: ether2
IF-MIB::ifDescr.5 = STRING: ether3
IF-MIB::ifDescr.6 = STRING: ether4
IF-MIB::ifDescr.7 = STRING: ether5
IF-MIB::ifDescr.8 = STRING: ether6
IF-MIB::ifDescr.9 = STRING: ether7
IF-MIB::ifDescr.10 = STRING: ether8
IF-MIB::ifDescr.11 = STRING: VLAN-IX-SP-IPv4.10
IF-MIB::ifDescr.12 = STRING: VLAN-IX-SP-IPv6.11
IF-MIB::ifDescr.13 = STRING: VLAN-IX-PR-IPv6.20
IF-MIB::ifDescr.14 = STRING: VLAN-IX-PR-IPv4.21
IF-MIB::ifDescr.15 = STRING: VLAN-IX-RS-IPv4.30
IF-MIB::ifDescr.16 = STRING: VLAN-IX-RS-IPv6.31
# snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifIndex
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifIndex.5 = INTEGER: 5
IF-MIB::ifIndex.6 = INTEGER: 6
IF-MIB::ifIndex.7 = INTEGER: 7
IF-MIB::ifIndex.8 = INTEGER: 8
IF-MIB::ifIndex.9 = INTEGER: 9
IF-MIB::ifIndex.10 = INTEGER: 10
IF-MIB::ifIndex.11 = INTEGER: 11
IF-MIB::ifIndex.13 = INTEGER: 13
IF-MIB::ifIndex.14 = INTEGER: 14
IF-MIB::ifIndex.15 = INTEGER: 15
IF-MIB::ifIndex.16 = INTEGER: 16

Agora que já sabemos os IDs (ifIndex) das suas respectivas interfaces:

Vamos aos ajustes as entradas no arquivo knownlinks:

# vim /data/asstats/conf/knownlinks

Exemplo:

# nota: tabulações devem ser usadas para separar campos (não espaços)
# máx. o comprimento da tag é de 12 caracteres; caracteres permitidos: a-z A-Z 0-9 _
# sampling: taxa de amostragem pode ser separada para entrada / saída especificando taxas <in> / <out>.
#
# Router IP		SNMP ifindex    tag					description	color	samplingrate
10.20.30.2		11				vlan10				IX.SP 		F44336	1
10.20.30.2		15				vlan30				IX.RS		CDDC39	1
10.20.30.2		13				vlan20				IX.PR		4CAF50	1
10.20.30.2		5				Eth-Trunk100.309	LINK1	009688	128
10.20.30.2		2				Eth-Trunk100.308	LINK2	A09688	128

Para melhor entendimento:

knownlinks configurado, vamos configurar nosso arquivo que inicirá o processo, mas mantes é necessário informar o seu AS e caso for um RouterOS/Mikrotik as coisas mudam um pouco.

# vim /data/asstats/bin/start

Altere para seu AS

MEUAS=1234

Se seu router é um RouterOS/Mikrotik permaneça com a linha a baixo descomentada!

perl ${ASSTATD} -r ${DIRRRD} -k ${KNOWNLINKS} -a ${MEUAS} -n -m ${IP2ASN} &

Caso ser outro, comente a linha acima e descomenta a linha:

perl ${ASSTATD} -r ${DIRRRD}  -p 9996 -P 6343 -k ${KNOWNLINKS} -a ${MEUAS} &

Exemplo: “AS 666 no Huawei”

#!/bin/bash

# Informe seu AS:
MEUAS=666

ASSTATD='/data/asstats/bin/asstatd.pl'
DIRRRD='/data/asstats/rrd'
KNOWNLINKS='/data/asstats/conf/knownlinks'
IP2ASN='/data/asstats/ip2asn/ip2asn.json'

# -p = Port netflow / -P port sflow
# 
# netflow/sflow - (Huawei NE, Cisco, JunOS...)
perl ${ASSTATD} -r ${DIRRRD}  -p 9996 -P 6343 -k ${KNOWNLINKS} -a ${MEUAS} &

# Flow v5 - (RoutesOS/Mikrotik)
# perl ${ASSTATD} -r ${DIRRRD} -k ${KNOWNLINKS} -a ${MEUAS} -n -m ${IP2ASN} &

Para iniciar o serviço execute:

# /data/asstats/bin/start

Verifique se as portas estão ouvindo

# netstat -putan  |grep perl
udp        0      0 0.0.0.0:9996            0.0.0.0:*                           1261/perl           
udp        0      0 0.0.0.0:6343            0.0.0.0:*                           1261/perl  

Para carregar o start na inicialização faça:

# ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
# vim /etc/rc.local

Adicione

#!/bin/bash
/data/asstats/bin/start
exit 0

Altere as permissões para execução:

# chmod +x /etc/rc.local

Ajustes no cron:

# crontab -e

Adicione as linhas a baixo ao final do arquivo:

# 5min
*/5 * * * * perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_day.txt

# 7 Dias
#0 0 * * 0 perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_week.txt 168

# 30 dias 
#0 0 1 * * perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_month.txt 720

Reinicie o serviço cron

# systemctl restart cron

Instale o tcpdump para verificar se os pacotes irão chegando ao seu servidor ao configurar os flows em seu servidor. Obs: enp0s3 é o nome da interface do servidor.

# apt install tcpdump
# tcpdump -i enp0s3 -n udp port 9996 -T cnfp

Configuração para o router

RouterOS/Mikrotik (Flow v5)

/ip traffic-flow
set active-flow-timeout=5m cache-entries=16k enabled=yes interfaces=INTERFACES

/ip traffic-flow ipfix
set dst-address-mask=no dst-mac-address=no first-forwarded=no gateway=no icmp-code=no icmp-type=no igmp-type=no ip-header-length=no ip-total-length=no ipv6-flow-label=no is-multicast=no last-forwarded=no \
    nat-dst-address=no nat-dst-port=no nat-src-address=no nat-src-port=no src-address-mask=no src-mac-address=no tcp-ack-num=no tcp-flags=no tcp-seq-num=no tcp-window-size=no tos=no ttl=no udp-length=no

/ip traffic-flow target
add dst-address=IP_SERVER_ASSTATS port=9996 src-address=IP_ORIGEM version=5

Huawei NE Netstream (netflow)

Contribuição o Rudson Costa / Gabriel Mocan compartilhou: (Huawei NE40/8000)

# CONFIG GLOBAL
#
ip netstream export version 9 origin-as
ip netstream export index-switch 32
ip netstream as-mode 32
ip netstream timeout active 5
ip netstream timeout inactive 60
ip netstream export template timeout-rate 1
ip netstream export template option sampler
ip netstream sampler fix-packets 128 inbound
ip netstream sampler fix-packets 128 outbound
ip netstream export source >>IPV4_LOOPBACK_ORIGEM<<
ip netstream export host >>IP_SERVIDOR<< 9996
#
ipv6 netstream export version 9 origin-as
ipv6 netstream export index-switch 32
ipv6 netstream as-mode 32
ipv6 netstream timeout active 5
ipv6 netstream timeout inactive 60
ipv6 netstream export template timeout-rate 1
ipv6 netstream export template option sampler
ipv6 netstream sampler fix-packets 128 inbound
ipv6 netstream sampler fix-packets 128 outbound
ipv6 netstream export source >>IPV4_LOOPBACK_ORIGEM<<
ipv6 netstream export host >>IP_SERVIDOR<< 9996

# CONFIG NO SLOT 
# NE40: slot 3
# NE8000-F1A: slot 0
# NE8000-M8: slot 9 ou 10 

# EXECUTE O COMANDO NO ROOT (ADM), COMANDO NÃO FUNCIONA EM VS
slot 0
 ip netstream sampler to slot self
 ipv6 netstream sampler to slot self

# APLICAR APENAS NAS INTERFACES UPSTREAM (LINK IP, PTT, IX...)
ip netstream inbound
ip netstream outbound
ipv6 netstream inbound
ipv6 netstream outbound

# EM CASO DE INTERFACES DE CDN INTERNO, APLICAR:
ip netstream inbound
ipv6 netstream inbound

# EM CASO DE INTERFACE BILATERAL (ONDE TANTO RECEBE QUANTO ENVIA CONTEÚDO), APLICAR:
ip netstream inbound
ipv6 netstream inbound

Contribuição do Thiago Melo para Juniper:

# ---- ipv4
set chassis afeb slot 0 sampling-instance as-stats
set chassis afeb slot 0 inline-services flow-table-size ipv4-flow-table-size 10
set chassis afeb slot 0 inline-services flow-table-size ipv6-flow-table-size 10

set forwarding-options sampling instance as-stats input rate 2048
set forwarding-options sampling instance as-stats input max-packets-per-second 4096
set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW port 9996
set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW autonomous-system-type origin
set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW no-local-dump
set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW version-ipfix template ipv4
set forwarding-options sampling instance as-stats family inet output inline-jflow source-address IP_ORIGEM

set services flow-monitoring version-ipfix template ipv4 flow-active-timeout 60
set services flow-monitoring version-ipfix template ipv4 flow-inactive-timeout 30
set services flow-monitoring version-ipfix template ipv4 template-refresh-rate packets 48000
set services flow-monitoring version-ipfix template ipv4 template-refresh-rate seconds 30
set services flow-monitoring version-ipfix template ipv4 option-refresh-rate packets 48000
set services flow-monitoring version-ipfix template ipv4 option-refresh-rate seconds 30
set services flow-monitoring version-ipfix template ipv4 ipv4-template

set interfaces xe-2/0/0 unit 0 family inet sampling input
set interfaces xe-2/0/0 unit 0 family inet sampling output

# ---- ipv6

set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW port 9996
set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW autonomous-system-type origin
set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW no-local-dump
set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW version-ipfix template ipv6
set forwarding-options sampling instance as-stats family inet6 output inline-jflow source-address IP_ORIGEM

set services flow-monitoring version-ipfix template ipv6 flow-active-timeout 60
set services flow-monitoring version-ipfix template ipv6 flow-inactive-timeout 60
set services flow-monitoring version-ipfix template ipv6 template-refresh-rate packets 1000
set services flow-monitoring version-ipfix template ipv6 template-refresh-rate seconds 10
set services flow-monitoring version-ipfix template ipv6 option-refresh-rate packets 1000
set services flow-monitoring version-ipfix template ipv6 option-refresh-rate seconds 10
set services flow-monitoring version-ipfix template ipv6 ipv6-template

set interfaces xe-2/0/0 unit 0 family inet6 sampling input
set interfaces xe-2/0/0 unit 0 family inet6 sampling output

No projeto oficial você encontra modelos de configurações para outros vendors.

Agora é aguardar ~5 min até gerar os arquivos em /data/asstats/rrd

Uma boa dica é você ficar ligado com o a saúde do seu servidor, olhar para o processamento/memoria e como ta a escrita no disco é importante, vou deixar duas ferramentas para observar isso:

# apt install htop iotop
# htop
# iotop

Agora precisamos fazer o acesso web para visualizar as informações.
Ajustes de segurança para o apache:

# sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf
# sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf-available/security.conf

Para ficar algo bom vou criar um domínio virtual para acessar o as-stats, não esqueça de apontar em seu DNS!

# vim /etc/apache2/sites-available/asstats.conf

Ajuste para sua realidade, fique ligado que em Require ip só permite que estes tenham acesso:

<virtualhost *:80>
   ServerName asstats.remontti.com.br
   ServerAdmin noc@remontti.com.br
 
   DocumentRoot /data/asstats/www
 
   ErrorDocument 403 http://www.remontti.com.br
 
   <Directory /data/asstats/www/>
      Options FollowSymLinks
      AllowOverride All
      Require all denied
      <RequireAll>
         <RequireAny>
            Require ip 192.168.0.0/24 2804:1234:bebe::/48
         </RequireAny>
      </RequireAll>
   </Directory>
 
   ErrorLog ${APACHE_LOG_DIR}/error_asstats.log
   CustomLog ${APACHE_LOG_DIR}/access_asstats.log combined
 
</VirtualHost>
# a2ensite asstats.conf
# systemctl restart apache2

Ajuste seu ASN:

# vim /data/asstats/www/config.inc 

Localize $my_asn = "1234" e altere pelo seu.

$my_asn = "1234";

Execute para que o asstats_day.txt seja criado e ao acessar o web-ui não fique em branco.

# perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_day.txt

Acesse em seu navegador "http://asstats.remontti.com.br". Caso você não tenha dificuldade com dominios virtuais pode fazer um atalho dentro de /var/www/html, assim basta vc acessar o IP/as-stats/

# ln -s /data/asstats/www/ /var/www/html/as-stats

e acessar http://ip/as-stats

Espero que tenha gostado!

Se quiser fazer uma doação para o café ficarei muito feliz pelo seu reconhecimento!

Participe do canal no telegram para ficar atualizado sempre que publicar um novo tutorial.

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.

Fontes:
https://github.com/manuelkasper/AS-Stats
https://github.com/nidebr/as-stats-gui
https://github.com/JackSlateur/perl-ip2as

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

66 Resultados

  1. Wilson disse:

    Pessoal, boa noite.
    Estava tudo funcionando, de uma hora para a outra parou de mostrar o grafico de ipv6, analizando o arquivo rrd do AS do google da pra ver que nao está preenchendo ipv6 no arquivo.
    Estranho porque estava funcionando e de repente parou.

    ds[IX_RJ_V6_in].index = 0
    ds[IX_RJ_V6_in].type = “ABSOLUTE”
    ds[IX_RJ_V6_in].minimal_heartbeat = 300
    ds[IX_RJ_V6_in].min = NaN
    ds[IX_RJ_V6_in].max = NaN
    ds[IX_RJ_V6_in].last_ds = “U”
    ds[IX_RJ_V6_in].value = NaN
    ds[IX_RJ_V6_in].unknown_sec = 151
    ds[IX_RJ_V6_out].index = 1
    ds[IX_RJ_V6_out].type = “ABSOLUTE”
    ds[IX_RJ_V6_out].minimal_heartbeat = 300
    ds[IX_RJ_V6_out].min = NaN
    ds[IX_RJ_V6_out].max = NaN
    ds[IX_RJ_V6_out].last_ds = “U”
    ds[IX_RJ_V6_out].value = NaN
    ds[IX_RJ_V6_out].unknown_sec = 151
    ds[IX_RJ_V6_v6_in].index = 2
    ds[IX_RJ_V6_v6_in].type = “ABSOLUTE”
    ds[IX_RJ_V6_v6_in].minimal_heartbeat = 300
    ds[IX_RJ_V6_v6_in].min = NaN
    ds[IX_RJ_V6_v6_in].max = NaN
    ds[IX_RJ_V6_v6_in].last_ds = “U”
    ds[IX_RJ_V6_v6_in].value = NaN
    ds[IX_RJ_V6_v6_in].unknown_sec = 151
    ds[IX_RJ_V6_v6_out].index = 3
    ds[IX_RJ_V6_v6_out].type = “ABSOLUTE”
    ds[IX_RJ_V6_v6_out].minimal_heartbeat = 300
    ds[IX_RJ_V6_v6_out].min = NaN
    ds[IX_RJ_V6_v6_out].max = NaN
    ds[IX_RJ_V6_v6_out].last_ds = “U”
    ds[IX_RJ_V6_v6_out].value = NaN
    ds[IX_RJ_V6_v6_out].unknown_sec = 151
    ds[UFINET_in].index = 4
    ds[UFINET_in].type = “ABSOLUTE”
    ds[UFINET_in].minimal_heartbeat = 300
    ds[UFINET_in].min = NaN
    ds[UFINET_in].max = NaN
    ds[UFINET_in].last_ds = “U”
    ds[UFINET_in].value = NaN
    ds[UFINET_in].unknown_sec = 151
    ds[UFINET_out].index = 5
    ds[UFINET_out].type = “ABSOLUTE”
    ds[UFINET_out].minimal_heartbeat = 300
    ds[UFINET_out].min = NaN
    ds[UFINET_out].max = NaN
    ds[UFINET_out].last_ds = “943626240”
    ds[UFINET_out].value = 1,5043354829e+09
    ds[UFINET_out].unknown_sec = 0
    ds[UFINET_v6_in].index = 6
    ds[UFINET_v6_in].type = “ABSOLUTE”
    ds[UFINET_v6_in].minimal_heartbeat = 300
    ds[UFINET_v6_in].min = NaN
    ds[UFINET_v6_in].max = NaN
    ds[UFINET_v6_in].last_ds = “U”
    ds[UFINET_v6_in].value = NaN
    ds[UFINET_v6_in].unknown_sec = 151
    ds[UFINET_v6_out].index = 7
    ds[UFINET_v6_out].type = “ABSOLUTE”
    ds[UFINET_v6_out].minimal_heartbeat = 300
    ds[UFINET_v6_out].min = NaN
    ds[UFINET_v6_out].max = NaN
    ds[UFINET_v6_out].last_ds = “U”
    ds[UFINET_v6_out].value = NaN
    ds[UFINET_v6_out].unknown_sec = 151
    ds[IX_RJ_V4_in].index = 12
    ds[IX_RJ_V4_in].type = “ABSOLUTE”
    ds[IX_RJ_V4_in].minimal_heartbeat = 300
    ds[IX_RJ_V4_in].min = NaN
    ds[IX_RJ_V4_in].max = NaN
    ds[IX_RJ_V4_in].last_ds = “5672665088”
    ds[IX_RJ_V4_in].value = 8,4490391552e+09
    ds[IX_RJ_V4_in].unknown_sec = 0
    ds[IX_RJ_V4_out].index = 13
    ds[IX_RJ_V4_out].type = “ABSOLUTE”
    ds[IX_RJ_V4_out].minimal_heartbeat = 300
    ds[IX_RJ_V4_out].min = NaN
    ds[IX_RJ_V4_out].max = NaN
    ds[IX_RJ_V4_out].last_ds = “119681024”
    ds[IX_RJ_V4_out].value = 1,8860417024e+08
    ds[IX_RJ_V4_out].unknown_sec = 0
    ds[IX_RJ_V4_v6_in].index = 14
    ds[IX_RJ_V4_v6_in].type = “ABSOLUTE”
    ds[IX_RJ_V4_v6_in].minimal_heartbeat = 300
    ds[IX_RJ_V4_v6_in].min = NaN
    ds[IX_RJ_V4_v6_in].max = NaN
    ds[IX_RJ_V4_v6_in].last_ds = “U”
    ds[IX_RJ_V4_v6_in].value = NaN
    ds[IX_RJ_V4_v6_in].unknown_sec = 151
    ds[IX_RJ_V4_v6_out].index = 15
    ds[IX_RJ_V4_v6_out].type = “ABSOLUTE”
    ds[IX_RJ_V4_v6_out].minimal_heartbeat = 300
    ds[IX_RJ_V4_v6_out].min = NaN
    ds[IX_RJ_V4_v6_out].max = NaN
    ds[IX_RJ_V4_v6_out].last_ds = “U”
    ds[IX_RJ_V4_v6_out].value = NaN
    ds[IX_RJ_V4_v6_out].unknown_sec = 151
    ds[WIXNET_in].index = 16
    ds[WIXNET_in].type = “ABSOLUTE”
    ds[WIXNET_in].minimal_heartbeat = 300
    ds[WIXNET_in].min = NaN
    ds[WIXNET_in].max = NaN
    ds[WIXNET_in].last_ds = “857104384”
    ds[WIXNET_in].value = 1,3087281357e+09
    ds[WIXNET_in].unknown_sec = 0
    ds[WIXNET_out].index = 17
    ds[WIXNET_out].type = “ABSOLUTE”
    ds[WIXNET_out].minimal_heartbeat = 300
    ds[WIXNET_out].min = NaN
    ds[WIXNET_out].max = NaN
    ds[WIXNET_out].last_ds = “5097472”
    ds[WIXNET_out].value = 6,5566105600e+06
    ds[WIXNET_out].unknown_sec = 0
    ds[WIXNET_v6_in].index = 18
    ds[WIXNET_v6_in].type = “ABSOLUTE”
    ds[WIXNET_v6_in].minimal_heartbeat = 300
    ds[WIXNET_v6_in].min = NaN
    ds[WIXNET_v6_in].max = NaN
    ds[WIXNET_v6_in].last_ds = “U”
    ds[WIXNET_v6_in].value = NaN
    ds[WIXNET_v6_in].unknown_sec = 151
    ds[WIXNET_v6_out].index = 19
    ds[WIXNET_v6_out].type = “ABSOLUTE”
    ds[WIXNET_v6_out].minimal_heartbeat = 300
    ds[WIXNET_v6_out].min = NaN
    ds[WIXNET_v6_out].max = NaN
    ds[WIXNET_v6_out].last_ds = “U”
    ds[WIXNET_v6_out].value = NaN
    ds[WIXNET_v6_out].unknown_sec = 151

    Equipamento Huawei. NE8000, alguma luz ?

    Cheguei a instalar tudo novamente e continua somente com grafico ipv4, não vem nada de ipv6 no rrd.
    Obrigado.

  2. Hi Rudimar,

    Thank you for your articles, it works for me to view the graphics normally with Mikrotik RouterOS v6
    But I have some issues where the IPv6 in/out bytes shows zero and the IPv6 graph doesnt show any.. is there any suggestion about this?

  3. Fabio Luiz Oliveira do Nascimento disse:

    Boa tarde,

    Tada vez que eu coloco uma nova sessão BGP eu perco todo o histórico de gráficos, isto é, os graficos zeram e começão a popular novamente.

    Qual a soução?

  4. Parabéns pelo belo conteúdo Rudimar. Para que tiver usando Huawei NE8000 F1A para exibir a amostragem corretamente nos gráficos só mudar o samplingrate para 128.

  5. Frands Franco disse:

    Boa tarde,

    estou com um dúvida, qual valor colocar no campo:
    sampling: taxa de amostragem pode ser separada para entrada / saída especificando taxas /

  6. Frands Souza Franco disse:

    Boa tarde,

    tem uma aba Ver Status IX, não aparece os IX, como proceder ?

    Obrigado pela ajuda

  7. Frands Franco disse:

    Boa tarde,

    Instalei o as-stats baseado no tutorial, funcionou tudo certo.
    So que os gráficos estão mostrando em k, como ajusto isto ?

    Não entendi que número coloco neste campo abaixo:
    sampling: taxa de amostragem pode ser separada para entrada / saída especificando taxas /

    Obrigado pela ajuda

  8. Paulo disse:

    Ola. Como eu posso arrumar?
    perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_day.txt

    DBD::SQLite::db do failed: near “-“: syntax error at /data/asstats/bin/rrd-extractstats.pl line 64.

  9. Rafael Lopes Mira disse:

    Pessoal, para quem estiver com a falha citada abaixo, corrija as TAGs no KNOWLINKS tirando o “-” dos nomes, utilize o “.” no lugar. É um bug que foi detectado e reportado já para correção.

    DBD::SQLite::db do failed: no such table: stats at /data/asstats/bin/rrd-extractstats.pl line 78.

  10. Rudimar nota 1000 o tutorial me ajudou muito
    Mas to esbarrado no seguinte comando :
    perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_day.txt

    Está retornando o seguinte erro: BEGIN failed –compilation aborted at /data/asstats/bin/rrd/extractsstats.pl line 11
    E tambem aqui no comando :
    1
    # vim /data/asstats/conf/knownlinks , estou usando uma mikrotik

    Se puder salva o iniciante aqui ficou grato.

  11. Robson Estevam disse:

    O de vocês continuam funcionando?
    O meu parou de gerar os gráficos à quase 1 mês, acredito que foi depois de alguma atualização do debian. Já refiz toda a instalação e mesmo assim ele coleta as informações, adiciona na pasta rrd mas ao chamar o script de gerar os gráficos ele simplesmente não gera/atualiza os gráficos. Como se ele não identificasse que existe novos dados.

  12. Natan disse:

    O meu ta mostrando em MB, como faço para alterar para mostra em M,

  13. Guilherme Alves Kruk disse:

    Para um trafego de 20 Gb qual seria a configuração de CPU, Memoria, Disco que a maquina deve ter, pode subir em uma maquina virtual?

  14. Alessandro disse:

    Boa tarde!
    Alguém conseguiu usar o AS-STATS com HUAWEI ?
    Quando adiciono minhas interfaces no arquivo KNOWNLINKS e rodo o comando: ln -s /data/asstats/www/ /var/www/html/as-stats
    Ele apresenta o seguinte erro: DBD::SQLite::db do failed: near “/”: syntax error at /data/asstats/bin/rrd-extractstats.pl line 64.

  15. Jean disse:

    Alguém conseguiu gerar os gráficos?

    minha pasta rrd fica vazia e vejo o seguinte erro:

    ERROR: opening ‘/data/asstats/rrd/1a/267034.rrd’: No such file or directory

  16. Elcimar disse:

    Caso alguém se interesse, fiz um script pra gerar o arquivo knownlinks a partir do resultado do snmpwalk. O arquivo gerado serve como um ponto de partida quando se tem muitas interfaces pra monitorar. O repositório tá aqui: https://github.com/simakwm/klgenerator

  17. Charles disse:

    DBD::SQLite::db do failed: no such table: stats at /data/asstats/bin/rrd-extractstats.pl line 78.

  18. Tiago Rocha disse:

    bom dia.
    eu conseguiria deixar ele ativo e capturar simultaneamente dados provenientes de uma mikrotik e de um juniper ?

    obrigado.

  19. Ricardo disse:

    /data/asstats/rrd/ – Ajuda nóis não grava nada, as conf tudo certo chegando flow, snmp index ok, site ok.

  20. Daniel disse:

    Não consigo nenhum retorno quando tento executar o snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifDescr

    RETORNO:
    snmpwalk -v2c -c noc-novonet 186.251.103.1 IF-MIB::ifDescr
    Timeout: No Response from 186.251.103.1

  21. Bruno disse:

    Olá todos,

    Fiz a instalação num Debian 10 limpo seguindo à risca o tutorial mas não gera nenhum RRD, no syslog vejo os seguintes erros:

    Apr 8 02:49:36 as-stats rc.local[485]: Error creating RRD file /data/asstats/rrd/7d/28285.rrd: invalid DS format
    Apr 8 02:49:36 as-stats rc.local[485]: Error updating RRD file : opening ”: No such file or directory

    Alguém sabe o que pode ser?

  22. Jefferson disse:

    Alguém conseguiu fazer funcionar? o rrd não está gerando os gráficos

  23. Vinicius disse:

    Galera alguém descobriu o motivo da pasta RRD vazia? Gostaria muito de ver isso funcionando.

  24. Andy disse:

    I created this project but I only got inbound traffic on graph. How we could get outbound traffic on graph. Could you please help me to fix it?

  25. Piero Iancol disse:

    bug ao criar 2 interfaces mesmo nome (porem de host diferente) sfpsfpplus1 (de 2 hosts) nao cria um deles.

  26. Felipe disse:

    No TCPDUMP recebo os dados do roteador mas não mostrou gráfico e não gerou nenhum arquivo na pasta rrd. :/

  27. Erlan Siqueira disse:

    Muito bom, mas tenho uma duvida, toda a infraestrutura do meu LAB são equipamentos Cisco ele conseguiria coletar os flows??

  28. Michel disse:

    Rapaz, com certeza vai ganhar um café!
    Já tem algo em mente pra ligar com mais de um roteador, sendo que são vendors diferentes? Mikrotik e Huawei no mesmo servidor… como ficaria o start?

  29. Bruno disse:

    Amigo muito bom seu tutorial parabéns!!!
    Consegui coletar em ipv4 certinho, porem no ipv6 eu tive dificuldade, pois não está chegando, pelo dump eu consigo ver, mas acho que deve ser algo no arquivo knowlinks.

    Sempre que adiciono ipv6 lá, no site fica com a imagem quebrada.

    o Router IP eu testei em IPv4 de teste também coloquei o IPv6, o snmpindex eu peguei das interfaces de ipv6, mas mesmo assim fica com as imagens quebrada dos gráficos em ipv6 e não carrega.

    Tem alguma ideia do que pode ser?

  30. Algum dos colegas poderia indicar o sampling utilizado para Huawei?

  31. Bruno Cabral disse:

    Pra alterar a lista de knownlinks, alem de reiniciar o script de start, o que precisa mais fazer? Fica dando erro de unknown DS name

  32. Lucas disse:

    Não exibe gráfico nenhum. Fiz todos os passos, esta trafegando dados no tcpdump, porém sem exibição

  33. Matheus disse:

    Muito bom tutorial.
    Um detalhe percebido: A minha amostragem de tráfego está menor que a realidade, de 1 a 2Gb a menos. Modifiquei o parâmetro de sampling para um valor maior, mas sem percepção de modificação. Alguém percebeu o mesmo?

  34. Vinicius Rodrigues disse:

    Boa tarde Rudimar! Fiz todos os passos como vocês ensinam, porém não está gerando arquivos na pasta rrd, pode me ajudar? Valeeeu!

  35. Vinicius disse:

    Rudimar não está gerando os arquivos rrd, o que pode ser? Segui todos os passos do tutorial.

  36. Alguém tendo problema na exibição dos gráficos?
    hoje parou de mostrar os gráficos aqui.

  37. Vinícius Dorneles disse:

    E mais uma dica, seria colocar na opção -P do start, o número zero, daí ele não inicia o sFlow e nem abre a porta para ele.

  38. Vinícius Dorneles disse:

    Rudimar! Muito bom esse tutorial, mas deixe-me acrescentar um problema que algumas pessoas podem esbarrar.

    O arquivo ip2asn.json não é 100% completo, e portanto pode faltar um ou outro ASN, principalmente os mais novos, como os ASes de 6 dígitos. Logo em um cenário que seu trânsito for um desses ASes que não esteja no ip2asn.json e ele tiver CDNs, o tráfego dessas CDNs (e nenhum outro tráfego proveniente deste(s) AS(es)) não vão aparecer nos gráficos.

    A solução mais rápida é colocar manualmente a relação IP ASN no .json, mas acredito que tu pode ensinar o pessoal uma forma de atualizar o .json a partir de alguma base whois automaticamente!

    Abraços.

    • Pasta tools:

      # apt install netcat
      # (echo begin; echo verbose; for i in `seq 1 65535`; do echo "AS$i"; done; echo end) | netcat whois.cymru.com 43 | ./generate-asinfo.py > asinfo.txt

      Demora!!!

      • Vinícius Dorneles disse:

        Complementando então para os AS de 32-Bits:

        (echo begin; echo verbose; for i in `seq 131072 143673`; do echo “AS$i”; done; echo end) | netcat whois.cymru.com 43 | ./generate-asinfo.py >> asinfo.txt
        (echo begin; echo verbose; for i in `seq 196608 213403`; do echo “AS$i”; done; echo end) | netcat whois.cymru.com 43 | ./generate-asinfo.py >> asinfo.txt
        (echo begin; echo verbose; for i in `seq 262144 272796`; do echo “AS$i”; done; echo end) | netcat whois.cymru.com 43 | ./generate-asinfo.py >> asinfo.txt
        (echo begin; echo verbose; for i in `seq 327680 329727`; do echo “AS$i”; done; echo end) | netcat whois.cymru.com 43 | ./generate-asinfo.py >> asinfo.txt
        (echo begin; echo verbose; for i in `seq 393216 401308`; do echo “AS$i”; done; echo end) | netcat whois.cymru.com 43 | ./generate-asinfo.py >> asinfo.txt

      • Fabio Jr. Gruchovski disse:

        Tem que fazer isso dentro de alguma pasta específica ou na raiz??

      • Hi Rudimar, Vinicius..

        I already run the generate asinfo.py

        But how do I convert/fetch the asinfo.txt to ip2asn.json files??

        I tried using command “python3 fetch_ip_asn.py asinfo.txt [nproc]” but the ip2asn.json files not created after

        Thank you!

  39. Não conseguir, pois esbarrei nesse erro:
    DBD::SQLite::db do failed: near “-“: syntax error at /data/asstats/bin/rrd-extractstats.pl line 64.

  40. Duh Batista disse:

    Alguém teve coleta de trafego via IPV6 ?

  41. Anderson disse:

    Top meu amigo… sempre sigo suas dicas… a unica coisa que aconteceu foi que ao abrir a pagina me deparei com The file sqlite3.php could not be found.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *