Classificação de pacotes com filtros :: 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.

domingo, 4 de janeiro de 2009

Classificação de pacotes com filtros




9.6. Classificação de pacotes com filtros

Para determinar qual classe deve processar um pacote, o assim chamado ‘encadeamento classificador’ é chamado toda vez que uma escolha precisa ser feita. Esse encadeamento consiste de todos os filtros associados à qdisc classful que precisa decidir.

Para reiterar a árvore, que não é bem uma árvore, é uma árvore de cabeça para baixo:


root 1:
|
_1:1_
/ | \
/ | \
/ | \
10: 11: 12:
/ \ / \
10:1 10:2 12:1 12:2


Quando enfileirando um pacote, cada ramo do encadeamento no filtro é consultado por uma instrução relevante. Uma instalação típica pode ter um filtro em 1:1 que direciona um pacote para 12: e um filtro em 12: que envia o pacote para 12:2.

Você também pode associar essa última regra a 1:1, mas você pode gerar ganho de eficiência fazendo testes mais específicos descendo no encadeamento.

Você não pode filtrar um pacote ‘subindo’, a propósito. Também, com o HTB, você deve associar todos os filtros ao root qdisc!

E novamente – pacotes somente são enfileirados no sentido descendente! Quando eles são removidos da fila, eles ascendem novamente, onde está a interface. Eles NÃO descem do topo da árvore para o adaptador de rede!


9.6.1. Alguns exemplos simples de filtragem

Como explicado no capítulo Classificador, você pode bater literalmente com tudo, usando uma sintaxe mais complicada.

Digamos que tenhamos uma qdisc PRIO chamada ’10:’ que contém três classes, e nós desejamos atribuir todo o tráfego DE e PARA a porta 22 para a banda de prioridade mais elevada, os filtros seriam:

# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \
ip dport 22 0xffff flowid 10:1

# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \
ip sport 80 0xffff flowid 10:1

# tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2


O que essas linhas acima estão dizendo? Elas dizem: amarre um filtro u32 de prioridade 1 a eth0, no nó 10: que bate *exatamente* com a porta 22 do endereço IP destino e os envie a banda 10:1. E ele então repete a mesma coisa para a porta 80 de origem. O último comando diz que todo tráfego que não bateu até esse ponto deve seguir para banda 10:2, a prioridade que é mais próxima da alta.

Você precisa adicionar ‘eth0’, ou qualquer uma de sua interface será chamada, porque cada interface possui um espaço único de nome handles.

Para selecionar um endereço IP, use:

# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \
match ip dst 4.3.2.1/32 flowid 10:1

# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \
match ip src 1.2.3.4/32 flowid 10:1

# tc filter add dev eth0 protocol ip parent 10: prio 2 \
flowid 10:2


Essas linhas de comando atribuem o tráfego PARA 4.3.2.1 e o tráfego DE 1.2.3.4 à fila de prioridade mais alta, e o resto para aquela mais próxima da alta.
Você pode concatenar matches, para bater com o tráfego de 1.2.3.4 e da porta 80, faça:

# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 \
match ip sport 80 0xffff flowid 10:1


9.6.2. Todos os comandos de filtragem que normalmente você precisará

Muitos comandos para tratamento de tráfego apresentados aqui começam com esse preâmbulo:

# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 ..


Esses são os matches ‘u32’, assim chamados, porque podem bater com QUALQUER parte de um pacote.


Quando usar endereço de origem/destino

    Máscara origem ‘'match ip src 1.2.3.0/24’, máscara destino ‘match ip dst 4.3.2.0/24’. Para bater com um único host, use /32, ou omita a máscara.


Quando usar porta de origem/destino, todos os protocolos IP

    Origem: 'match ip sport 80 0xffff', destino: 'match ip dport 80 0xffff'


Quando usar protocolo ip (tcp, udp, icmp, gre, ipsec)

    Use os números que estão no arquivo /etc/protocols, por exemplo, o icmp é 1: 'match ip protocol 1 0xff'.

Quando usar fwmark

    Você pode marcar pacotes tanto pelo ipchains quanto pelo iptables e fazer que essa marca sobreviva através do roteamento entre interfaces. Isso é útil realmente para exemplos de somente tratamento de tráfego com vista ao gerenciamento de banda sobre a eth1 que chega sobre a eth0.


Sintaxe:
# tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1


Observe que isso não é um match u32!


Você pode colocar uma marca igual a:

# iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6


O número 6 é arbitrário.

Se você não desejar entender a sintaxe completa de ‘tc filter’, use apenas o iptables, e aprenda somente a selecionar quando usar fwmark.


Quando usar o campo TOS

    Para selecionar tráfego interativo com atraso mínimo:
    # tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 \
match ip tos 0x10 0xff flowid 1:4


Use 0x08 0xff para o tráfego pesado.

    Para mais comandos relacionado à filtragem, veja o capítulo Filtros Avançados (Advanced Filters).









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.