Seletores Gerais :: Admirável Mundo Novo




Muito Bem Vindo

Prezado Leitor, a proposta desse Blog é compartilhar conhecimento com as pessoas que trabalham com Linux, Asterisk, OpenSER, e com tecnologia de voz sobre a rede IP em geral, através de tutoriais, dicas, howto, notícias entre outros assuntos.

Atente para termo de uso do conteúdo do blog no rodapé da página.

sexta-feira, 9 de janeiro de 2009

Seletores Gerais




12.1.2. Seletores Gerais

Seletores gerais definem o padrão, máscara e offset para o qual padrão será conferido o conteúdo do pacote. Usar seletores gerais você pode virtualmente bater qualquer bit único no cabeçalho IP (ou camada superior). Eles são mais difíceis para escrever e ler do que os seletores específicos são descritos abaixo. A sintaxe do seletor geral é:

match [ u32 | u16 | u8 ] PATTERN MASK [ at OFFSET | nexthdr+OFFSET]

Uma das palavras chaves u32, u16 ou u8 especifica o comprimento do padrão em bits. PATTERN e MASK devem seguir do comprimento definido pela palavra chave anterior. O parâmetro OFFSET é o offset, em bytes, para iniciar o batimento. Se a palavra chave nexthdr+ for fornecida, o offset é relativo ao inicio do cabeçalho da camada superior.


Alguns exemplos:

O pacote baterá nessa regra, se o seu ‘time to live’ (TTL) for 64. O TTL é o campo que começa justamente após o oitavo byte do cabeçalho IP.

# tc filter add dev ppp14 parent 1:0 prio 10 u32 \
match u8 64 0xff at 8 flowid 1:4


O exemplo seguinte bate com todos os pacotes TCP que tenha o bit ACK setado:

# tc filter add dev ppp14 parent 1:0 prio 10 u32 \
match ip protocol 6 0xff \
match u8 0x10 0xff at nexthdr+13 flowid 1:3


Use esse para conferir ACK’s nos pacotes menores do que 64 bytes:

## match acks the hard way,
## IP protocol 6,
## IP header length 0x5(32 bit words),
## IP Total length 0x34 (ACK + 12 bytes of TCP options)
## TCP ack set (bit 5, offset 33)
# tc filter add dev ppp14 parent 1:0 protocol ip prio 10 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 1:3


Essa regra baterá somente com pacotes TCP com o bit ACK setado, e sem payload. Aqui nós podemos ver um exemplo de uso de dois seletores, o resultado final será AND lógico dos seus resultados. Se nós examinarmos o diagrama do cabeçalho TCP, veremos que o bit ACK é o segundo bit mais significativo (0x10) no décimo quarto byte do cabeçalho TCP (at nexthdr+13). Quanto ao segundo seletor, se nós gostássemos de tornar nossa vida mais difícil, nós poderíamos escrever ‘match u8 0x06 0xff at 9’ em vez de usar o seletor especifico ‘protocol tcp’, porque 6 é o número do protocolo TCP, presente no décimo byte do cabeçalho IP. Em outras palavras, nesse exemplo nós não pudemos usar qualquer seletor especifico para o primeiro match – simplesmente porque não existe nenhum seletor especifico para bater com os bits ACK do TCP.

O filtro abaixo é uma versão modificada do filtro acima. A diferença é que não ele não verifica o tamanho do cabeçalho ip. Por que? Porque o filtro acima funciona somente em sistemas 32 bits.

tc filter add dev ppp14 parent 1:0 protocol ip prio 10 u32 \
match ip protocol 6 0xff \
match u8 0x10 0xff at nexthdr+13 \
match u16 0x0000 0xffc0 at 2 flowid 1:3


12.1.3. Seletores Específicos

A tabela seguinte contém uma lista de todos os seletores específicos que o autor dessa seção encontrou no código fonte do utilitário tc. Eles simplesmente tornam sua vida mais fácil e melhora a legibilidade da configuração de seu filtro.

CORRIJAM-ME: tabela placeholder – a tabela está em um arquivo separado, selector.html.

