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
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:
Postar um comentário