1. LA SOCIALISATION
1.3. Analyse critique des perspectives de socialisation
Paralelamente ao processo de medição de fluxos, o dispositivo IPFIX inicia o processo de exportação dos dados IPFIX. Para isso, primeiramente, o dispositivo deve verificar a disponibilidade do coletor indicado durante a sua configuração, através do parâmetro “–c <endereço IP do coletor>”. Caso o coletor não esteja acessível um arquivo com a informação de erro deve ser criado informando o momento em que se tentou efetuar a conexão.
O controle da conexão com o coletor é realizado com o auxílio da biblioteca libipfix [MAR 07]. Esta biblioteca está atualmente sendo desenvolvida, já possuindo, entretanto, grande compatibilidade com as especificações do IETF. Sua implementação, inclusive, originou o trabalho [BOS 06] que possui indicações para o desenvolvimento e uso de sistemas que utilizam o protocolo IPFIX. Entretanto, embora a implementação em concordância com as definições do IPFIX esteja adiantada, a biblioteca ainda carece de uma maior documentação. A versão da biblioteca libipfix utilizada no presente trabalho foi a 0.7. Basicamente, para estabelecer a conexão com o coletor através desta biblioteca, primeiramente é necessário iniciá-la, através da função ipfix_init(), e logo em seguida abrir
seu módulo exportador, utilizando a função ipfix_open(). Após esse processo já é possível estabelecer a conexão com o coletor, com a função ipfix_add_collector(). A libipfix já possui suporte para o envio das informações de fluxo do dispositivo IPFIX para diversos coletores.
Logo após o estabelecimento da conexão, o módulo responsável pela exportação precisa receber o modelo de dados a serem transportados. Conforme visto no capitulo anterior, esse modelo é obtido a partir do uso templates.
Conforme visto anteriormente, no dispositivo IPFIX prototipado, o template a ser formado é definido pelo usuário, através do uso do parâmetro de configuração “-x <caminho do arquivo de configuração XML>”. A partir da montagem do arquivo Extensible Markup Language (XML) são descritos cada um dos elementos que forma esse template, utilizando tanto os elementos de informação definidos em [QUI 06] quanto elementos de informação proprietários.
O XML [BIR 01] é um subtipo de SGML (Standard Generalized Markup Language, ou Linguagem Padronizada de Marcação Genérica) capaz de descrever diversos tipos de dados. Seu propósito principal é a auxiliar o compartilhamento de informações através da Internet. Ele foi escolhido na definição dos templates por diversos motivos, entre os quais podem ser citados:
• a existência de um parser nativo na maioria das linguagens de programação;
• qualquer aplicação que possua um parser XML é capaz de extrair as informações do arquivo, desde que receba o Document Type Definition (DTD) correspondente; • o XML simplifica a mudança nos campos de configuração, ou seja, através de seu
uso a inserção ou remoção de elementos que compõe a configuração fica simplificada;
• finalmente, o XML é a ferramenta recomendada pelo W3C (World Wide Web Consortium) para gerar linguagens de marcação para necessidades especiais.
<!ELEMENT ipfix (template)> <!ELEMENT template (field)> <!ELEMENT field EMPTY> <!ATTLIST template
type (data|option) "data" >
<!ATTLIST field
enterprise CDATA '0' name CDATA #REQUIRED >
Como pode ser visto no DTD, o XML apresentará um ou mais elementos template formado por vários elementos field. Cada um dos campos field definem um elemento de informação, especificado pelo atributo name. Além de name, o campo field possui o atributo enterprise, que define o Enterprise Number da autoridade que define o campo. Conforme comentado na subseção 3.4.4, esse valor é 0 caso a informação seja definida pelo IETF.
Para aplicação a desenvolvida foi definida a seguinte configuração de template:
<?xml version="1.0" encoding="ISO8859-1"?> <!DOCTYPE ipfix SYSTEM "obs-template.dtd" > <ipfix>
<template type="data">
<field enterprise="0" name="sourceTransportPort"/> <field enterprise="0" name="sourceIPv4Address"/>
<field enterprise="0" name="destinationTransportPort"/> <field enterprise="0" name="destinationIPv4Address"/> <field enterprise="0" name="protocolIdentifier"/> <field enterprise="99999" name="flowIdentifier"/> <field enterprise="99999" name="octetDeltaCountIn"/> <field enterprise="99999" name="octetDeltaCountOut"/> <field enterprise="99999" name="octetTotalCountIn"/> <field enterprise="99999" name="octetTotalCountOut"/> <field enterprise="99999" name="packetDeltaCountIn"/> <field enterprise="99999" name="packetDeltaCountOut"/> <field enterprise="99999" name="packetTotalCountIn"/> <field enterprise="99999" name="packetTotalCountOut"/> </template>
</ipfix>
A Tabela 2 descreve cada um dos elementos de informação que compõe o template, de acordo com a configuração descrita acima.
Tabela 2 Informações exportadas pelo sistema de medição
Campo Descrição
sourceTransportPort Porta da camada de transporte do transmissor.
sourceIPv4Address Endereço IP do transmissor.
destinationTransportPort Número da porta no receptor. destinationIPv4Address Endereço IP do receptor.
protocolIdentifier Número identificador do protocolo da camada de transporte. flowIdentifier Chave de identificação do fluxo, formada a partir do processo
descrito na subseção 4.1.1.
octetDeltaCountIn Número de bytes observados no sentido downstream, desde a última
mensagem IPFIX exportada.
octetDeltaCountOut Número de bytes observados no sentido upstream, desde a última
mensagem IPFIX exportada.
octetTotalCountIn Total de bytes contabilizados no sentido downstream. octetTotalCountOut Total de bytes contabilizados no sentido upstream.
packetDeltaCountIn Número de pacotes observados no sentido downstream, desde a
mensagem IPFIX exportada.
packetDeltaCountOut Número de pacotes observados no sentido upstream, desde a última
mensagem IPFIX exportada.
packetTotalCountIn Total de pacotes contabilizados no sentido downstream. packetTotalCountOut Total de pacotes contabilizados no sentido upstream.
O tratamento do XML no observador é realizado pela biblioteca libxerces. Ela fornece ao C++ todo suporte no tratamento de mensagens XML. A partir da extração da informação sobre os templates, utilizou-se novamente a biblioteca libipfix para montar os templates. Nesta biblioteca, a função ipfix_new_data_template() é utilizada para a criação do template, enquanto que a função ipfix_add_field() insere cada um dos campos nesse template.
Para realizar o envio de mensagens, o dispositivo IPFIX utiliza um temporizador que, seguindo um intervalo de tempo pré-configurado através do parâmetro “-t <intervalo de tempo em segundos>”, envia um sinal ao módulo exportador. Este por sua vez, ao receber o sinal, acessa os dados que estão armazenados no map de registros de fluxo e monta a mensagem IPFIX, inserindo nesta o seu identificador único, configurado através do parâmetro “-I <identificador do observador IPFIX>”. Essa mensagem é então enviada ao dispositivo coletor, através do uso da função ipfix_export().