🗂️ Arquivos de Configuração

📄 config.json

Armazena as configurações do sistema, contribuindo para a personalização das análises realizadas.

Já falamos um pouco dele anteriormente

Restart

Sempre que o arquivo config.json for modificado, é necessário reiniciar o serviço para que as alterações tenham efeito.

Pelo painel de admin ou terminal com comando systemctl restart rr-flow-api.service

Por padrão o arquivo vem com as seguintes configurações config.json.

{
    "api_allow_subnet": [
        "127.0.0.1/32",
        "::1",
        "0.0.0.0/0",
        "::/0"
    ],
    "api_bind": "::",
    "api_port": 5000,
    "cache_lifetime": 1,
    "collection_interval": 1,
    "core_workers": 4,
    "data_path": "/var/rr-flows/",
    "debug": false,
    "maximum_disk_gb": 70,
    "password_admin_panel": "remontti",
    "grafana": {
        "datasources": "xxxxxxxxxxx",
        "service_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "url": "http://localhost:3000"
    },    
    "source_path": [
        {
            "buffer": 67108864,
            "compress": "lz4",
            "maximum_days": 365,
            "name": "Borda",
            "port": 3055,
            "proxyflow": { 
                "port": 4055 
            },
            "sampling": 1024,
            "snmp": {
                "community": "public",
                "ip": "10.10.10.2",
                "port": 161,
                "version": 2
            },
            "type": "netflow",
            "vendor": "huawei"
        }
    ]
}

Aqui está uma descrição dos itens de configuração:

Opções da API

api_allow_subnet

Uma lista de prefixos de IP que têm permissão para consumir a API. (Mantenha os IPs de localhost)

    "api_allow_subnet": [
        "127.0.0.1/32",
        "::1",
        "0.0.0.0/0"
    ],

api_allow_subnet

Altamente recomendado que você restrinja apenas para seus ips de gerencia, pois as saidas JSONs não passam por autenticação. Não me responsabilizo por vazamento de dados.

api_bind

Endereço IP ao qual a API será vinculada. Padrão 0.0.0.0 para todos.

    "api_bind": "0.0.0.0",
api_port

Porta na qual a API estará disponível.

    "api_port": 5000,
cache_lifetime

Tempo de vida do cache em dias. /var/cache/rr-flow/

    "cache_lifetime": 3,
collection_interval

Intervalo de coleta do flow em minutos. Não recomendo valores como 2,3 e 4, de preferencia para intervalos de 1,5,10… pois a complexidade de calculos pode acabar entregando ou não entregando alguns dados. Padrão 5min até a versão 1.3.0, e Padrão 1min depois da versão 1.4.0

    "collection_interval": 1,
core_workers

A quantidade de processos alocado(s) para cada CPU (Thread). Padrão em 4.

    "core_workers": 4,

Aviso

É possível considerar um aumento desse número, principalmente se houver capacidade de hardware adicional disponível. Contudo, é importante exercer cautela ao aumentar excessivamente, pois isso pode resultar em efeitos indesejados, como a sobrecarga do servidor ou a ocorrência de travamentos.

data_path

Caminho onde os dados de flows coletados serão armazenados.

    "data_path": "/var/rr-flows/",

data_path/EXPORTADOR/ANO/MES/DIA/nfcapd.AnoMesDiaHoraMinuto

tree -sh /var/rr-flows/

├── Borda
│   ├── 2023
│   │   └── 07
│   │       └── 11
│   │           ├── nfcapd.202307111600
│   │           ├── nfcapd.202307111605
│   │           ├── nfcapd.202307111610
│   │           ├── nfcapd.202307111615
│   │           └── nfcapd.202307111620
│   └── nfcapd.current.29124
└── Cgnat
    ├── 2023
    │   └── 07
    │       └── 11
    │           ├── nfcapd.202307111600
    │           ├── nfcapd.202307111605
    │           ├── nfcapd.202307111610
    │           ├── nfcapd.202307111615
    │           └── nfcapd.202307111620
    └── nfcapd.current.29128
debug

Habilita ou desabilita o modo de depuração. >- false - Desativado >- true - Ativado

    "debug": false,

Aviso

Ao ativar o arquivo de log /var/log/rr-flow/rr-flow.log irá se tornar gigante, não recomendo ativar, apensas se estiver enfrentando alguma dificuldade e precisar tentar identificar um possível problema.

grafana

