Manual do IPtables - Comentários e sugestões de regras

Tradução do manual do IPtables com alguns comentários, explicações e sugestões de algumas regras.

[ Hits: 76.660 ]

Por: Buckminster em 11/03/2013


Match Extensions (Parte 2)



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.
Linux: Manual do IPtables - Comentários e sugestões de regras
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.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Outras opções / Match Extensions
   3. Match Extensions (Parte 1)
   4. Match Extensions (Parte 2)
   5. Extensões alvo
   6. Diagnósticos / Compatibilidade / Autores
Outros artigos deste autor

Squid - Entendendo um pouco as configurações

Encapsulando BIND 9 e Apache 2 para obter maior segurança

Manual traduzido do Squid

Como um monte de letras de um código fonte transforma-se em voltagens?

Instalação do PAP (PostgreSL, Apache2 e PHP7) no Debian Jessie

Leitura recomendada

Entendendo TCP/IP (Parte 5) - Portas TCP/UDP

Controlando 2 links de internet (roteados) em um gateway Linux com SQUID

NoCatAuth - Construindo um firewall/gateway autenticado

Mandrake Firewall - Firewall com interface amigável

Bloqueando o UltraSurf e o WebMessenger do Hotmail com Proxy Transparente

  
Comentários
[1] Comentário enviado por danniel-lara em 11/03/2013 - 19:59h

Parabéns ,
Ficou Bagual mesmo o Artigo
já esta nos favoritos , assim o dia que vir um Manolo querendo saber sobre Iptables
já tenho uma boa referencia de leitura para o vivente

[2] Comentário enviado por Buckminster em 11/03/2013 - 20:35h

Obrigado, tchê!

[3] Comentário enviado por l0g1in em 12/03/2013 - 01:16h

Parabéns ficou massa, tudo bem explicadinho e de facil compreensão belo manual e parabéns por disponibilizar seu tempo e seu conhecimento para galera do VOL, o mundo Software Livre agradece! [];

[4] Comentário enviado por Buckminster em 12/03/2013 - 02:14h

Grato. Estamos aí, fuçando no Linux.

[5] Comentário enviado por cruzeirense em 12/03/2013 - 10:37h

Parabens cara! Algo muito útil...

[6] Comentário enviado por Buckminster em 12/03/2013 - 15:41h

Grato. Estamos aí.

[7] Comentário enviado por Roger86 em 12/03/2013 - 18:07h

Muito bom !!! Parabéns.

[8] Comentário enviado por Buckminster em 13/03/2013 - 12:58h


[7] Comentário enviado por Roger86 em 12/03/2013 - 18:07h:

Muito bom !!! Parabéns.


Obrigado.

[9] Comentário enviado por phrich em 15/03/2013 - 16:48h

Excelente artigo!

[10] Comentário enviado por Buckminster em 15/03/2013 - 23:41h


[9] Comentário enviado por phrich em 15/03/2013 - 16:48h:

Excelente artigo!


Obrigado.


[11] Comentário enviado por Tacioandrade em 02/04/2013 - 13:42h

Parabéns pelo artigo, esse guia ficou simplificado, porem bem completo e explicativo, serve muito bem como um guia de bolso. =D


Sucesso.

[12] Comentário enviado por Buckminster em 02/04/2013 - 14:54h


[11] Comentário enviado por Tacioandrade em 02/04/2013 - 13:42h:

Parabéns pelo artigo, esse guia ficou simplificado, porem bem completo e explicativo, serve muito bem como um guia de bolso. =D


Sucesso.


Obrigado. A intenção foi essa mesma.

[13] Comentário enviado por IgorBruttal em 24/08/2013 - 06:58h

Muito bom, parabéns!

[14] Comentário enviado por elsonsantos em 28/08/2013 - 21:40h

Prezados,

Estou com o seguinte problema. Tenho um firewall configurado, controlando um rede da seguinte forma:

eth0 recebe internet
eth1 distribui a internet já filtrada e com squid (nao transparente)

A empresa mudou agora para um empresa de internet que interligou as 4 filiais e a matriz. O que acontece é que recebemos a internet através de um roteador dessa empresa pela porta 1 do roteador e a 2 faz a comunicação das outras 7.4 redes.
O que eu fiz foi ligar essa porta 1 na eth0 do meu firewall e coloquei a eth1 para a porta 2 do roteador da empresa de internet para que pegue as regras de meu firewall com squid.
Essa empresa pediu para que eu fizesse as regras corretamente pois o meu firewall que vai distribuir a net para as outras redes.

lá esta assim

chega o ip válido 177.x.x.x que vai na etho do firewall
sai 172.16.16.x na eth1 para a porta 2 do roteador da empresa. Essa porta 2 comunica com as demais redes:

filial1 172.16.17.x
filial2 172.16.18.x
filial3 172.16.18.x

