🗂️ 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",
            "name": "Borda",
            "port": 3055,
            "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.

    "maximum_disk_gb": "85",

Aviso

Não defina mais que 90% do seu disco.

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
    lz4 Rápido, leve Muito Alta Muito Alta Muito Alta
    bz2 Máxima compactação Lenta Lenta Lenta
    lzo Equilíbrio rápido Muito Alta Alta Muito Alta
    zstd ¹ Flexível, configurável Alta a Muito Alta Alta Alta

    ¹ nfdump 1.7.5

  • name: Nome da fonte de dados (Sem espaço).

  • port: Porta que receberá os dados.
  • 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 (neste caso, “”).
    • netflow
    • sflow
  • vendor: Fornecedor da fonte de dados.
    • huawei
    • cisco
    • juniper
    • routeros / routeros6
    • vyos
    • linux

name

em “name”: “Nome-Aqui” não utilize espaço.

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"
        }
    ]
//...
}

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": "Vido dos DNS famosos para com destino ao 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. Recomendo deixar apenas as interfaces que estão sendo coletadas, desta forma evita erros quando for coletar, eu partcularmente deixo apenas as de upstream, mas vai depender de cada caso.

Extrutura

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

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]

Aguarde até que o arquivo interfaces.json seja atualizado. Ele será sobrescrito caso tenham sido feitas alterações antes da atualização. Recomenda-se fazer uma cópia de segurança antes de proceder com a atualização.

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.

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": [
        {
            "desc_value": "OPERADORA A",
            "indice": "42",
            "name_value": "40GE0/1/49.1234"
        },
        {
            "desc_value": "OPERADORA B",
            "indice": "43",
            "name_value": "40GE0/1/49.2345"
        }
    ],
    "Cgnat": [
        {
            "desc_value": "BORDA",
            "indice": "1",
            "name_value": "sfp-sfpplus1"
        },
    ],
}

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.