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
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
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.
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?
Exatamente o mesmo que ocorre comigo, no meu caso a nossa caixa é um huawei ne8000.
Mikrotik does not support collection flow via IPv6
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?
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.
O meu não aparece os gráficos nem ferrando..kkkk Já refiz 5x e nada!
Bom dia Flavio, tudo bem? Fiz e refiz 5x o tutorial, mas a pasta rrd fica sempre vazia e não é mostrado nenhum gráfico na GUI. Vocẽ passou por isso tbm? Obrigado! Estou usando um huawie Mk8
Só fica zerado IPv6: ~ 0 bytes in / 0 bytes. Os gráficos IPv4 e IPv6 esta OK.
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 /
Boa tarde,
tem uma aba Ver Status IX, não aparece os IX, como proceder ?
Obrigado pela ajuda
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
o valor de “samplingrate” deve ser o mesmo de “sampler fix-packets“
Obrigado pela ajuda, o meu é juniper, seria algum destes dois valores:
set forwarding-options sampling instance as-stats input rate 2048
set forwarding-options sampling instance as-stats input max-packets-per-second 4096
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.
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.
Ola Rafael Lopes Mira Vc pode me ajudar. Estou com um problema na ultimo comando
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.
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.
O meu ta mostrando em MB, como faço para alterar para mostra em M,
Coloque sua taxa de amostragem no knowlink proxima que vc usa no seu equipamento e vai ajustando.
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?
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.
Corrigindo!!
O comando executado é: perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_day.txt
Bom dia,
Você conseguiu realizar a configuração de huawei? também estou com essa dificuldade
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
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
vlw Simak
DBD::SQLite::db do failed: no such table: stats at /data/asstats/bin/rrd-extractstats.pl line 78.
também estou com esse mesmo erro.
bom dia.
eu conseguiria deixar ele ativo e capturar simultaneamente dados provenientes de uma mikrotik e de um juniper ?
obrigado.
/data/asstats/rrd/ – Ajuda nóis não grava nada, as conf tudo certo chegando flow, snmp index ok, site ok.
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
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?
Tenho exatamente o mesmo problema.
Estou investigando aqui.
O problema é com os parâmetros dentro do arquivo knownlinks.
Use nomes genericos e curtos para a tag e description das interfaces. Resolvido aqui.
Alguém conseguiu fazer funcionar? o rrd não está gerando os gráficos
Galera alguém descobriu o motivo da pasta RRD vazia? Gostaria muito de ver isso funcionando.
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?
bug ao criar 2 interfaces mesmo nome (porem de host diferente) sfpsfpplus1 (de 2 hosts) nao cria um deles.
No TCPDUMP recebo os dados do roteador mas não mostrou gráfico e não gerou nenhum arquivo na pasta rrd. :/
Muito bom, mas tenho uma duvida, toda a infraestrutura do meu LAB são equipamentos Cisco ele conseguiria coletar os flows??
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?
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?
Algum dos colegas poderia indicar o sampling utilizado para Huawei?
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
Não exibe gráfico nenhum. Fiz todos os passos, esta trafegando dados no tcpdump, porém sem exibição
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?
Eu estava monitorando um mikrotik e estava tudo ok. Então quando migrei pra Huawei NE8000 refiz tudo do zero e ficou com esse mesmo problema seu.
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!
os meus tambem nao se tiver uma soluçao por gentileza compartilhe.
Rudimar não está gerando os arquivos rrd, o que pode ser? Segui todos os passos do tutorial.
O meu também não apareceu os gráficos e a pasta rrd vazia
Alguém tendo problema na exibição dos gráficos?
hoje parou de mostrar os gráficos aqui.
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.
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:
Demora!!!
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
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!
Não conseguir, pois esbarrei nesse erro:
DBD::SQLite::db do failed: near “-“: syntax error at /data/asstats/bin/rrd-extractstats.pl line 64.
Verifica para não ter espaço e nem carácter no arquivo knownlinks. (Dia edite sem mexer nos espaços)
Obrigado, eu tinha colocado um hífen na identificação da vlan, removi e deu Certo.
Alguém teve coleta de trafego via IPV6 ?
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.
Reiniciei o APACHE e funcionou… Muuuuuuito Obrigado por todos os seus tutoriais….