CORRIJAM-ME: Ela também está ainda em Polonês 

CORRIJAM-ME: precisa ser colocada no formato sgml.


Alguns exemplos:

# tc filter add dev ppp0 parent 1:0 prio 10 u32 \
match ip tos 0x10 0xff flowid 1:4


CORRIJAM-ME: o match tcp dport não funciona como descrito abaixo:

A regra acima bateria com pacotes que tenham o campo TOS definido como 0x10. O campo TOS começa no segundo byte do pacote e é aquele big byte, assim poderemos escrever um seletor geral equivalente: match u8 0x10 0xff at 1. isso nos permite atingir os internos do filtro U32 – as regras especificas sempre são traduzidas para alguns genéricos, e dessa forma eles são armazenados na memória do kernel.

Isso conduz a uma outra conclusão – os seletores tcp e udp são exatamente a mesmo e isso é o porquê que você não pode usar o seletor único match tcp dport 53 0xffff para bater com pacotes enviados para a porta fornecida – eles também baterão com pacotes UDP enviados a essa porta. Você precisa lembra também de especificar o protocolo e completar com a regra seguinte:

# tc filter add dev ppp0 parent 1:0 prio 10 u32 \
match tcp dport 53 0xffff \
match ip protocol 0x6 0xff flowid 1:2


12.2. O Classificador route

Esse classificador de filtros é baseado nos resultados das tabelas de roteamento. Quando um pacote que está atravessando as classes atinge aquela que é marcada com o filtro “route”, ele divide os pacotes baseado na informação na tabela de roteamento.

# tc filter add dev eth1 parent 1:0 protocol ip prio 100 route

Aqui nós acrescentamos um classificador ‘route’ no nó pai 1:0 com prioridade 100. Quando um pacote alcança esse nó (o que, já que ele é o root, acontecerá imediatamente) consultará a tabela de roteamento. Se o pacote bater, ele será enviado a classe fornecida e terá uma prioridade 100. Então, finalmente para que ele execute a ação, você adiciona a entrada de roteamento apropriado:


O truque aqui é definir ‘realm’ baseado tanto no destino quanto na origem. O caminho para implementá-lo é igual a esse:

# ip route add Host/Network via Gateway dev Device realm RealmNumber


Por exemplo, nós podemos definir nossa rede de destino 192.168.10.0 com número realm 10:

# ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10


Quando adicionando filtros route, nós podemos usar números realm para representar as redes ou os hosts e especificar como as rotas conferem os filtros.

# tc filter add dev eth1 parent 1:0 protocol ip prio 100 \
route to 10 classid 1:10

A regra acima bate com os pacotes entrando na rede 192.168.10.0.

O filtro ‘route’ pode também ser usado para bater com rotas origem. Por exemplo, existe uma sub-rede associada ao roteador Linux na eth2.

# ip route add 192.168.2.0/24 dev eth2 realm 2
# tc filter add dev eth1 parent 1:0 protocol ip prio 100 \
route from 2 classid 1:2


Aqui o filtro especifica que pacotes da sub-rede 192.168.2.0 (realm 2) baterá com o class id 1:2.










Autores Originais dos textos:

Bert Hubert (Netherlabs BV)
bert.hubert@netherlabs.nl

Thomas Graf (Autor de Seção)
tgraf@suug.ch

Gregory Maxwell (Autor de Seção)
greg@linuxpower.cx

Remco van Mook (Autor de Seção)
remco@virtu.nl

Martijn van Oosterhout (Autor de Seção)
kleptog@cupid.suninternet.com

Paul B Schroeder (Autor de Seção)
paulsch@us.ibm.com

Jasper Spaans (Autor de Seção)
jasper@spaans.ds9a.nl

Pedro Larroy (Autor de Seção)
piotr@member.fsf.org








Nenhum comentário:




Creative Commons License
Admirável Mundo Novo: Tudo Sobre Asterisk, OpenSER, Linux e Tecnologias de Voz sobre IP
by Cléviton Mendes de Araújo is licensed under a Creative Commons Atribuição 2.5 Brasil License.