5. Escrevendo arquivos de regras
Uma regra é armazenada em um arquivo texto padrão ASCII, contendo as informações necessárias para uma medição de contabilização e para uma coletagem. Estas regras incluem um número (rule set number), uma tabela de regras, uma especificação do formato e uma requisição de estatística. Uma regra preparada (rule set) é simplesmente uma tabela de regras, identificada pelo seu número de regra. Um medidor de contabilização pode ter mais de dez regras na memória, permitindo ao seu gerente comuta-las, definido o valor da variável CurrentRuleSet da MIB.
Netramet tem uma regra construída internamente, chamada regra default, representada pelo número 1. Isto permite ao Netramet ser ativado logo que seja executado, provendo uma regra default o qual pode ser usado quando outra regra seja carregada pelo gerente. A regra preparada default não pode ser alterada pelo gerente.
A sintaxe para o arquivo de regras é dada mais adiante na forma de diagramas , junto com exemplos detalhados vistos nas seções seguintes.
Cada instrução em um arquivo de regra começa no inicio da linha e termina com um ponto e vírgula. Um caractere carquilha representa uma linha de comentário; todos os caracteres após uma carquilha são ignorados pelo rastreamento do gerente.
O rastreamento do NeMaC procura por Palavras-chave, números e endereços. Palavras-chave são exibidas no diagrama com letras maiúsculas. Palavras-chave, incluindo nomes dos atributos, devem ser dados completos, abreviações não são permitidas.
Arquivos de Regras
Sentença RuleSet
Cabeçalho da Regra
Sentença Format
Sentença Statistics
Sentença Include
O arquivo de regras contém um ou mais dos cinco elementos possíveis, que podem aparecer em qualquer ordem no arquivo. Caracteres maiúsculos não são significativos nos arquivos de regras.
Sentença Ruleset
SET setnbr ;
A sentença Ruleset avisa ao medidor qual regra (rule set) será usada. Se o arquivo de regras não tem uma instrução Ruleset, o medidor vai continuar a usar a regra preparada atual.
RULES Rótulo Instruções de Regras
Instruções de Regras
atributo & máscara = valor : procedimento , índice ;
O cabeçalho da regra especifica a tabela de regras para uma regra preparada, e faz uma requisição ao Nemac para baixa-la para o medidor.
Ele inicia com a palavra-chave RULES, seguido por uma série de instruções de regras, uma para cada regra. Cada regra tem cinco componentes, qual devem aparecer na ordem correta. Estes são:
ATRIBUTO
O nome do atributo para ser testado por esta regra. Qualquer dos atributos de endereços podem ser usados, menos a máscara ou atributos gerais. O atributo Null (nulo) pode também ser usado, neste caso a regra sempre será sucedida.
Adicionalmente poderá ser testada uma variável de medição. Há cinco destas, designada por v1, v2, v3, v4 e v5, cada qual pode pegar o nome de um atributo de endereço. Um valor para variável é repassado por um mecanismo de atribuição (ver mais adiante).
Quando uma variável aparece como um atributo de uma regra, seu valor especifica o atributo PDU para ser testado. Ex.: Se v1 foi atribuído a SourcePeerAddress como seu valor, uma regra com v1 como seu atributo iria testar o atual SourcePeerAddress.
MÁSCARA
Especifica a máscara a qual esta junta (ANDed ou &) com o valor do atributo de um pacote de chegada. Deve ser do mesmo tamanho (número de bytes) de valor do atributo. Notar que se uma regra de mascara for zero ela sempre será sucedida. Isto pode ser útil para as regras com ações de atribuições, desde que ela permita-os ter variáveis de medidor para seus atributos.
VALOR
Especifica um valor para ser comparado com o valor de um pacote de chegada. Se a comparação falhar, a próxima regra é testada, do contrário a atividade da regra é executada.
PROCEDIMENTO
Mecanismos a ser efetuado se o valor de regra for igual. Possíveis procedimentos são:
Ignore |
Para a execução da regra e retorna um resultado "sucedido". Isto significa que o pacote que chegou não foi contado, ele será ignorado. |
Retry |
Para a execução da regra e retorna um resultado "falhou". Isto permite o medidor trocar os atributos de origem e destino para retentar a combinação. |
Count |
Conta este pacote na tabela de contadores especificada pelo índice de regras. Atributo e valores de mascara para um fluxo são pegos da pilha modelo na mesma ordem como eles são "empurrados" durante o processamento da regra. |
CountPkt |
Executa um procedimento de PushPktto (veja a seguir), e então um procedimento de Count (contagem). |
Return |
Retorna de uma subrotina de regra, usando o índice de regras com um deslocamento. O índice de regra retornado é retirados de uma pilha return. |
GoSub |
Chama uma subrotina de regra. O índice da próxima regra para ser testada é definido para este índice da regra, e o medidor coloca este índice da regra em uma pilha return. |
GoSubAct |
Idem ao GoSub, exceto seu conteúdo é executado imediatamente. |
Assign |
O atributo VALOR especificado por este valor da regra é designado para a variável especificada pelo atributo da regra. Veja que Assign e AssignAct usam a regra valor em uma situação incomum, ele nunca deve fazer um teste, em vez, ele deve sempre ser executado com um resultado de um procedimento Return, GoSubAct, AssignAct, GotoAct, PushRuletoAct ou PushPkttoAct. |
AssignAct |
Idem ao Assign, exceto que seu conteúdo é executado imediatamente. |
GoTo |
Define o índice da próxima regra para ser testada neste índice de regra. |
GoToAct |
Idem ao GoTo, exceto que seu conteúdo é executado imediatamente com o procedimento, sem teste. |
PushRuleto |
Grava o nome do atributo de regra, máscara e valor sobre a pattern stack (pilha modelo) e define o índice da próxima regra a ser testada para este índice de regra. O pattern stack grava as regras a qual usou corretamente; esta informação é usada por um procedimento de contar para construir fluxos. |
PushRuletoAct |
Idem ao PushRuleto, exceto que seu conteúdo é executado imediatamente com o processo, sem teste. Para compatibilização com antigas versões do NeMaC, Pushto e PushtoAct são tratados como sinônimo de PushRuleto e PushRuletoAct. |
PushPktto |
Grava o atributo nome e máscara da regra, e o valor definido do pacote sobre o pattern stack. Define o índice da próxima regra a ser testada para este índice de regra. Valor sempre será zero, consequentemente as regras PushPktto e PushPkttoAct nunca serão testadas; ao invés, elas devem ser executadas como o resultado de um procedimento Return, GoSubAct, AssignAct, GotoAct, PushRuletoAct ou PushPkttoAct. |
PushPkttoAct |
Idem ao PushPktto, exceto que o conteúdo da regra é executado junto com o procedimento, sem teste. |
INDEX
Este é um parâmetro para procedimentos, veja a seguir várias utilidades.
Números das regras são indexadas 1-origem para suas tabelas correspondentes. Estes números podem ser usados diretamente, mas pode ser difícil de fazer isso exatamente. A forma mais simples de fazer é incluindo o número da regra em um comentário inserido em cada instrução.
Regras podem ser também rotuladas e referidas por seus rótulos, qual é muito mais fácil ! Um rótulo deve aparecer no início de uma linha do arquivo de regra e pode conter caracteres, dígitos e sublinhados. Nemac verifica a consistência dos rótulos.
Onde é necessário um rótulo para the next rule a palavra reservada next deve ser usada, removendo a necessidade para criar um rótulo.
Format Atributos ;
Separador
A sentença Format especifica o formato dos dados gerados pelas regras em um arquivo de fluxos do Nemac.
Ela começa com uma palavra-chave Format, que é seguida por uma lista de atributos de fluxo, na ordem que irão aparecer no arquivo de fluxo de dados.
STATISTICS ;
A sentença de estatísticas chama Nemac para coletar as estatísticas de performace do medidor cada vez que foram coletados dados de fluxos e escreve estes dados no arquivo de dados de fluxos. Nemac zera as variáveis de estatística do Netramet depois de ler os seus valores.
INCLUDE filename ;
Uma sentença include permite que um arquivo de regras use outro arquivo de regra. Quando o NeMaC encontra uma regra, grava sua posição no arquivo de regra corrente e troca para a especificada. Quando chega no fim do arquivo incluído, volta e continua o arquivo anterior. Podem ser incluídos 5 arquivos de regras.
5.3 Arquivos de Regras
Esta seção da alguns exemplos de arquivos de regras, com comentários sobre o que eles fazem e por que foram escritos.
Isto é muito simples, para desenvolver um novo arquivo de regras, deve seguir os seguintes procedimentos.
# 1445, Mon 9 Jan 95
#
# Default rule file for NeTraMet (built in to the meter)
#
# Nevil Brownlee, Computer Centre, The University of Auckland
#
SET 1
#
RULES
SourcePeerType & 255 = dummy: Ignore, 0; # Ignore meter's dummy pkts
Null & 0 = 0: GotoAct, Next;
SourcePeerType & 255 = 0: CountPkt, 0;
#
# end of file
Esta é a regra padrão, a qual é construída para o medidor e não pode ser alterada. Ela fornece a regra preparada 1 (rule set 1) que produz um conjunto de fluxos, um para cada dos tipos pares o qual Netramet compreende.
A primeira linha descarta pacotes simulados dummy (falsos). Pacotes simulados são gerados e processados pelo medidor quando ele não tem conhecimento real do que fazer; a proporção de tempo que o medidor gasta processando pacotes postiços é medido em porcentagem de tempo inativo (idle time).
A segunda regra é necessária para que a terceira regra testada nunca seja executada. Ela testa o atributo nulo (Null), o qual sempre sucede, assim o procedimento GotoAct será sempre executada. Se a segunda regra não tivesse lá, SourcePeerType seria comparado com zero. O teste então falharia e desde que não há regras, nenhum pacote combinaria.
# 1412, Thu 9 Feb 95
# Rule specification file to tally IP net <-> IP net,
# tally DECnet and Novell and aggregate EtherTalk
#
SET 2
#
RULES
SourcePeerType & 255 = IP: Pushto, IP_pkt;
SourcePeerType & 255 = Novell: Pushto, Novell_pkt;
SourcePeerType & 255 = EtherTalk: Pushto, Apple_pkt;
SourcePeerType & 255 = DECnet: Pushto, DEC_pkt;
Null & 0 = 0: Ignore, 0;
A primeira parte desta tabela de regra determina o tipo de protocolo par. Pacotes IP, Novell, EtherTalk e DECnet fazem o medidor examinar seu SourcePeerType, então pula para o grupo rotulado de regras do protocolo. A última regra sobre outros protocolos (Other) é descartada pela regra Ignore.
IP_pkt:
SourcePeerAddress & 192.0.0.0 = 192.0.0.0: Goto, low_C;
SourcePeerAddress & 192.0.0.0 = 128.0.0.0: Goto, low_B;
SourcePeerAddress & 192.0.0.0 = 64.0.0.0: Goto, low_A;
SourcePeerAddress & 192.0.0.0 = 0.0.0.0: Goto, low_A;
Null & 0 = 0: GotoAct, other;
low_A:
DestPeerAddress & 192.0.0.0 = 192.0.0.0: GotoAct, A_C;
DestPeerAddress & 192.0.0.0 = 128.0.0.0: GotoAct, A_B;
DestPeerAddress & 192.0.0.0 = 64.0.0.0: GotoAct, A_A;
DestPeerAddress & 192.0.0.0 = 0.0.0.0: GotoAct, A_A;
Null & 0 = 0: GotoAct, other;
low_B:
DestPeerAddress & 192.0.0.0 = 192.0.0.0: GotoAct, B_C;
DestPeerAddress & 192.0.0.0 = 128.0.0.0: GotoAct, B_B;
DestPeerAddress & 192.0.0.0 = 64.0.0.0: GotoAct, B_A;
DestPeerAddress & 192.0.0.0 = 0.0.0.0: GotoAct, B_A;
Null & 0 = 0: GotoAct, other;
low_C:
DestPeerAddress & 192.0.0.0 = 192.0.0.0: GotoAct, C_C;
DestPeerAddress & 192.0.0.0 = 128.0.0.0: GotoAct, C_B;
DestPeerAddress & 192.0.0.0 = 64.0.0.0: GotoAct, C_A;
DestPeerAddress & 192.0.0.0 = 0.0.0.0: GotoAct, C_A;
Null & 0 = 0: GotoAct, other;
Esta parte da tabela de regra manipula pacotes IP. Os primeiros dois bits de endereço origem par do pacote é examinado para decidir se ele é uma classe A, B ou C. Para cada um destes casos os dois primeiros bits do endereço destino par são testados para determinar sua classe de endereço. Cada dos nove pares de classes de endereços possíveis causam um salto para um par de regras (a seguir) que levam o endereço origem e destino do pacote. Qualquer outro endereço como endereço multicast, causa um pulo para a regra rotulada other, onde seus endereços completos (32 bit) origem e destino são levados. Uma vez que o endereço origem e destino tenham sido levados, a regra rotulada count_pkt conta o pacote.
other:
SourcePeerAddress & 255.255.255.255 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255.255 = 0: PushPkttoAct, count_pkt;
A_C:
SourcePeerAddress & 255.0.0.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255.0 = 0: PushPkttoAct, count_pkt;
A_B:
SourcePeerAddress & 255.0.0.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.0.0 = 0: PushPkttoAct, count_pkt;
A_A:
SourcePeerAddress & 255.0.0.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.0.0.0 = 0: PushPkttoAct, count_pkt;
B_C:
SourcePeerAddress & 255.255.0.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255.0 = 0: PushPkttoAct, count_pkt;
B_B:
SourcePeerAddress & 255.255.0.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.0.0 = 0: PushPkttoAct, count_pkt;
B_A:
SourcePeerAddress & 255.255.0.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.0.0.0 = 0: PushPkttoAct, count_pkt;
C_C:
SourcePeerAddress & 255.255.255.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255.0 = 0: PushPkttoAct, count_pkt;
C_B:
SourcePeerAddress & 255.255.255.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.0.0 = 0: PushPkttoAct, count_pkt;
C_A:
SourcePeerAddress & 255.255.255.0 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.0.0.0 = 0: PushPkttoAct, count_pkt;
#
count_pkt:
Null & 0 = 0: Count, 0; # Source and Dest Peer Address pushed above
Nas regras encima, não se faz nada para impor alguma ordem sobre endereço origem e destino. Quando um pacote aparece como o primeiro de um novo fluxo de tráfego, seu origem vai ser o origem para o fluxo.
Novell_pkt:
SourcePeerAddress & 255.255.255.255 = 0: PushPktToAct, Next;
DestPeerAddress & 255.255.255.255 = 0: CountPkt, 0;
#
Apple_pkt:
Null & 0 = 0: Count, 0; # No detail for Ethertalk
#
DEC_pkt:
SourcePeerAddress & 255.255.255.0 = 0: PushPktToAct, Next;
DestPeerAddress & 255.255.255.0 = 0: CountPkt, 0;
Estas ações juntam pacotes ethertalk, Novell e DECnet. As marcas colocam um endereço par completo em cada caso. Estas instruem o medidor para criar fluxo para todo possível par de endereços pares.
STATISTICS
#
FORMAT FlowRuleSet FlowIndex FirstTime " "
SourcePeerType SourcePeerAddress DestPeerAddress " "
ToPDUs FromPDUs " " ToOctets FromOctets;
#
# end of file
A sentença Format especifica os atributos para serem coletados pelo medidor. Elas usam espaços duplos para separar os atributos em quatro grupos.
5.3.3 rules.gateway
# 1700, Wed 8 Feb 95
#
# Rule specification file to tally traffic to/from ccr1
#
# Nevil Brownlee, Computer Centre, University of Auckland
#
SET 3
#
RULES
DestAdjacentAddress & FF-FF-FF-FF-FF-FF = AA-00-04-00-F4-ED:
Goto, gateway;
Null & 0 = 0: Retry, 0;
gateway:
SourcePeerType & 255 = IP: Pushto, ip_pkt;
Null & 0 = 0: Ignore, 0;
#
ip_pkt:
SourcePeerAddress & 255.255.0.0 = 130.216.0.0: Goto, low_C; # Auckland
SourcePeerAddress & 192.0.0.0 = 192.0.0.0: Goto, low_C;
low_B:
DestPeerAddress & 192.0.0.0 = 128.0.0.0: GotoAct, B_B;
DestPeerAddress & 192.0.0.0 = 192.0.0.0: GotoAct, B_C;
Null & 0 = 0: GotoAct, B_A;
Esta regra foi definida para medir o tráfego através de um gateway ethernet, o qual será um roteador com endereço ethernet AA-00-04-00-F4-ED o qual fornece nossa conexão com a Internet. A primeira regra acima testa cada pacote DestAdjacentAddress para ver se seu destino é do lado mais afastado do roteador. Se ele for, a regra rotulada gateway será testada após, do contrário, a regra retry é executada, permitindo ao medidor trocar origem e destino e tentar novamente. Se a combinação falhar na segunda tentativa o pacote será ignorado.
O resto deste arquivo de regra é bastante similar ao rules.sample acima.
# 1445, Wed 8 Feb 95
#
# Rule specification file to tally broadcast packets
#
# Nevil Brownlee, Computer Centre, University of Auckland
#
SET 4
#
RULES
DestAdjacentAddress & FF-FF-FF-FF-FF-FF = FF-FF-FF-FF-FF-FF:
GotoAct, broadcast;
Null & 0 = 0 : Retry, 0; # Try other direction
Esta regra procura por pacotes ethernet broadcast, testando seu DestAdjacenteAddress. Broadcast marcado usando um grupo de regras rotulado broadcast (veja mais adiante).
A segunda regra é muito importante, e é necessária devido a forma que a tabela de contagem é manipulada. Considerando um pacote de entrada. Se a primeira combinação for um pacote broadcast e estiver marcado. Se este (broadcast) fluxo estiver pronto na tabela de contagem ele será contado e o trabalho é feito. Senão não, o contador não coloca ele imediatamente (devido a ele poder já ter sido trocado com o origem e destino) e a combinação falha.
O pacote é combinado de novo, mas a regra 1 e regra 2 falham. Nesta situação o medidor relembra que ele foi um contador que causou a primeira falha, assim a combinação tenta uma terceira alternativa, forçando o contador a adicionar o fluxo.
broadcast:
SourceAdjacentAddress & FF-FF-FF-FF-FF-FF = 0: PushPkttoAct, Next;
DestAdjacentAddress & FF-FF-FF-FF-FF-FF = 0: PushPkttoAct, Next;
SourcePeerType & 255 = 0: PushPkttoAct, Next;
SourcePeerAddress & 255.255.255.255 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255.255 = 0: PushPkttoAct, Next;
SourceTransType & 255 = 0: PushPkttoAct, Next;
SourceTransAddress & 255.255 = 0: PushPkttoAct, Next;
DestTransAddress & 255.255 = 0: CountPkt, 0;
Este grupo de regras leva todo endereço adjacente, par e de transporte do pacote. Veja que desde que nós não queremos qualquer deste testes para ser executado (eles falhariam) nós usamos o toAct do PushPkt. A última regra empurra o DestTransAddress e conta o pacote. Este exemplo demonstra como coletar uma quantidade grande de detalhes sem explicitamente testar cada atributo requisitado.
Os serviços do protocolo IP, BOOTP (porta 67 e 68) e RIP (porta 520) são comumente origens de pacotes IP broadcast. Lembre-se que ARP não faz parte do protocolo IP, assim Netramet verá pacotes ARP como outros (Others) pacotes.
# 1240, Thu 9 Feb 95
#
# Rule specification file to tally IP packets by port nbr
#
# Nevil Brownlee, Computer Centre, University of Auckland
#
SET 5
#
RULES
SourcePeerType & 255 = IP: Pushto, ip_pkt;
SourcePeerType & 255 = dummy: Ignore, 0; # Ignore meter's dummy pkts
Null & 0 = 0: GotoAct, Next;
SourcePeerType & 255 = 0: CountPkt, 0; # Count packet types
Pacotes IP fazem o medidor pular para a regra chamada ip_pkt. Outros tipos de pacotes são contados pelo tipo par; isto é feito da mesma forma da regra default do medidor (veja em rules.default).
ip_pkt:
SourceTransType & 255 = tcp: Pushto, tcp_udp;
SourceTransType & 255 = udp: Pushto, tcp_udp;
SourceTransType & 255 = icmp: Pushto, c_trans_only;
SourceTransType & 255 = ospf: Pushto, c_trans_only;
Null & 0 = 0: GotoAct, t_bad; # Unknown transport type
#
tcp_udp: s_news:
SourceTransAddress & 255.255 = nntp: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = nntp: GotoAct, s_news;
s_smtp:
SourceTransAddress & 255.255 = smtp: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = smtp: GotoAct, s_smtp;
O tipo transporte é testado primeiro. Pacotes TCP e UDP são desviados para a regra chamada tcp_udp. Pacotes ICMP e OSPF saltam para c_trans_only, onde eles são marcados como tipo transporte. Pacotes de tipos desconhecidos saltam para t_bad onde todos seus atributos são registrados.
s_domain:
SourceTransAddress & 255.255 = domain: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = domain: GotoAct, s_domain;
s_telnet:
SourceTransAddress & 255.255 = telnet: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = telnet: GotoAct, s_telnet;
s_ftp_ctrl:
SourceTransAddress & 255.255 = ftp: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = ftp: GotoAct, s_ftp_ctrl;
s_ftp_data:
SourceTransAddress & 255.255 = ftpdata: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = ftpdata: GotoAct, s_ftp_data;
#
Null & 0 = 0: GotoAct, t_bad; # 'Unusual' port
#
t_bad: # End of packet testing
SourceTransAddress & 255.255 = 0: PushPkttoAct, Next;
DestTransAddress & 255.255 = 0: PushPkttoAct, Next;
SourceTransType & 255 = 0: CountPkt, 0;
c_trans_source: # SourceTransAddress already pushed
SourceTransType & 255 = 0: CountPkt, 0;
c_trans_only:
SourceTransType & 255 = 0: CountPkt, 0;
#
FORMAT FlowRuleSet FlowIndex FirstTime " "
SourcePeerType
SourceTransType SourceTransAddress DestTransAddress " "
ToPDUs ToOctets FromPDUs FromOctets;
#
STATISTICS
#
# end of file
Para cada um dos tipos específicos de portas é analisado o DestTransAddress. Se o teste for positivo, DestTransAddress (número da porta IP) é recuperado, e o pacote é contado no c_trans_source. Se falhar, o SourceTransAddress é analisado. Obtendo sucesso chama a regra precedente para ser executada. O efeito disto é para recuperar o número da porta do protocolo no SourceTransAddress, sem considerar em qual direção o pacote trafegava.
O efeito global desta regra é classificar tráfego IP em um grupo pequeno de tipos de tráfegos em comum, pela análise de seus números de portas já conhecidos.
5.3.6 rules.manage
# 1550, Thu 9 Feb 95
#
# Rule specification file to tally traffic for Auckland, using four
# groups of sites: UA-depts, Local, NZ and World
#
# Nevil Brownlee, Computer Centre, University of Auckland
#
SET 6
#
RULES
SourcePeerType & 255 = IP: Pushto, IP_pkt;
Null & 0 = 0 : Ignore, 0; # Ignore other packet types
Esta regra mede nosso gateway Ethernet, fornecendo informações sumárias sobre quatro tipos de redes IP: departamentos da universidade de Auckland, Redes locais, redes na Nova Zelândia e o resto do mundo.
dest_local:
v1 & 0 = SourcePeerAddress: AssignAct, Next;
Null & 0 = 0: Gosub, Auckland_nets;
Null & 0 = 0: Goto, c_pkt; # 1 Dept -> dept-local
Null & 0 = 0: GotoAct, t_bad; # 2 UA, not in list of OK subnets -> UA-local
Null & 0 = 0: Ignore, 0; # 3 Local -> Ignore local-local
Null & 0 = 0: Retry, 0; # 4 Not UA or local -> Want local as source
#
dest_UA:
SourcePeerAddress & 255.255.0.0 = 130.216.0.0: Ignore, 0; # Ignore UA-UA
Null & 0 = 0 : Retry, 0; # Want Auckland as source
#
IP_pkt:
DestPeerAddress & 255.255.0.0 = 130.216.0.0: Pushto, dest_UA; # Auckland
Null & 0 = 0: GotoAct, Next;
v1 & 0 = DestPeerAddress: AssignAct, Next;
Null & 0 = 0: Gosub, Auckland_nets;
Null & 0 = 0: Ignore, 0; # 1 dest UA department
Null & 0 = 0: Ignore, 0; # 2 dest UA
Null & 0 = 0: GotoAct, dest_local; # 3 dest Local
#
v1 & 0 = SourcePeerAddress: AssignAct, Next; # 4 dest NZ or world
Null & 0 = 0: Gosub, Auckland_nets;
Null & 0 = 0: GotoAct, src_dept; # 1 source Dept
Null & 0 = 0: GotoAct, t_bad; # 2 source UA, not an OK subnet
Null & 0 = 0: GotoAct, src_local; # 3 source Local
Null & 0 = 0: GotoAct, t_bad; # 4 Not local, unexpected transit
Uma vez que um pacote tenha sido identificado como IP de transporte (carrying IP), nós chamamos IP_pkt. Se seu destino e origem forem ambos de Auckland o pacote é ignorado. Se seu destino é de Auckland mas não o seu origem, a combinação falha; isto força Auckland para ser o origem do fluxo.
A subrotina Auckland_nets é chamada para testar os destinos dos pacotes. Isto retorna 1, 2, 3 ou 4 dependendo em qual grupo o destino pertence, e retorna o DestPeerAddress na pilha modelo.
Se o destino é uma conexão local de rede o controle passa para Dest_local, onde Auckland_net é chamado novamente para determinar a origem do pacote. Pacotes do tipo local-para-local são ignorados, pacotes Auckland-para-local são contados (indo para c_pkt) e pacotes com um destino local falham, forçando redes locais para ser o origem do fluxo para outras redes a não ser Auckland.
src_dept:
v1 & 0 = DestPeerAddress: AssignAct, Next;
Null & 0 = 0: Gosub, Tuia_proximal;
DestPeerAddress & 255.255.0 = 130.216.0 : Ignore, 0; # 1 Auckland
DestPeerAddress & 255.255.0 = 132.181.0 : Pushto, c_pkt; # 2 Canterbury
DestPeerAddress & 255.255.0 = 131.203.0 : Pushto, c_pkt; # 3 Gracefield
DestPeerAddress & 255.255.0 = 141.158.0 : Pushto, c_pkt; # 4 Invermay
DestPeerAddress & 255.255.0 = 161.65.0 : Pushto, c_pkt; # 5 Lincoln CRI
DestPeerAddress & 255.255.0 = 130.123.0 : Pushto, c_pkt; # 6 Massey
DestPeerAddress & 255.255.255 = 192.88.85 : Pushto, c_pkt; # 7 MoRST
DestPeerAddress & 255.255.0 = 161.29.0 : Pushto, c_pkt; # 8 Mt Albert
DestPeerAddress & 255.255.255 = 192.122.171: Pushto, c_pkt; # 9 Nat Lib
DestPeerAddress & 255.255.255 = 192.84.253 : Pushto, c_pkt; # 10 Netway
DestPeerAddress & 255.255.0 = 139.80.0 : Pushto, c_pkt; # 11 Otago
DestPeerAddress & 255.255.0 = 160.4.0 : Pushto, c_pkt; # 12 Ruakura
DestPeerAddress & 255.255.255 = 202.12.76 : Pushto, c_pkt; # 13 Taranaki
DestPeerAddress & 255.255.0 = 130.195.0 : Pushto, c_pkt; # 14 VUW
DestPeerAddress & 255.255.0 = 130.217.0 : Pushto, c_pkt; # 15 Waikato
DestPeerAddress & 255.255.255 = 192.111.102: Pushto, c_pkt; # 16 Wallaceville
DestPeerAddress & 255.255.0 = 140.200.0 : Pushto, c_pkt; # 17 Tuia
DestPeerAddress & 255.0.0 = 253.0.0 : Pushto, c_pkt; # 18 Unconnected
DestPeerAddress & 255.0.0 = 254.0.0 : Pushto, c_pkt; # 19 World
#
src_local:
v1 & 0 = DestPeerAddress: AssignAct, Next;
Null & 0 = 0: Gosub, Tuia_proximal;
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 1 Auckland
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 2 Canterbury
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 3 Gracefield
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 4 Invermay
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 5 Lincoln CRI
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 6 Massey
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 7 MoRST
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 8 Mt Albert
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 9 Nat Lib
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 10 Netway
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 11 Otago
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 12 Ruakura
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 13 Taranaki
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 14 VUW
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 15 Waikato
DestPeerAddress & 255 = 252.0.0 : Pushto, c_pkt; # 16 Wallaceville
DestPeerAddress & 255 = 253.0.0 : Pushto, c_pkt; # 18 Unconnected
DestPeerAddress & 255 = 254.0.0 : Pushto, c_pkt; # 19 World
DestPeerAddress & 255.255 = 140.200: Pushto, c_pkt; # 17 Tuia
Se o origem for de um departamento em Auckland ou de uma rede local, a subrotina Tuia_proximal é chamada para determinar se o destino é de uma rede em Nova Zelândia ou não. Tuia_proximal retorna valores de 1 a 19; para origem local o destino é reduzido para tanto Nova Zelândia (Network 252.0.0.0) ou mundialmente (Network 254.0.0.0), mas para o departamento de Auckland a rede destino (qual é a posição do gateway o qual ele conecta) é retornada sobre uma pilha modelo.
c_pkt:
SourceTransType & 255 = tcp: Pushto, tcp_udp;
SourceTransType & 255 = udp: Pushto, tcp_udp;
SourceTransType & 255 = icmp: Pushto, c_trans_only;
SourceTransType & 255 = ospf: Pushto, c_trans_only;
Null & 0 = 0: GotoAct, t_bad; # Unknown transport type
#
tcp_udp: s_news:
SourceTransAddress & 255.255 = nntp: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = nntp: GotoAct, s_news;
s_smtp:
SourceTransAddress & 255.255 = smtp: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = smtp: GotoAct, s_smtp;
s_domain:
SourceTransAddress & 255.255 = domain: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = domain: GotoAct, s_domain;
s_telnet:
SourceTransAddress & 255.255 = telnet: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = telnet: GotoAct, s_telnet;
s_ftp_ctrl:
SourceTransAddress & 255.255 = ftp: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = ftp: GotoAct, s_ftp_ctrl;
s_ftp_data:
SourceTransAddress & 255.255 = ftpdata: PushtoAct, c_trans_source;
DestTransAddress & 255.255 = ftpdata: GotoAct, s_ftp_data;
#
Null & 0 = 0: GotoAct, t_bad; # 'Unusual' port
#
t_bad: # End of packet testing
SourceTransAddress & 255.255 = 0: PushPkttoAct, Next;
DestTransAddress & 255.255 = 0: PushPkttoAct, Next;
SourceTransType & 255 = 0: CountPkt, 0;
c_trans_source: # SourceTransAddress already pushed
SourceTransType & 255 = 0: CountPkt, 0;
c_trans_only:
SourceTransType & 255 = 0: CountPkt, 0;
As regras que iniciam sobre c_pkt analisam os atributos de transporte do pacote IP, a fim de contar separadamente diferentes tipos de pacotes. Pacote ICMP são analisados para serem contados primeiro. Pacotes de News, Mail, Domain e Telnet são identificados por seus números de porta tanto o origem como destino; tipo transporte não é testado, assim ele pode ser tanto UDP como TCP.
Qualquer pacote que não pertence a uma das categorias de interesse acima, são marcados pelo procedimento t_bad.
# Auckland local nets
#
Auckland_nets:
v1 & 255.255.255.0 = 130.216.1.0 : PushtoAct, A_dept; # Computer Centre
v1 & 255.255.255.0 = 130.216.3.0 : PushtoAct, A_dept; # Auckland DMZ
v1 & 255.255.255.0 = 130.216.5.0 : PushtoAct, A_dept; # Eng Science
v1 & 255.255.255.0 = 130.216.7.0 : PushtoAct, A_dept; # Physics
v1 & 255.255.255.0 = 130.216.11.0 : PushtoAct, A_dept; # Medical School
v1 & 255.255.255.0 = 130.216.12.0 : PushtoAct, A_dept; # Pharmacology
v1 & 255.255.255.0 = 130.216.14.0 : PushtoAct, A_dept; # Commerce
v1 & 255.255.255.0 = 130.216.15.0 : PushtoAct, A_dept; # Mathematics
v1 & 255.255.255.0 = 130.216.21.0 : PushtoAct, A_dept; # Chemistry
v1 & 255.255.255.0 = 130.216.26.0 : PushtoAct, A_dept; # S.B.S.
v1 & 255.255.255.0 = 130.216.33.0 : PushtoAct, A_dept; # Computer Science
v1 & 255.255.255.0 = 130.216.34.0 : PushtoAct, A_dept; # Computer Science
v1 & 255.255.255.0 = 130.216.73.0 : PushtoAct, A_dept; # Law
#
v1 & 255.255.255.0 = 192.156.165.0 : PushtoAct, A_local; # DECUSLINK
v1 & 255.255.255.0 = 192.251.230.0 : PushtoAct, A_local; # CLEARFIELD
v1 & 255.255.255.0 = 202.12.104.0 : PushtoAct, A_local; # DSE
v1 & 255.255.255.0 = 202.12.105.0 : PushtoAct, A_local; # FPNET
v1 & 255.255.255.0 = 202.14.100.0 : PushtoAct, A_local; # STATUS
v1 & 255.255.255.0 = 202.14.102.0 : PushtoAct, A_local; # KCBBS
v1 & 255.255.255.0 = 202.14.216.0 : PushtoAct, A_local; # MANUKAU
v1 & 255.255.255.0 = 202.14.217.0 : PushtoAct, A_local; # MALEFICARUM
v1 & 255.255.255.0 = 202.14.252.0 : PushtoAct, A_local; # NETBLK-CRAYCOM
v1 & 255.255.255.0 = 202.14.253.0 : PushtoAct, A_local; # NETBLK-CRAYCOM
v1 & 255.255.255.0 = 202.14.254.0 : PushtoAct, A_local; # NETBLK-CRAYCOM
#
v1 & 255.255.0.0 = 156.62.0.0 : PushtoAct, A_local; # ATINET
v1 & 255.255.0.0 = 130.216.0.0 : Return, 2; # University of Auckland
#
Null & 0 = 0 : Return, 4; # Not dept or local
#
A_dept:
Null & 0 = 0 : Return, 1; # UofA department
#
A_local:
Null & 0 = 0 : Return, 3; # Auckland local
#
# NZ nets (checked by traceroute from Auckland), Tue 19 Oct 93
#
# 132.160.0.0 PACCOM
# 140.200.0.0 KAWAIHIKO
#
# Class B nets
#
Tuia_proximal: # Auckland B
v1 & 255.255.0.0 = 130.216.0.0 : Return, 1; # AUCKLAND
v1 & 255.255.0.0 = 156.62.0.0 : Return, 1; # ATINET
# Canterbury B
v1 & 255.255.0.0 = 132.181.0.0 : Return, 2; # CANTERBURY
v1 & 255.255.0.0 = 138.75.0.0 : Return, 2; # LINCOLN-LAN-1
v1 & 255.255.0.0 = 153.111.0.0 : Return, 2; # CCCNET2
v1 & 255.255.0.0 = 165.84.0.0 : Return, 2; # CHCHPOLY-NET
. . . . . . . . . . . .
# Class C nets
# Auckland C
v1 & 255.255.255.0 = 192.156.165.0: Return, 1; # DECUSLINK
v1 & 255.255.255.0 = 192.251.230.0: Return, 1; # CLEARFIELD
v1 & 255.255.255.0 = 202.12.104.0 : Return, 1; # DSE
v1 & 255.255.255.0 = 202.12.105.0 : Return, 1; # FPNET
v1 & 255.255.255.0 = 202.14.100.0 : Return, 1; # STATUS
v1 & 255.255.255.0 = 202.14.102.0 : Return, 1; # KCBBS
v1 & 255.255.255.0 = 202.14.216.0 : Return, 1; # MANUKAU
v1 & 255.255.255.0 = 202.14.217.0 : Return, 1; # MALEFICARUM
v1 & 255.255.255.0 = 202.14.252.0 : Return, 1; # NETBLK-CRAYCOM
v1 & 255.255.255.0 = 202.14.253.0 : Return, 1; # NETBLK-CRAYCOM
v1 & 255.255.255.0 = 202.14.254.0 : Return, 1; # NETBLK-CRAYCOM
# Canterbury C
v1 & 255.255.255.0 = 192.73.21.0 : Return, 2; # TUIA-DSIR-1
v1 & 255.255.255.0 = 192.101.16.0 : Return, 2; # CHMEDS
v1 & 255.255.255.0 = 192.122.180.0: Return, 2; # WAIRCNET
. . . . . . . . . . . .
v1 & 255.255.255.0 = 202.20.76.0 : Return, 18; # SANS
v1 & 255.255.255.0 = 202.20.102.0 : Return, 18; # AGCTRL
v1 & 255.255.255.0 = 202.20.103.0 : Return, 18; # AGLINC
v1 & 255.255.255.0 = 202.20.104.0 : Return, 18; # AGGRASS
#
Null & 0 = 0 : Return, 19; # Not an NZ net
FORMAT FlowRuleSet FlowIndex FirstTime " "
SourcePeerType SourcePeerAddress DestPeerAddress " "
SourceTransType SourceTransAddress DestTransAddress " "
ToPDUs FromPDUs " " ToOctets FromOctets;
#
STATISTICS # Collect meter statistics
#
# end of file
A sentença Format especifica os atributos a serem coletados. Este inclui o endereço de transporte, permitindo a análise de tráfego pelo serviço IP. A estatística de desempenho do medidor também será coletada.
# 1705, Thu 9 Feb 95
#
# Rule specification file to tally Local Area Network traffic
#
# Nevil Brownlee, Computer Centre, University of Auckland
#
SET 7
#
RULES
SourcePeerType & 255 = IP: PushtoAct, IP_pkt;
SourcePeerType & 255 = Novell: PushtoAct, Novell_pkt;
SourcePeerType & 255 = EtherTalk: PushtoAct, Apple_pkt;
SourcePeerType & 255 = DECnet: PushtoAct, DEC_pkt;
Null & 0 = 0: Ignore, 0;
#
IP_pkt: # Tally IP traffic by (Class C) subnet
SourcePeerAddress & 255.255.255.0 = 0: PushPktToAct, Next;
DestPeerAddress & 255.255.255.0 = 0: CountPkt, 0;
#
Novell_pkt: # Tally Novell traffic by network number and port
SourcePeerAddress & 255.255.255.255 = 0: PushPktToAct, Next;
DestPeerAddress & 255.255.255.255 = 0: PushPktToAct, Next;
SourceTransAddress & 255.255 = 0: PushPktToAct, Next;
DestTransAddress & 255.255 = 0: PushPktToAct, Next;
SourceTransType & 255 = 0: CountPkt, 0;
#
DEC_pkt:
SourceTransType & 255 = 38: PushtoAct, DEC_hosts;
SourceTransType & 255 = 6: PushtoAct, DEC_hosts;
SourceTransType & 255 = 46: PushtoAct, DEC_hosts;
SourceTransType & 255 = 14: PushtoAct, DEC_hosts;
#
Null & 0 = 0: GotoAct, Next # Tally DECnet non-data packets by type
SourceTransType & 255 = 0: CountPkt, 0;
#
DEC_hosts: # Tally DECnet data by host
SourcePeerAddress & 255.255.255 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255 = 0: CountPkt, 0;
#
Apple_pkt:
SourceTransType & 255 = 3: PushtoAct, Apple_hosts;
Null & 0 = 0: GotoAct, Next # Tally EtherTalk by DDP type
SourceTransType & 255 = 0: CountPkt, 0;
#
Apple_hosts: # Tally EtherTalk data by host
SourcePeerAddress & 255.255.255 = 0: PushPkttoAct, Next;
DestPeerAddress & 255.255.255 = 0: CountPkt, 0;
#
STATISTICS
#
FORMAT FlowRuleSet FlowIndex FirstTime " "
SourcePeerType SourcePeerAddress DestPeerAddress " "
SourceTransType SourceTransAddress DestTransAddress " "
ToPDUs FromPDUs " " ToOctets FromOctets;
#
# end of file
Esta regra mede o tráfego em uma rede local de computadores. Ele tenta marcar cada um dos quatro protocolos pelo tipo transporte a fim de medir a quantidade de fluxo de tráfego para cada um destes. Além disso, fluxo de dados de transporte são marcados por pares de endereço par no qual determina qual par de hosts geram a proporção maior do total de tráfego da rede.
Márcia G. Baltar |