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": 5,
    "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 (Padrão 5). 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.

    "collection_interval": 5,
core_workers

A quantidade de processos alocados para cada CPU. 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": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
            "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)
    • lzo: Comprime os arquivos de fluxo com compressão LZO1X-1. Compressão mais rápida.
    • lz4: Comprime os arquivos de fluxo com compressão LZ4. Rápido e eficiente.
    • bz2: Comprime os arquivos de fluxo com compressão bz2. Lento, mas mais eficiente.
  • 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.

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.