Como faço o firewall controlar essas redes e compartilhar a internet. A intenção é que essas redes conversem entre si e respeitem as regras do proxy.

acho que é isso!!!

[15] Comentário enviado por Buckminster em 27/09/2013 - 02:24h


[14] Comentário enviado por elsonsantos em 28/08/2013 - 21:40h:

Prezados,

Estou com o seguinte problema. Tenho um firewall configurado, controlando um rede da seguinte forma:

eth0 recebe internet
eth1 distribui a internet já filtrada e com squid (nao transparente)

A empresa mudou agora para um empresa de internet que interligou as 4 filiais e a matriz. O que acontece é que recebemos a internet através de um roteador dessa empresa pela porta 1 do roteador e a 2 faz a comunicação das outras 7.4 redes.
O que eu fiz foi ligar essa porta 1 na eth0 do meu firewall e coloquei a eth1 para a porta 2 do roteador da empresa de internet para que pegue as regras de meu firewall com squid.
Essa empresa pediu para que eu fizesse as regras corretamente pois o meu firewall que vai distribuir a net para as outras redes.

lá esta assim

chega o ip válido 177.x.x.x que vai na etho do firewall
sai 172.16.16.x na eth1 para a porta 2 do roteador da empresa. Essa porta 2 comunica com as demais redes:

filial1 172.16.17.x
filial2 172.16.18.x
filial3 172.16.18.x

Como faço o firewall controlar essas redes e compartilhar a internet. A intenção é que essas redes conversem entre si e respeitem as regras do proxy.

acho que é isso!!!


Cria uma VPN entre as redes e depois tendo os servidores pingando as estações da rede remota através da VPN, faça o masquerade via Iptables da matriz para as filais.

Mais ou menos assim:

iptables -t nat -A POSTROUTING -s 172.16.16.0/xx -o tun0 -j MASQUERADE << Iptables Matriz


Depois libera a comunicação no FORWARD do servidor da Matriz e Filiais


Iptables Matriz:

iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.17.0/xx -j ACCEPT
iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.18.0/xx -j ACCEPT
iptables -A FORWARD -s 172.16.16.0/xx -d 172.16.19.0/xx -j ACCEPT

iptables -A FORWARD -s 177.x.x.0/xx -d 172.16.16.0 -p icmp -j ACCEPT

Iptables Filiais (essas duas regras abaixo você coloca em cada Iptables das filiais mudando os endereços de rede para cada filial):

iptables -A FORWARD -s 172.16.17.0/xx -d 172.16.16.0/xx -j ACCEPT
iptables -A FORWARD -s 177.x.x.0/xx -d 172.16.17.0/xx -p icmp -j ACCEPT

É mais ou menos isso. De repente você precise acrescentar uma regra ou outra, mas acredito que assim já dá para você ter uma boa idéia.

E como teu Squid não é transparente é só setar o proxy da matriz nos navegadores e redirecionar para ele no servidor da matriz com Iptables.

[16] Comentário enviado por removido em 18/11/2013 - 14:46h

òtima referência, parabéns, grande trabalho. Um ótimo link para responder a preguiçosos no fórum.

[17] Comentário enviado por Buckminster em 30/11/2013 - 01:19h


[16] Comentário enviado por tropper em 18/11/2013 - 14:46h:

òtima referência, parabéns, grande trabalho. Um ótimo link para responder a preguiçosos no fórum.


Obrigado.

[18] Comentário enviado por alysonpires em 05/12/2013 - 05:01h

Tu é o cara! Parabéns novamente!

[19] Comentário enviado por Buckminster em 16/12/2013 - 13:10h


[18] Comentário enviado por alysonpires em 05/12/2013 - 05:01h:

Tu é o cara! Parabéns novamente!


Obrigado!

[20] Comentário enviado por Kalang0o em 01/01/2014 - 11:01h

Buckminster,

Grato por compartilhar seu conhecimento, este material é uma excelente fonte de pesquisa e você está contribuindo para o aprendizado não só do pessoal daqui do VOL, mas também da galáxia inteira. Depois que o google inventou o "google tradutor", este artigo será visitado até pelo pessoal de outros planetas =].

Valeu !!!

[21] Comentário enviado por Buckminster em 10/01/2014 - 10:48h


[20] Comentário enviado por Kalang0o em 01/01/2014 - 11:01h:

Buckminster,

Grato por compartilhar seu conhecimento, este material é uma excelente fonte de pesquisa e você está contribuindo para o aprendizado não só do pessoal daqui do VOL, mas também da galáxia inteira. Depois que o google inventou o "google tradutor", este artigo será visitado até pelo pessoal de outros planetas =].

Valeu !!!


Obrigado.

O Google Tradutor é uma ótima ferramenta. Eu uso sempre quando estou com preguiça de traduzir um texto grande, depois é só ajeitar algumas coisas na tradução.


Contribuir com comentário