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:
1 # vim /etc/apt/sources.list
Ajuste:
1 deb http://deb.debian.org/debian/ bullseye main contrib non-free 2 deb-src http://deb.debian.org/debian/ bullseye main contrib non-free 3 4 deb http://security.debian.org/debian-security bullseye-security main contrib non-free 5 deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free 6 7 deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free 8 deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free
Instalaremos todos os pacotes necessários para o projeto
1 # 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
1 # perl -MCPAN -e 'install Net::sFlow'
Responta YES
1 Would you like to configure as much as possible automatically? [yes]
Último resultado será:
1 /usr/bin/make install -- OK
1 # perl -MCPAN -e 'install File::Find::Rule'
Último resultado será:
1 /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.
1 # mkdir /data/ 2 # cd /data/ 3 # git clone https://github.com/remontti/AS-Stats.git asstats 4 # 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”.
1 # 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.
1 # apt install snmp snmp-mibs-downloader 2 # cp /etc/snmp/snmp.conf /etc/snmp/snmp.conf.old 3 # 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:
1 # snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifDescr
1 IF-MIB::ifDescr.1 = STRING: Virtual-Template0 2 IF-MIB::ifDescr.2 = STRING: NULL0 3 IF-MIB::ifDescr.3 = STRING: InLoopBack0 4 IF-MIB::ifDescr.4 = STRING: Ethernet0/0/0 5 IF-MIB::ifDescr.6 = STRING: GigabitEthernet0/7/0 6 IF-MIB::ifDescr.7 = STRING: GigabitEthernet0/7/1 7 IF-MIB::ifDescr.8 = STRING: GigabitEthernet0/7/2 8 IF-MIB::ifDescr.9 = STRING: GigabitEthernet0/7/3 9 IF-MIB::ifDescr.10 = STRING: GigabitEthernet0/7/4 10 IF-MIB::ifDescr.11 = STRING: GigabitEthernet0/7/5 11 IF-MIB::ifDescr.12 = STRING: GigabitEthernet0/7/6 12 IF-MIB::ifDescr.13 = STRING: GigabitEthernet0/7/7 13 IF-MIB::ifDescr.14 = STRING: GigabitEthernet0/7/8 14 IF-MIB::ifDescr.15 = STRING: GigabitEthernet0/7/9 15 IF-MIB::ifDescr.32 = STRING: LoopBack1023 16 IF-MIB::ifDescr.33 = STRING: Eth-Trunk100 17 IF-MIB::ifDescr.34 = STRING: Eth-Trunk100.2022 18 IF-MIB::ifDescr.35 = STRING: Eth-Trunk100.309 19 IF-MIB::ifDescr.36 = STRING: Eth-Trunk100.700 20 IF-MIB::ifDescr.37 = STRING: Eth-Trunk100.701 21 IF-MIB::ifDescr.38 = STRING: Eth-Trunk100.928 22 IF-MIB::ifDescr.39 = STRING: Eth-Trunk100.929 23 IF-MIB::ifDescr.40 = STRING: LoopBack0 24 IF-MIB::ifDescr.41 = STRING: Eth-Trunk100.200 25 IF-MIB::ifDescr.42 = STRING: Eth-Trunk100.2371 26 IF-MIB::ifDescr.44 = STRING: Eth-Trunk100.3675 27 IF-MIB::ifDescr.45 = STRING: Eth-Trunk100.3672
1 # snmpwalk -v2c -c public 10.250.250.1 IF-MIB::ifIndex
1 IF-MIB::ifIndex.1 = INTEGER: 1 2 IF-MIB::ifIndex.2 = INTEGER: 2 3 IF-MIB::ifIndex.3 = INTEGER: 3 4 IF-MIB::ifIndex.4 = INTEGER: 4 5 IF-MIB::ifIndex.6 = INTEGER: 6 6 IF-MIB::ifIndex.7 = INTEGER: 7 7 IF-MIB::ifIndex.8 = INTEGER: 8 8 IF-MIB::ifIndex.9 = INTEGER: 9 9 IF-MIB::ifIndex.10 = INTEGER: 10 10 IF-MIB::ifIndex.11 = INTEGER: 11 11 IF-MIB::ifIndex.12 = INTEGER: 12 12 IF-MIB::ifIndex.13 = INTEGER: 13 13 IF-MIB::ifIndex.14 = INTEGER: 14 14 IF-MIB::ifIndex.15 = INTEGER: 15 15 IF-MIB::ifIndex.32 = INTEGER: 32 16 IF-MIB::ifIndex.33 = INTEGER: 33 17 IF-MIB::ifIndex.34 = INTEGER: 34 18 IF-MIB::ifIndex.35 = INTEGER: 35 19 IF-MIB::ifIndex.36 = INTEGER: 36 20 IF-MIB::ifIndex.37 = INTEGER: 37 21 IF-MIB::ifIndex.38 = INTEGER: 38 22 IF-MIB::ifIndex.39 = INTEGER: 39 23 IF-MIB::ifIndex.40 = INTEGER: 40 24 IF-MIB::ifIndex.41 = INTEGER: 41 25 IF-MIB::ifIndex.42 = INTEGER: 42 26 IF-MIB::ifIndex.44 = INTEGER: 44 27 IF-MIB::ifIndex.45 = INTEGER: 45
Exemplo de saída snmpwalk de um RouterOS/Mikrotik:
1 # snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifDescr
1 IF-MIB::ifDescr.1 = STRING: sfp-sfpplus1 2 IF-MIB::ifDescr.2 = STRING: sfp-sfpplus2 3 IF-MIB::ifDescr.3 = STRING: ether1 4 IF-MIB::ifDescr.4 = STRING: ether2 5 IF-MIB::ifDescr.5 = STRING: ether3 6 IF-MIB::ifDescr.6 = STRING: ether4 7 IF-MIB::ifDescr.7 = STRING: ether5 8 IF-MIB::ifDescr.8 = STRING: ether6 9 IF-MIB::ifDescr.9 = STRING: ether7 10 IF-MIB::ifDescr.10 = STRING: ether8 11 IF-MIB::ifDescr.11 = STRING: VLAN-IX-SP-IPv4.10 12 IF-MIB::ifDescr.12 = STRING: VLAN-IX-SP-IPv6.11 13 IF-MIB::ifDescr.13 = STRING: VLAN-IX-PR-IPv6.20 14 IF-MIB::ifDescr.14 = STRING: VLAN-IX-PR-IPv4.21 15 IF-MIB::ifDescr.15 = STRING: VLAN-IX-RS-IPv4.30 16 IF-MIB::ifDescr.16 = STRING: VLAN-IX-RS-IPv6.31
1 # snmpwalk -v2c -c public 10.20.30.2 IF-MIB::ifIndex
1 IF-MIB::ifIndex.1 = INTEGER: 1 2 IF-MIB::ifIndex.2 = INTEGER: 2 3 IF-MIB::ifIndex.3 = INTEGER: 3 4 IF-MIB::ifIndex.4 = INTEGER: 4 5 IF-MIB::ifIndex.5 = INTEGER: 5 6 IF-MIB::ifIndex.6 = INTEGER: 6 7 IF-MIB::ifIndex.7 = INTEGER: 7 8 IF-MIB::ifIndex.8 = INTEGER: 8 9 IF-MIB::ifIndex.9 = INTEGER: 9 10 IF-MIB::ifIndex.10 = INTEGER: 10 11 IF-MIB::ifIndex.11 = INTEGER: 11 12 IF-MIB::ifIndex.13 = INTEGER: 13 13 IF-MIB::ifIndex.14 = INTEGER: 14 14 IF-MIB::ifIndex.15 = INTEGER: 15 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:
1 # vim /data/asstats/conf/knownlinks
Exemplo:
1 # nota: tabulações devem ser usadas para separar campos (não espaços) 2 # máx. o comprimento da tag é de 12 caracteres; caracteres permitidos: a-z A-Z 0-9 _ 3 # sampling: taxa de amostragem pode ser separada para entrada / saída especificando taxas <in> / <out>. 4 # 5 # Router IP SNMP ifindex tag description color samplingrate 6 10.20.30.2 11 vlan10 IX.SP F44336 1 7 10.20.30.2 15 vlan30 IX.RS CDDC39 1 8 10.20.30.2 13 vlan20 IX.PR 4CAF50 1 9 10.20.30.2 5 Eth-Trunk100.309 LINK1 009688 128 10 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.
1 # vim /data/asstats/bin/start
Altere para seu AS
1 MEUAS=1234
Se seu router é um RouterOS/Mikrotik permaneça com a linha a baixo descomentada!
1 perl ${ASSTATD} -r ${DIRRRD} -k ${KNOWNLINKS} -a ${MEUAS} -n -m ${IP2ASN} &
Caso ser outro, comente a linha acima e descomenta a linha:
1 perl ${ASSTATD} -r ${DIRRRD} -p 9996 -P 6343 -k ${KNOWNLINKS} -a ${MEUAS} &
Exemplo: “AS 666 no Huawei”
1 #!/bin/bash 2 3 # Informe seu AS: 4 MEUAS=666 5 6 ASSTATD='/data/asstats/bin/asstatd.pl' 7 DIRRRD='/data/asstats/rrd' 8 KNOWNLINKS='/data/asstats/conf/knownlinks' 9 IP2ASN='/data/asstats/ip2asn/ip2asn.json' 10 11 # -p = Port netflow / -P port sflow 12 # 13 # netflow/sflow - (Huawei NE, Cisco, JunOS...) 14 perl ${ASSTATD} -r ${DIRRRD} -p 9996 -P 6343 -k ${KNOWNLINKS} -a ${MEUAS} & 15 16 # Flow v5 - (RoutesOS/Mikrotik) 17 # perl ${ASSTATD} -r ${DIRRRD} -k ${KNOWNLINKS} -a ${MEUAS} -n -m ${IP2ASN} &
Para iniciar o serviço execute:
1 # /data/asstats/bin/start
Verifique se as portas estão ouvindo
1 # netstat -putan |grep perl
1 udp 0 0 0.0.0.0:9996 0.0.0.0:* 1261/perl 2 udp 0 0 0.0.0.0:6343 0.0.0.0:* 1261/perl
Para carregar o start na inicialização faça:
1 # ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
1 # vim /etc/rc.local
Adicione
1 #!/bin/bash 2 /data/asstats/bin/start 3 exit 0
Altere as permissões para execução:
1 # chmod +x /etc/rc.local
Ajustes no cron:
1 # crontab -e
Adicione as linhas a baixo ao final do arquivo:
1 # 5min 2 */5 * * * * perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_day.txt 3 4 # 7 Dias 5 #0 0 * * 0 perl /data/asstats/bin/rrd-extractstats.pl /data/asstats/rrd /data/asstats/conf/knownlinks /data/asstats/asstats/asstats_week.txt 168 6 7 # 30 dias 8 #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
1 # 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.
1 # apt install tcpdump 2 # tcpdump -i enp0s3 -n udp port 9996 -T cnfp
Configuração para o router
RouterOS/Mikrotik (Flow v5)
1 /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)
1 # CONFIG GLOBAL 2 # 3 ip netstream export version 9 origin-as 4 ip netstream export index-switch 32 5 ip netstream as-mode 32 6 ip netstream timeout active 5 7 ip netstream timeout inactive 60 8 ip netstream export template timeout-rate 1 9 ip netstream export template option sampler 10 ip netstream sampler fix-packets 128 inbound 11 ip netstream sampler fix-packets 128 outbound 12 ip netstream export source >>IPV4_LOOPBACK_ORIGEM<< 13 ip netstream export host >>IP_SERVIDOR<< 9996 14 # 15 ipv6 netstream export version 9 origin-as 16 ipv6 netstream export index-switch 32 17 ipv6 netstream as-mode 32 18 ipv6 netstream timeout active 5 19 ipv6 netstream timeout inactive 60 20 ipv6 netstream export template timeout-rate 1 21 ipv6 netstream export template option sampler 22 ipv6 netstream sampler fix-packets 128 inbound 23 ipv6 netstream sampler fix-packets 128 outbound 24 ipv6 netstream export source >>IPV4_LOOPBACK_ORIGEM<< 25 ipv6 netstream export host >>IP_SERVIDOR<< 9996 26 27 # CONFIG NO SLOT 28 # NE40: slot 3 29 # NE8000-F1A: slot 0 30 # NE8000-M8: slot 9 ou 10 31 32 # EXECUTE O COMANDO NO ROOT (ADM), COMANDO NÃO FUNCIONA EM VS 33 slot 0 34 ip netstream sampler to slot self 35 ipv6 netstream sampler to slot self 36 37 # APLICAR APENAS NAS INTERFACES UPSTREAM (LINK IP, PTT, IX...) 38 ip netstream inbound 39 ip netstream outbound 40 ipv6 netstream inbound 41 ipv6 netstream outbound 42 43 # EM CASO DE INTERFACES DE CDN INTERNO, APLICAR: 44 ip netstream inbound 45 ipv6 netstream inbound 46 47 # EM CASO DE INTERFACE BILATERAL (ONDE TANTO RECEBE QUANTO ENVIA CONTEÚDO), APLICAR: 48 ip netstream inbound 49 ipv6 netstream inbound
Contribuição do Thiago Melo para Juniper:
1 # ---- ipv4 2 set chassis afeb slot 0 sampling-instance as-stats 3 set chassis afeb slot 0 inline-services flow-table-size ipv4-flow-table-size 10 4 set chassis afeb slot 0 inline-services flow-table-size ipv6-flow-table-size 10 5 6 set forwarding-options sampling instance as-stats input rate 2048 7 set forwarding-options sampling instance as-stats input max-packets-per-second 4096 8 set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW port 9996 9 set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW autonomous-system-type origin 10 set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW no-local-dump 11 set forwarding-options sampling instance as-stats family inet output flow-server IP_SERVIDOR_FLOW version-ipfix template ipv4 12 set forwarding-options sampling instance as-stats family inet output inline-jflow source-address IP_ORIGEM 13 14 set services flow-monitoring version-ipfix template ipv4 flow-active-timeout 60 15 set services flow-monitoring version-ipfix template ipv4 flow-inactive-timeout 30 16 set services flow-monitoring version-ipfix template ipv4 template-refresh-rate packets 48000 17 set services flow-monitoring version-ipfix template ipv4 template-refresh-rate seconds 30 18 set services flow-monitoring version-ipfix template ipv4 option-refresh-rate packets 48000 19 set services flow-monitoring version-ipfix template ipv4 option-refresh-rate seconds 30 20 set services flow-monitoring version-ipfix template ipv4 ipv4-template 21 22 set interfaces xe-2/0/0 unit 0 family inet sampling input 23 set interfaces xe-2/0/0 unit 0 family inet sampling output 24 25 # ---- ipv6 26 27 set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW port 9996 28 set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW autonomous-system-type origin 29 set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW no-local-dump 30 set forwarding-options sampling instance as-stats family inet6 output flow-server IP_SERVIDOR_FLOW version-ipfix template ipv6 31 set forwarding-options sampling instance as-stats family inet6 output inline-jflow source-address IP_ORIGEM 32 33 set services flow-monitoring version-ipfix template ipv6 flow-active-timeout 60 34 set services flow-monitoring version-ipfix template ipv6 flow-inactive-timeout 60 35 set services flow-monitoring version-ipfix template ipv6 template-refresh-rate packets 1000 36 set services flow-monitoring version-ipfix template ipv6 template-refresh-rate seconds 10 37 set services flow-monitoring version-ipfix template ipv6 option-refresh-rate packets 1000 38 set services flow-monitoring version-ipfix template ipv6 option-refresh-rate seconds 10 39 set services flow-monitoring version-ipfix template ipv6 ipv6-template 40 41 set interfaces xe-2/0/0 unit 0 family inet6 sampling input 42 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:
1 # apt install htop iotop 2 # htop 3 # iotop
Agora precisamos fazer o acesso web para visualizar as informações.
Ajustes de segurança para o apache:
1 # sed -i 's/ServerTokens OS/ServerTokens Prod/' /etc/apache2/conf-available/security.conf 2 # 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!
1 # vim /etc/apache2/sites-available/asstats.conf
Ajuste para sua realidade, fique ligado que em Require ip só permite que estes tenham acesso:
1 <virtualhost *:80> 2 ServerName asstats.remontti.com.br 3 ServerAdmin noc@remontti.com.br 4 5 DocumentRoot /data/asstats/www 6 7 ErrorDocument 403 http://www.remontti.com.br 8 9 <Directory /data/asstats/www/> 10 Options FollowSymLinks 11 AllowOverride All 12 Require all denied 13 <RequireAll> 14 <RequireAny> 15 Require ip 192.168.0.0/24 2804:1234:bebe::/48 16 </RequireAny> 17 </RequireAll> 18 </Directory> 19 20 ErrorLog ${APACHE_LOG_DIR}/error_asstats.log 21 CustomLog ${APACHE_LOG_DIR}/access_asstats.log combined 22 23 </VirtualHost>
1 # a2ensite asstats.conf 2 # systemctl restart apache2
Ajuste seu ASN:
1 # vim /data/asstats/www/config.inc
Localize $my_asn = "1234" e altere pelo seu.
1 $my_asn = "1234";
Execute para que o asstats_day.txt seja criado e ao acessar o web-ui não fique em branco.
1 # 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/
1 # 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….