tos :: Este módulo corresponde ao tipo de 8 bits do campo service no cabeçalho IPv4 (ou seja, incluindo o "precedence" bits) ou o campo priority (também de 8 bits) no cabeçalho IPv6.
- [!] --tos value[/mask] :: Combina pacotes com o valor ToS dado. Se a máscara for especificada, é logicamente anded com a marca tos antes da comparação.
- [!] --tos symbol :: Você pode especificar um nome simbólico ao usar a partida tos para IPv4. A lista de nomes reconhecidos tos pode ser obtidas chamando iptables com -m tos -h. Note que isto implica uma máscara de 0x3f, ou seja, todos os bits ecn.
Nota do tradutor: ao utilizar ToS, podemos estabelecer prioridades dos pacotes pelo tipo de serviço, por exemplo, SSH, com isso o ToS torna-se uma forma eficiente de controle de prioridade sobre o tráfego de entrada e saída da sua rede.
Exemplo de uma regra:
# iptables -t mangle -a output -o eth0 -p tcp --dport 22 tos --set-tos 16
Esta regra define que os pacotes emitidos (chain output da tabela mangle saindo pela eth0 na porta 22, porta padrão do SSH) pela máquina através do protocolo SSH terão prioridade sobre os demais pacotes. O número 16 significa "espera mínima" (minimize-delay) e refere-se ao bit ToS.
Porém, o ToS não substitui o QoS do roteador. É sempre preferível utilizar o QoS do roteador.
ttl :: Este módulo corresponde ao campo tempo de vida no cabeçalho IP.
- --ttl-eq ttl :: Corresponde ao valor dado TTL.
- --ttl-gt ttl :: Corresponde se TTL é maior do que o valor dado TTL.
- --ttl-lt ttl :: Combina se TTL é menor do que o valor ttl dado.
u32 :: Testa se as quantidades de até 4 bytes extraídos de um pacote tem valores especificados. A especificação do que extrair geralmente é suficiente para localizar dados em deslocamentos de cabeçalhos TCP ou cargas.
- [!] --u32 tests :: O argumento equivale a um programa em linguagem pequena descrito abaixo.
- tests := location "=" value | tests "&&" location "=" value
- value := range | value "," range
- range := number | number ":" number
Um único número, n, é interpretado como n:n. O intervalo n:m é interpretado como o intervalo de números de > = n e <= m.
- location := number | location operator number
- operator := "&" | "<<" | ">>" | "@"
Os operadores &, <<, >> e && significam o mesmo que na linguagem C. O "=" é realmente um operador de membro de um conjunto e o valor da sintaxe descreve um conjunto. O operador "@" é o que permite mover-se para o próximo cabeçalho e está descrito mais abaixo.
Existem atualmente alguns limites artificiais na implementação do tamanho dos testes:
- Não mais do que 10 de "=" (e 9 "&&" s) no argumento u32.
- Não mais de 10 faixas (e 9 vírgulas) por valor.
- Não mais de 10 números (e 9 operadores) por localização.
Para descrever o significado, existem três registros:
- "a" é do tipo char *, inicialmente, o endereço do cabeçalho IP
- "b" e "c" são integer de 32 bits unsigned, iniciando em zero.
As instruções são:
number b = number;
c = (*(a+b)<<24) + (*(a+b+1)<<16) + (*(a+b+2)<<8) + *(a+b+3)
&number c = c & number
<< number c = c << number
>> number c = c >> number
@ número a = a + c, em seguida, fazer o número da instrução
Qualquer acesso de memória fora de [skb-> data, skb-> end] faz com que dê falha. Caso contrário, o resultado do cálculo é o valor final de c.
Espaço em branco é permitido, mas não exigido. Entretanto, a sintaxe é semelhante ao shell, por isso é uma boa ideia colocar os argumentos entre aspas.
Exemplo:
Coincidir com pacotes IP com tamanho total >= 256
O cabeçalho IP contém um campo de tamanho total em bytes 2-3.
--u32 "0 & 0xffff = 0x100:0xffff"
Leia bytes 0-3
E que, com 0xffff (dando bytes 2-3), e testar se que esteja no intervalo [0x100: 0xffff].
Exemplo (mais realista, portanto, mais complicado):
Coincidir com pacotes ICMP com ICMP tipo 0
Primeiro teste que é um pacote ICMP, byte verdadeira se 9 (protocol) = 1
--u32 "6 & 0xff = 1 && ...
Leia bytes 6-9, utilize & para jogar fora bytes 6-8 e comparar o resultado a 1. Teste seguinte, que não é um fragmento (se assim for, pode ser parte de um tal pacote, mas nem sempre podemos contar). Nota: este teste é geralmente necessário se você quiser combinar qualquer coisa além do cabeçalho IP. Os últimos 6 bits do byte 6 e todos byte 7 são 0, se for um pacote completo (não de um fragmento). Alternativamente, você pode permitir primeiros fragmentos apenas testando os últimos 5 bits do byte 6.
... 4 & 0x3fff = 0 && ...
Último teste: o primeiro byte após o cabeçalho IP (do tipo) é 0. Aqui temos que usar a sintaxe @. O tamanho do cabeçalho IP (ihl), de 32 bits, é armazenado na metade direita do byte 0 do cabeçalho do IP.
... 0 >> 22 & 0x3c @ 0 >> 24 = 0"
O primeiro 0 significa ler bytes de 0-3; >> 22 significa mudança de 22 bits para a direita. Deslocando 24 bits daria o primeiro byte, portanto, apenas 22 bits são quatro vezes mais que alguns bits. & 3c, em seguida, elimina os dois bits extras no lado direito e os quatro primeiros bits do primeiro byte. Por exemplo, se ihl = 5, então o cabeçalho IP tem 20 (4 x 5) bytes. Neste caso, os bytes 0-1 são (em binário) xxxx0101 yyzzzzzz, >> 22 dá o valor de 10 bits xxxx0101yy e &3c proporciona 010100. @ significa usar esse número como um novo deslocamento para o pacote e lê quatro bytes. Estes são os primeiros 4 bytes do ICMP payload, dos quais o byte 0 é do tipo ICMP. Portanto, nós simplesmente transferimos o valor 24 para a direita do primeiro byte e comparamos o resultado com 0.
Exemplo:
bytes de carga útil de TCP 8-12 é qualquer um de 1, 2, 5 ou 8
Primeiro, testar se o pacote é um pacote TCP (semelhante ao ICMP).
--u32 "6 & 0xff = 6 && ...
Em seguida, teste que não é um fragmento (o mesmo que acima).
... 0 >> 22 & 0x3c @ 12 >> 26 & 0x3c @ 8 = 1,2,5,8"
0 >> 22 & 3c acima calcula o número de bytes no cabeçalho IP. @ faz novo deslocamento para o pacote, que é o início do cabeçalho do TCP. O tamanho do cabeçalho do TCP (32 bits) é a metade esquerda do byte 12 do cabeçalho de TCP. A instrução >> 12 26 3c & computa esse tamanho em bytes (semelhante ao cabeçalho IP de antes). "@" faz novo deslocamento, o qual é o começo da carga de TCP. Finalmente, o número 8 lê os bytes 8-12 dos controles de carga útil e compara se o resultado é 1, 2, 5 ou 8.
udp :: Estas extensões podem ser utilizados, se '--protocol udp' estiver especificado. Ele oferece as seguintes opções:
- [!] --source-port,--sport port[:port] :: Porta de origem ou especificação de intervalo de portas. Consulte a descrição da opção --source-port da extensão TCP para mais detalhes.
- [!] --destination-port,--dport port[:port] :: Porta de destino ou especificação de intervalo de portas. Consulte a descrição da opção --destination-port da extensão TCP para mais detalhes.
unclean :: Este módulo tem nenhuma opção, mas tenta combinar pacotes que parecem mal formados ou incomuns. Está em fase de teste.