Configurações para integração com o Grafana.

  • datasources UID da fonte de dados do Grafana.
  • service_token Token de serviço para autenticação no Grafana.
  • url URL do Grafana. (Padrão http://localhost:3000)
    "grafana": [
        {
            "datasources": "xxxxxxxxxxxxxx",
            "service_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "url": "http://localhost:3000"
        }
    ],
maximum_disk_gb

Espaço máximo em que será armazenado no diretório data_path em gigabytes (padrão: /var/rr-flows/).

    "maximum_disk_gb": 70,

Atenção: maximum_disk_gb

  • Não defina mais que 90% do seu disco. Reserve no mínimo 5% do espaço total para o sistema operacional funcionar corretamente.
  • O aplicativo realiza uma rotina de limpeza uma vez por dia, removendo os arquivos mais antigos se o limite de maximum_disk_gb for ultrapassado. Entretanto, isso não impede que o disco lote se a coleta de dados for muito rápida antes da próxima rotina de limpeza.
  • Estimativa necessária: O usuário precisa calcular a taxa de coleta de dados diária e ajustar o valor de maximum_disk_gb para garantir que o disco não atinja o limite antes da limpeza. Por exemplo, se sua coleta gera 10 GB por dia, deixe uma margem adicional equivalente a essa taxa

Exemplo:
- Disco total: 80 GB
- Espaço para SO: 5% (4 GB)
- Margem para coleta diária: 10 GB (estimado)
- maximum_disk_gb: 66 GB (80 GB - 4 GB - 10 GB)

password_admin_panel

Senha para acessar o painel de administração.

    "password_admin_panel": "remontti",

Adicionar nova fonte de fluxo

Para adicionar uma ou mais fontes iremos adionar ao source_path

source_path

Lista de fontes de dados de fluxos (routers que enviarão os fluxos). É possível adicionar várias fontes de dados para diferentes routers, dependendo do nível de sua licença. Isso permite monitorar e coletar fluxos de múltiplas origens.

  • buffer: Define o buffer de entrada do soquete de rede para bufflen bytes.
  • compress: Algoritmo de compressão. (Padrão lz4)

    Método Descrição Compressão (%) Leitura Escrita
    bz2 Alta compressão, mas lento. 65% Lenta Lenta
    zstd Boa compressão e rápida. 55% Rápida Rápida
    lz4 Muito rápido, compressão média. 45% Muito rápida Muito rápida
    lzo Rápido, compressão leve. 40% Muito rápida Rápida
  • maximum_days: Número máximo de dias que os dados serão mantidos para a fonte.
    Caso a quantidade de dados armazenados ultrapasse o limite definido em maximum_disk_gb, os arquivos serão apagados com base no espaço, e não na idade — ou seja, mesmo arquivos mais recentes poderão ser removidos para manter o uso de disco abaixo do permitido.

  • name: Nome da fonte de dados (SEM ESPAÇOS ⚠️).
  • port: Porta que receberá os dados. (Se for usar proxyflow use uma porta aleatória)
  • sampling: Aplica a taxa de amostragem, a menos que a taxa de amostragem seja anunciada pelo dispositivo exportador, neste caso defina o valor como auto.
  • snmp: Configurações SNMP.
    • community: Comunidade SNMP. (Padrão public)
    • ip: Endereço IP SNMP.
    • port: Porta SNMP. (Padrão 161)
    • version: Versão SNMP. (Padrão v2)
  • type: Tipo de fonte de dados.

    • netflow (v5,v7,v9, IPFIX)
    • sflow
  • proxyflow.port: Ativa o Proxy Coletor para fazer o processamento dos ASN, port deve ser informado a porta que o o roteador esta enviando o fluxo de dados. Caso não deseje utilizar, apena não adicione proxyflow dentro de source_path.

"proxyflow": {
        "port": 3058
    },
  • vendor: Fornecedor da fonte de dados.
    • huawei
    • cisco
    • juniper
    • nokia
    • routeros
    • linux

vendor

Em “vendor”: utilize apenas os listados acima, caso seu vendor não estiver presente utilize linux.
Utilize apenas letras minúsculas exemplo huawei, e não Huawei ou HUAWEI.

OBS: Licença

A quantidade de fonte de fluxo diponivel é relativo a sua licença.

Porta

Ao configurar novos fluxos, lembre-se de que a porta de coleta não deve ser a mesma para cada fluxo. Certifique-se de usar portas diferentes para evitar conflitos e garantir a coleta de dados.

Segue alguns exemplos exemplo:

{
//...
    "source_path": [
        {
            "buffer": 67108864,
            "compress": "lz4",
            "name": "Borda",
            "port": 3055,
            "sampling": 1024,
            "snmp": [
                {
                    "community": "public",
                    "ip": "10.10.10.2",
                    "port": 161,
                    "version": 2
                }
            ],
            "type": "netflow",
            "vendor": "huawei"
        },
        {
            "buffer": 67108864,
            "compress": "lz4",
            "name": "Cgnat",
            "port": 3066,
            "sampling": 5,
            "snmp": [
                {
                    "community": "public",
                    "ip": "10.10.10.3",
                    "port": 161,
                    "version": 2
                }
            ],
            "type": "netflow",
            "vendor": "routeros"
        },
        {
            "buffer": 67108864,
            "compress": "lz4",
            "name": "Switch",
            "port": 3077,
            "sampling": 1024,
            "snmp": [
                {
                    "community": "public",
                    "ip": "10.10.10.4",
                    "port": 161,
                    "version": 2
                }
            ],
            "type": "sflow",
            "vendor": "huawei"
        },
        {
            "buffer": 67108864,
            "compress": "lz4",
            "name": "Borda_Mikrotik",
            "port": 4088,
            "proxyflow": [
                {
                    "port": 5088
                }
            ],            
            "sampling": 1,
            "snmp": [
                {
                    "community": "public",
                    "ip": "10.10.10.4",
                    "port": 161,
                    "version": 2
                }
            ],
            "type": "netflow",
            "vendor": "huawei"
        }
    ]
//...
}

SNMP v3

SNMP v3 ainda não tem suporte, mas se desejar deixar configurado segue exemplo.

//...
    "snmp": [
        {
            "auth_password": "senha",
            "auth_protocol": "sha", // md5 | sha
            "ip": "10.10.10.7",
            "port": 161,
            "priv_password": "senha",
            "priv_protocol": "aes", // des | aes
            "username": "usuario",
            "version": 3
        }
    ],
//...

📄 license.json

Contém informações sobre a licença do software.

Estrutura
{
    "key": "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE"
}

license.json

É necessário reiniciar o serviço para que a licença tenham efeito.

Se estiver alterando a linceça pelo terminal pode reiniciar o serviço rr-flow-api com o comando:
systemctl restart rr-flow-api.service

📄 custom-filters.json

Arquivo contendo um conjunto de filtros personalizados para otimizar a visualização dos dados nas dashboards, você pode criar seus filtros.

Composto por filter onde deve ser informado os filtros e name você define um nome para seu filtro.

Estrutura
// Exemplo onde tudo que destino ou origem for a porta 22 
// e conter as flags FIN ou Reset
//...
    {
        "filter": "port 22 and (flags F or flags R)",
        "name": "Força bruta SSH"
    },
//...

custom-filters.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

Segue uma lista básica para você criar seus próprios filtros e utilizar em Dashboars que possuem campo para inserir filtros manuais.

Filtros

Filtros

src » Origem.
dst » Destino.

proto » Protocolo de comunicação.

port » Número da porta.
src port » Porta de origem.
dst port » Porta de destino.

net » Prefixo de rede.
src net » Prefixo de rede de origem.
dst net » Prefixo rede de destino.

ip » Endereço IP.
src ip » Endereço IP de origem.
dst ip » Endereço IP de destino.

as » Sistema Autônomo.
src as » AS de origem.
dst as » AS de destino.
prev as » AS anterior.
next as » Próximo AS.

bgpnext ip » Próximo IP BGP.

next ip » Próximo IP.

if número » Interface. (número SNMP)
in if número » Interface de entrada.
out if número » Interface de saída.

xip » Endereço IP expandindo.
src xip » Endereço IP de origem expandindo.
dst xip » Endereço IP de destino expandindo.

Operadores

Operadores

AND » Operador lógico AND = E.
NOT » Operador lógico NOT = NÃO.
OR » Operador lógico OR = OU.

  • Operadora OR você deve ter cuidado ao utilizar mais de um filtro, exemplo quero combinar dois endereços IPs com dois tipos de protocolos, ficaria:

    (ip 1.1.1.1 OR ip 8.8.8.8) AND (proto TCP OR proto UDP) AND (port 53 OR port 443)
    
  • Range de portas:

    dst port >= 0 and dst port <= 100
    

Flags

Flags TCP

A » ACK (Acknowledgment) - Confirma o recebimento de dados.
S » SYN (Synchronize) - Inicia uma conexão.
F » FIN (Finish) - Indica o término do envio de dados.
R » RST (Reset) - Redefine a conexão.
P » PSH (Push) - Força a entrega imediata dos dados.
U » URG (Urgent) - Indica dados urgentes.
X » Todas as flags ativadas - Indica um pacote incomum.

A ordem das flags dentro de tcpflags não é relevante. Flags não mencionadas são tratadas como não especificadas. Para obter os fluxos com apenas a flag SYN ativada, use a sintaxe flags S and not flags AFRPU

Exemplo

[
    {
        "filter": "(src ip 8.8.8.8 or src ip 1.1.1.1) AND src port 53 AND dst net 200.200.200.0/22",
        "name": "Tráfego de servidores DNS famosos para meu prefixo"
    }
//...
]

📄 fav-asn-prefix-graphs.json

Utilize este arquivo para declarar os ASN que você deseja explorar através de gráficos e análises estatísticas. Além disso, é possível especificar prefixos associados para maior granularidade.

Filtro de ASNs e Prefixos de Rede

Neste arquivo é possível criar um conjunto de elementos informando o Sistemas Autônomos (ASNs) e o prefixos de rede.

Estrutura
[
    {
        "description": "Descrição",
        "filter": {
            "as": [
                "ASN A",
                "ASN B",
                "ASN C",
                //..
            ],
            "prefix": [
                "Prefixos A",
                "Prefixos B",
                "Prefixos C"
                //...
            ]
        }
    }
]
Exemplo ASN + Prefixo

Neste caso você pode combinar os ASN com os prefixos.

//...
    {
        "description": "A + B",
        "filter": {
            "as": [
                "123",
                "321"
            ],
            "prefix": [
                "123.123.123./22",
                "321.321.321.0/22",
                "2804:123::/32",
                "2804:321::/32"
            ]
        }
    },
//...
Exemplo apenas ASN

Você pode adicionar quantos ASN quiser.

    {
        "description": "Youtube",
        "filter": {
            "as": [
                "36040"
            ]
        }
    },
    {
        "description": "Google All",
        "filter": {
            "as": [
                "15169"
                "36040",
                "396982"
            ]
        }
    },    
//...    
Exemplo apenas Prefixo

Se em description conter a palavra CDN na dashboard “Análise Geral - ASN + Prefixos (Favoritos)” ele irá aparecer separadamente como o “top CDNs”.

//...
    {
        "description": "CDN da minha Operadora",
        "filter": {
            "prefix": [
                "192.192.0.0/26",                
                "2001:db8:face::/64"
            ]
        }
    },
//...

fav-asn-prefix-graphs.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

📄 fav-services-graphs.json

Lista com serviços conhecidos para simplificar no uso das Dashboards. É possível criar combinações com mais de uma porta e mais de um tipo de protocolo.

Estrutura

[
    {
        "NOME": {
            "port": [
                "número da porta"
            ],
            "proto": [
                "protocolo"                
            ]
        },
    }
]

Exemplo

[
    {
        "DNS": {
            "port": [
                "53"
            ],
            "proto": [
                "udp",
                "tcp"
            ]
        },
        "FTP": {
            "port": [
                "21",
                "20"
            ],
            "proto": [
                "tcp"
            ]
        },
        "MySQL": {
            "port": [
                "3306"
            ],
            "proto": [
                "tcp"
            ]
        },
        "NTP": {
            "port": [
                "123"
            ],
            "proto": [
                "tcp",
                "udp"
            ]
        },
        "POP E-Mail": {
            "port": [
                "110",
                "143",
                "995"
            ],
            "proto": [
                "tcp"
            ]
        },
        "Ping": {
            "port": [],
            "proto": [
                "icmp"
            ]
        },
        "Port 0": {
            "port": [
                "0"
            ],
            "proto": [
                "udp"
            ]
        },
        "RDP": {
            "port": [
                "3389"
            ],
            "proto": [
                "tcp",
                "udp"
            ]
        },
        "SMTP E-Mail": {
            "port": [
                "25",
                "465",
                "587"
            ],
            "proto": [
                "tcp"
            ]
        },
        "SSH": {
            "port": [
                "22"
            ],
            "proto": [
                "tcp",
                "udp"
            ]
        },
        "SpeedTest": {
            "port": [
                "8080"
            ],
            "proto": [
                "tcp"
            ]
        },
        "Telnet": {
            "port": [
                "23"
            ],
            "proto": [
                "tcp",
                "udp"
            ]
        },
        "Tunel GRE": {
            "port": [],
            "proto": [
                "gre"
            ]
        },
        "Web HTTP/HTTPS": {
            "port": [
                "80",
                "443"
            ],
            "proto": [
                "tcp",
                "udp"
            ]
        }
    }
]

fav-services-graphs.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

📄 ignore-asn.json

Este arquivo permite a exclusão estratégica de determinados ASN (Sistemas Autônomos) da análise, útil para focar em informações relevantes.

Estrutura

[
    {
        "asn": "Número do AS",
        "description": "Descrição"
    }
]

Exemplo

[
    {
        "asn": 65530,
        "description": "Ignore iBGPs"
    },
    {
        "asn": 123,
        "description": "Ignore meu AS"
    },
    {
        "asn": 321,
        "description": "Ignore meu Cliente AS"
    },
    {
        "asn": 0,
        "description": "Ignore o BUG"
    }
]

ignore-asn.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

📄 my-prefix.json

Registre aqui seus próprios prefixos de rede. Ao incluir prefixos menores pode agilizar a visualização de gráficos mais detalhado.

Estrutura

{
    "asn_prefix": {
        "IPv4": [
            "Prefixos IPv4"
        ],
        "IPv6": [
            "Prefixos IPv6"
        ]
    }
}

Exemplo

{
    "asn_prefix": {
        "IPv4": [
            "192.168.0.0/22",
            "192.168.0.0/23",
            "192.168.2.0/23",
            "192.168.0.0/24",
            "192.168.1.0/24",
            "192.168.2.0/24",
            "192.168.3.0/24"
        ],
        "IPv6": [
            "2001:db8::/32",
            "2001:db8::/33",
            "2001:0db8:8000::/33",
            "2001:db8::/34",
            "2001:db8:4000::/34",
            "2001:db8:8000::/34",
            "2001:db8:c000::/34"            
        ]
    }
}

my-prefix.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

📄 my-prefix-int.json

Registre aqui seus próprios prefixos ou de clientes bem como ASN se necessário. Exemplo servidores, clientes dedicados, clientes ASN entre outros.

Estrutura

[
    {
        "description": "Meus ASN e Prefixos",
        "filter": {
            "as": [
                "ASN"
            ],
            "prefix": [
                "Prefixo"
            ]
        }
    }
]

Exemplo

[
    {
        "description": "Meus ASNs e Prefixos",
        "filter": {
            "as": [
                "64512",
                "64514"
            ],
            "prefix": [
                "192.168.0.0/21",
                "192.168.128.0/22",
                "2001:db8::/32",
                "2001:db9::/32"
            ]
        }
    },
    {
        "description": "Todos meus cliente AS",
        "filter": {
            "as": [
                "65530",
                "65531",
                "65532"
            ]
        }
    },
    {
        "description": "Cliente ASN X",
        "filter": {
            "as": [
                "65530"
            ],
            "prefix": [
                "192.168.144.0/21"
            ]
        }
    },
    {
        "description": "Todos os IPs",
        "filter": {
            "prefix": [
                "0.0.0.0/0",
                "::/0"
            ]
        }
    },
    {
        "description": "Servidores",
        "filter": {
            "prefix": [
                "192.168.168.0/26",
                "2001:db8:bebe:cafe::/64"
            ]
        }
    },
    {
        "description": "Cliente Dedicado",
        "filter": {
            "prefix": [
                "192.168.168.225/32",
                "2001:db8:bebe:100::/56"
            ]
        }
    }
    {
        "description": "Cliente Dedicado",
        "filter": {
            "prefix": [
                "192.168.169.128/28",
                "2001:db8:f0da::/48"
            ]
        }
    }    
]

my-prefix.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

📄 notify.json

O arquivo notify.json contém as configurações necessárias para o envio de notificações por e-mail e Telegram dentro da aplicação. Este arquivo é crucial para que a aplicação possa enviar alertas e relatórios automaticamente com base nos eventos monitorados.

A estrutura do notify.json é composta por duas seções principais: email e telegram. Cada uma dessas seções tem suas próprias configurações específicas, que são descritas abaixo.

Seção email

Esta seção define as configurações para envio de e-mails usando um servidor SMTP. O sistema pode enviar notificações para destinatários configurados quando certos eventos ou condições forem atendidos.

  • default_destination: O endereço de e-mail padrão para onde as notificações serão enviadas.
  • sender_name: O nome que aparecerá como o remetente do e-mail. Pode ser personalizado.
  • smtp_host: O endereço do servidor SMTP utilizado para enviar os e-mails.
  • smtp_password: A senha da conta de e-mail usada para autenticar no servidor SMTP.
  • smtp_port: A porta usada para a conexão SMTP. Comumente 587 (STARTTLS) ou 465 (SSL/TLS).
  • smtp_username: O nome de usuário (geralmente o endereço de e-mail) utilizado para autenticação no servidor SMTP.

Teste E-mail

Você pode testar sua conexão o com o servidor e-mail utilizando, e fazer um envio de teste utilizando a API:
{URL}:{PORT}/api/test/email/connection
{URL}:{PORT}/api/test/email/Sua-Mensagem/example@example.com

Seção telegram

Esta seção define as configurações para envio de mensagens via Telegram usando a API do bot do Telegram. A aplicação pode enviar mensagens para um chat ou grupo configurado.

  • allow_responses: Listar de grupos ou usuario permitidos a executar comandos com o bot.
  • bot_token: O token do bot do Telegram, necessário para autenticação e envio de mensagens. Esse token pode ser obtido diretamente da API do Telegram ao criar um bot.
  • default_chat: O ID do chat ou grupo onde as mensagens serão enviadas por padrão.

Telegram Tópicos

Para enviar mensagens para um tópico específico dentro de um grupo, é necessário saber o ID do tópico. O formato para especificar um tópico é o ID do grupo seguido de uma vírgula e o ID do tópico. Exemplo: -1001234567890,50, onde -1001234567890 é o ID do grupo, e 50 é o ID do tópico dentro desse grupo.

Para mais ajuda acesse o menu Bot Telegram.

Comandos bot

Acesse o menu Bot Telegram para mais informações.

Exemplo

{
    "email": {
        "default_destination": "example@example.com",
        "sender_name": "RR-Flow Notifications",
        "smtp_host": "smtp.example.com",
        "smtp_password": "example_password",
        "smtp_port": "587",
        "smtp_username": "notify@example.com"
    },
    "telegram": {
        "allow_responses": [
            "-1000000000000",
            "200000000"
        ],
        "bot_token": "123456789:ABCdefGHIjklMNO456PQRstUVWxyz",
        "default_chat": "-1001234567890"
    }
}

📄 data_traffic_analysis.json

O arquivo data_traffic_analysis.json contém as configurações para monitoramento de tráfego de rede, cujos dados são armazenados no banco de dados localizado em $data_path/traffic_data.db. Esse arquivo pode ser utilizado tanto para registrar e armazenar dados de tráfego coletados, quanto para configurar alertas e ações a serem executadas com base em condições predefinidas. Nele, é possível definir descrições de tráfego, filtros, fontes de coleta, além de especificar como os alertas serão enviados (por e-mail, Telegram ou scripts).

Exemplo de Estrutura

[
    {
        "alerts": {
            "email": {
                "activate": true,
                "graph_color": "#9C27B0",
                "graph_send": true,
                "graph_time": 90,
                "message": "<b>[$status]:</b> Trafego de ICMP elevado <br>👉 aggr_flows: $aggr_flows<br>👉 bpp: $bpp<br>👉 bps:$bps<br>👉 bytes: $bytes<br>👉 packets: $packets <br><br>👉 description: $description<br>👉 filter: $filter<br>👉 sources: $sources",
                "subject": "[$status] Trafego de ICMP elevado",
                "recipients": [
                    "empresa1@empresa1.com",
                    "empresa2@empresa2.com"
                ]
            },
            "script": {
                "activate": true,
                "file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
            },
            "telegram": {
                "activate": true,
                "graph_color": "#D81B60",
                "graph_send": true,
                "graph_time": 90,
                "message": "[$status] <b>Trafego de ICMP elevado</b> \n👉 aggr_flows: $aggr_flows\n👉 bpp: $bpp\n👉 bps:$bps\n👉 bytes: $bytes\n👉 packets: $packets \n\n👉 description: $description\n👉 filter: $filter\n👉 sources: $sources \n É teste só",
                "recipients": [
                    "200000000",
                    "200000001",
                    "200000002"
                ]
            }
        },
        "conditions": {
            "logic": "AND",
            "rules": [
                {
                    "operator": ">",
                    "value": 10485760,
                    "variable": "bps"
                },
                {
                    "operator": ">",
                    "value": 300000,
                    "variable": "packets"
                }
            ]
        },
        "description": "Tráfego de ICMP",
        "filter": "proto icmp",
        "retention": 30,
        "sources": [
            "BORDA-RS",
            "BORDA-SC",
            "BORDA-PR"
        ]
    },
    {
        "alerts": {
            "email": {
                "activate": true,
                "graph_color": "#9C27B0",
                "graph_send": true,
                "graph_time": 90,
                "message": "<b>[$status]:</b> Possível ataque (BORDA-RS) <br>👉 aggr_flows: $aggr_flows<br>👉 bpp: $bpp<br>👉 bps:$bps<br>👉 bytes: $bytes<br>👉 packets: $packets <br><br>👉 description: $description<br>👉 filter: $filter<br>👉 sources: $sources",
                "subject": "[$status] Possível ataque (BORDA-RS)"
            },
            "script": {
                "activate": true,
                "file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
            },
            "telegram": {
                "activate": true,
                "graph_color": "#D81B60",
                "graph_send": true,
                "graph_time": 90,
                "message": "[$status] <b>Possível ataque (BORDA-RS)</b> \n👉 aggr_flows: $aggr_flows\n👉 bpp: $bpp\n👉 bps:$bps\n👉 bytes: $bytes\n👉 packets: $packets \n\n👉 description: $description\n👉 filter: $filter\n👉 sources: $sources \n É teste só"
            }
        },
        "conditions": {
            "logic": "AND",
            "rules": [
                {
                    "operator": ">",
                    "value": 1073741824,
                    "variable": "bps"
                }
            ]
        },
        "description": "Possível ataque (BORDA-RS)",
        "filter": "port 53 and (bpp > 512 and bpp <9000)",
        "retention": 90,
        "sources": [
            "BORDA-RS"
        ]
    },
    {
        "alerts": {
            "email": {
                "activate": true,
                "message": "<b>[$status]:</b> Possível ataque (BORDA-SC) <br>👉 aggr_flows: $aggr_flows<br>👉 bpp: $bpp<br>👉 bps:$bps<br>👉 bytes: $bytes<br>👉 packets: $packets <br><br>👉 description: $description<br>👉 filter: $filter<br>👉 sources: $sources",
                "subject": "[$status] Possível ataque (BORDA-SC)"
            },
            "script": {
                "activate": true,
                "file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""
            },
            "telegram": {
                "activate": true,
                "message": "[$status] <b>Possível ataque (BORDA-SC)</b> \n👉 aggr_flows: $aggr_flows\n👉 bpp: $bpp\n👉 bps:$bps\n👉 bytes: $bytes\n👉 packets: $packets \n\n👉 description: $description\n👉 filter: $filter\n👉 sources: $sources \n É teste só"
            }
        },
        "conditions": {
            "logic": "AND",
            "rules": [
                {
                    "operator": ">",
                    "value": 1073741824,
                    "variable": "bps"
                }
            ]
        },
        "description": "Possível ataque (BORDA-SC)",
        "filter": "port 53 and (bpp > 512 and bpp <9000)",
        "retention": 90,
        "sources": [
            "BORDA-SC"
        ]
    },        
    {
        "description": "Tráfego Todas Bordas ",
        "filter": "any",
        "retention": 365,
        "sources": [
            "BORDA-RS",
            "BORDA-SC",
            "BORDA-PR"
        ]
    }
]    

Configuração

  • 📋 Requisitos

    • description: Define o nome ou identificação do tráfego monitorado.
    • filter: Define o filtro de captura do tráfego, que segue o padrão de filtros utilizados por ferramentas como o tcpdump.
    • retention: Define o número de dias em que os dados de tráfego serão mantidos no banco de dados.
    • sources: Lista de fontes (ou locais de borda) de onde os dados de tráfego estão sendo coletados.
  • 🚨 alerts

    Esta seção define como os alertas serão enviados e quais ações serão executadas quando as condições forem atendidas.

    • 📧 email

      • activate: Ativa ou desativa o envio de e-mail. Valor padrão é false.
      • graph_color: Cor do gráfico incluído no e-mail, no formato hexadecimal. Se não informado, uma cor padrão será usada.
      • graph_send: Define se o gráfico será incluído no e-mail. Valor padrão é false se não informado.
      • graph_time: Define o período em minutos para os dados exibidos no gráfico. O valor padrão é 60 minutos se não informado. (É necessário ter esse período de dados para poder gerar o gráfico)
      • message: Texto da mensagem do e-mail, onde variáveis podem ser utilizadas (ver seção “Variáveis de Notificações e Script”).
      • recipients: Lista de e-mails dos destinatários. Se não informado, utiliza o destinatário padrão configurado em do notify.json.
      • subject: Assunto do e-mail, com suporte a variáveis.
    • 💬 telegram

      • activate: Ativa ou desativa o envio de alertas via Telegram. Valor padrão é false.
      • graph_color: Cor do gráfico no Telegram, no formato hexadecimal. Se não informado, uma cor padrão será usada.
      • graph_send: Define se o gráfico será incluído na mensagem do Telegram. Valor padrão é false se não informado.
      • graph_time: Define o período em minutos para os dados exibidos no gráfico. Valor padrão é 60 minutos se não informado.
      • message: Texto da mensagem no Telegram, com suporte a variáveis.
      • recipients: Lista de IDs de chat do Telegram. Se não informado, utiliza o ID de destinatário padrão configurado em do notify.json..
    • 🖥️ script

      • activate: Ativa ou desativa a execução de um script. Valor padrão é false.
      • file: Caminho para o script a ser executado, com suporte a variáveis.
    • ⚙️ conditions

      Define as condições que precisam ser atendidas para que os alertas sejam acionados.

      • logic: Define a lógica entre as condições. Pode ser AND ou OR.
      • rules: Lista de regras, pode ser multipas. (ver seção “Variáveis de Regras”). Cada regra contém:
        • operator: O operador a ser usado na comparação (>, <, >=, <=).
        • value: O valor de referência para a comparação.
        • variable: A variável que será comparada. (ver seção “Variáveis de Regras”)

Variáveis de Regras

As seguintes variáveis podem ser usadas para criação das condições (rules » variable):

  • aggr_flows: Número agregado de fluxos.
  • bpp: Bits por pacote.
  • bps: Bits por segundo.
  • bytes: Quantidade total de bytes.
  • packets: Número total de pacotes.

Variáveis de Notificações e Script

As seguintes variáveis podem ser usadas nas mensagens de e-mail, Telegram e nos scripts:

  • $aggr_flows: Número agregado de fluxos.
  • $bpp: Bits por pacote.
  • $bps: Bits por segundo.
  • $bytes: Quantidade total de bytes.
  • $packets: Número total de pacotes.
  • $status: Status do incidente (incident ou resolved).
  • $description: Descrição do item.
  • $filter: Filtro aplicado.
  • $sources: Fontes de onde os dados foram coletados.

Comportamento Padrão

  • Se recipients (destinatários) não for informado nas seções de e-mail ou Telegram, os valores definidos em notify.json serão usados.
  • Se graph_color não for informado, uma cor padrão será utilizada.
  • O valor padrão de graph_send é false.
  • O valor padrão de graph_time é 60 minutos, caso não seja especificado.

Exemplo Script

Segue um exemplo simples que pode ser utilizado para recerber os dados. Seja criativo!

#!/bin/bash

# Receber as variáveis passadas como argumentos do exemplo:
# "file": "/opt/rr-flow-api/scripts/example.1.sh \"$status\" \"$aggr_flows\" \"$bpp\" \"$bps\" \"$bytes\" \"$packets\" \"$description\" \"$filter\" \"$sources\" \"VALOR EXTRA1\" \"VALOR EXTRA2\""

incident=${1}
aggr_flows=${2}
bpp=${3}
bps=${4}
bytes=${5}
packets=${6}
description=${7}
filter=${8}
sources=${9}
extra1=${10}
extra2=${11}

# Criar ou adicionar ao log em /tmp/example.1.log
echo "==========================" >> /tmp/example.1.log
echo "Status: [${incident}]" >> /tmp/example.1.log
echo "Data: $(date)" >> /tmp/example.1.log
echo "--">> /tmp/example.1.log
echo "Description: ${description}" >> /tmp/example.1.log
echo "Filtro: ${filter}" >> /tmp/example.1.log
echo "Router(s): ${sources}" >> /tmp/example.1.log
echo "--">> /tmp/example.1.log
echo "aggr_flows: ${aggr_flows}" >> /tmp/example.1.log
echo "bpp: ${bpp}" >> /tmp/example.1.log
echo "bps: ${bps}" >> /tmp/example.1.log
echo "bytes: ${bytes}" >> /tmp/example.1.log
echo "packets: ${packets}" >> /tmp/example.1.log
echo "--">> /tmp/example.1.log
echo "Valor Extra 1: ${extra1}" >> /tmp/example.1.log
echo "Valor Extra 2: ${extra2}" >> /tmp/example.1.log
echo "==========================" >> /tmp/example.1.log

echo "Ok!"

📄 botnet.json

Este arquivo não está listado na inteface admin, mas se encontra no diretório /opt/rr-flow-api/config/ ele é automaticamente atualizado com a lista de botnets fornecida pela Feodotracker, auxiliando na identificação de atividades maliciosas.

botnet.json

O arquivo botnet.json é atualizado automaticamente a cada 30min.

📄 interfaces.json

Lista as interfaces das fontes de fluxos. Este arquivo é criado automaticamente durante o início do serviço caso ele não exista. A conexão SNMP é estabelecida a partir dos dados presentes em source_path. O mesmo pode ser editado para customização, bem como remover interfaces desnecessárias se desejar.

Ajuste necessário para interfaces de Upstream

Por padrão ao obter dados de interface todas irão vir “type”: 0, é necessário que ajuste para “type”: 1 as interfaces de upstream.

  • type:
    • 1 = ⬆️ Upstream
    • 0 = ⬇️ Downstream

Apenas as interfaces de Upstream serão mostrada nos menus de escolhas.

Extrutura

{
    "NOME DO FLUXO": [
        {
            "desc_value": "Descrição da interface",
            "indice": "Número do indice obtido por SNMP",
            "name_value": "Nome da interface",
            "type": 0 ou 1
        }
    ]
}

Obtendo interfaces via SNMP

Para obter os dados de interface automaticamente acesse o painel de administração exemplo http://ip:5000/login clique no botão [Obter dados SNMP] em seguida clique no botão [Obter dados de interfaces]

Aguarde até que o arquivo interfaces.json seja atualizado. Caso repita o procedimento o mesmo será sobrescrito.

Criando interfaces.json manualmente

É possível criar seu próprio arquivo de interfaces, porém você ira necessitar do snmpwalk para obter os indices, exemplo dos comandos:

Erro ao obter dados SNMP

Se não for possível estabelecer conexão, será criado um exemplo para a origem do fluxo.
Os OIDs consultados para opter os dados são:

Número de indice 1.3.6.1.2.1.2.2.1.2
nome da interface 1.3.6.1.2.1.31.1.1.1.18

Você pode utilizar ferramentas como snmpwalk para verificar se consegue estabelecer conexão, nmap para verificar se a porta SNMP/UDP esta aberta.

Para obter o nome das interfaces, o índice será o último número após o ponto.
# snmpwalk -v2c -c public 10.250.250.1 .1.3.6.1.2.1.2.2.1.2

iso.3.6.1.2.1.2.2.1.2.79 = STRING: "NULL0"
iso.3.6.1.2.1.2.2.1.2.80 = STRING: "InLoopBack0"
iso.3.6.1.2.1.2.2.1.2.81 = STRING: "GigabitEthernet0/0/0"
iso.3.6.1.2.1.2.2.1.2.132 = STRING: "25GE0/1/28.400"
iso.3.6.1.2.1.2.2.1.2.133 = STRING: "25GE0/1/28.401"
iso.3.6.1.2.1.2.2.1.2.180 = STRING: "25GE0/1/29.1004"
iso.3.6.1.2.1.2.2.1.2.181 = STRING: "25GE0/1/29.1006"

Obtenha a descrição/comentário da interface:
# snmpwalk -v2c -c public 10.250.250.1 .1.3.6.1.2.1.31.1.1.1.18

iso.3.6.1.2.1.31.1.1.1.18.79 = ""
iso.3.6.1.2.1.31.1.1.1.18.80 = ""
iso.3.6.1.2.1.31.1.1.1.18.81 = ""
iso.3.6.1.2.1.31.1.1.1.18.132 = STRING: "IX_SP_IPV4"
iso.3.6.1.2.1.31.1.1.1.18.133 = STRING: "IX_SP_IPV6"
iso.3.6.1.2.1.31.1.1.1.18.180 = STRING: "OPERADORA_IPV4"
iso.3.6.1.2.1.31.1.1.1.18.181 = STRING: "OPERADORA_IPV6"

Junte as informações montando a estrutura do interfaces.json.

{
    "Borda": [
        {
            "desc_value": "IX_SP_IPV4",
            "indice": "132",
            "name_value": "25GE0/1/28.400",
            "type": 1
        },
        {
            "desc_value": "IX_SP_IPV6",
            "indice": "133",
            "name_value": "25GE0/1/28.401",
            "type": 1
        },
        {
            "desc_value": "OPERADORA_IPV4",
            "indice": "180",
            "name_value": "25GE0/1/29.1004",
            "type": 1
        },
        {
            "desc_value": "OPERADORA_IPV6",
            "indice": "181",
            "name_value": "25GE0/1/29.1006",
            "type": 1
        }
    ]
}        

interfaces.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.

📄 peers.json

Obtem a lista de Peers BGP. Também é gerado automaticamente ao iniciar caso não exista. Necessário estabelecer conexão SNMP a partir dos dados presentes em source_path. Pode ser editado para adequação às suas necessidades.

Extrutura

{
    "NOME DO FLUXO": [
        {
            "asn": "NUM AS",
            "ip_peer": "ENDERECO IP DO PEER REMOTO",
            "name": "DESCRIÇÃO PARA SESSÃO"
        },
    ]
}

Obtendo Peer via SNMP

Através do painel de administração, clique no botão [Obter dados SNMP] e, em seguida, [Obter dados de peers]. É fundamental ressaltar que essa ação sempre substituirá o arquivo existente.

Suporte

Até o momento é possivel obter os peer apensar de Huawei e Cisco. No entanto, você pode criar manualmente este arquivo com facilidade.

Criando manualmente

É possível você criar seu próprio arquivo de interfaces, porém você ira necessitar do snmpwalk para obter os indices, exemplo do comando snmpwalk -v2c -c public 10.250.250.1 IF-MIB::ifIndex

Exemplo
{
    "Border": [
        {
            "asn": "15169",
            "ip_peer": "187.16.216.55",
            "name": "GOOGLE"
        },
        {
            "asn": "65530",
            "ip_peer": "10.50.50.1",
            "name": "Cgnat"
        }
    ],
    "Cgnat": [
        {
            "asn": "65530",
            "ip_peer": "10.50.50.2",
            "name": "iBGP Borda"
        },
        {
            "asn": "65530",
            "ip_peer": "10.50.50.6",
            "name": "iBGP BNG"
        }
    ]
}

Erro ao obter dados SNMP

Se não for possível estabelecer conexão, será criado um exemplo para a origem do fluxo.
Os OIDs consultados para obter os dados são:

OID PEER HUAWEI
    IP : 1.3.6.1.4.1.2011.5.25.177.1.1.2.1.4.0
    AS : 1.3.6.1.4.1.2011.5.25.177.1.1.2.1.2.0

OID PEER CISCO
    IP : 1.3.6.1.2.1.15.3.1.7
    AS : 1.3.6.1.2.1.15.3.1.9

Você pode utilizar ferramentas como snmpwalk para verificar se consegue estabelecer conexão, nmap para verificar se a porta SNMP/UDP esta aberta.

peers.json

Ao realizar edições, não é preciso reiniciar o serviço para que as alterações tenham efeito.