🗂️ 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.
- activate: Ativa ou desativa o envio de e-mail. Valor padrão é
-
💬 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
..
- activate: Ativa ou desativa o envio de alertas via Telegram. Valor padrão é
-
🖥️ 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.
- activate: Ativa ou desativa a execução de um script. Valor padrão é
-
⚙️ 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
ouOR
. - 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”)
- operator: O operador a ser usado na comparação (
- logic: Define a lógica entre as condições. Pode ser
-
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
ouresolved
). - $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 interface1.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.