Ver Feed RSS

The JEdi lair's

Netfilter/Iptables - Parte 1

Avaliação: 3 votos, 4,67 média.
Bom dia galera, uma breve introdução sobre minha pessoa e depois o que interessa de verdade!

Sou usuário GNU/Linux desde 1998 e venho dedicado meu tempo ao estudo de segurança da informação. Atualmente atuo como administrador de segurança de redes. Pronto!

Vejo que um assunto muito comum no UnderLinux Forums é Netfilter/Iptables. Vou tentar esclarecer um pouco sobre o assunto nesse primeiro post. Não pretendo criar um guia definitivo, porém quem tiver palpites sobre melhora do conteúdo do post por favor me envie.

1 - Mais do que breve conceito do Netfilter/Iptables

O Netfilter/Iptables é o filtro de pacotes padrão do kernel GNU/Linux desde as versões 2.4. Por filtro de pacotes entendemos um mecanismo que faz a verificação dos cabeçalhos TCP/IP dos pacotes de rede e toma decisão em relação ao seu conteúdo. Alguns módulos adicionam funcionalidades relacionadas as camadas mais altas, L7 por exemplo, porém esse não é a utilização mais adequada de um filtro de pacotes.

O funcionamento do Netfilter/Iptables é dividido em chains, tables, matches e targets.

2 - Tables
As tables determinam que tipo de decisão será feita nos pacotes. Exemplificando, a table mangle, da qual falarei mais detalhadamente, pode alterar o conteúdo dos pacotes enquanto a tabela filter pode somente tomar decisões quanto a passagem ou não do pacote através do sistema de filtro.

O Netfilter/Iptables trabalha com quatro tabelas distintas, a saber:

filter: Essa tabela é utilizada para tomada de decisão quanto a passagem ou não de um pacote através do filtro. Essa é a tabela padrão.

nat: Essa tabela é consultada quando um pacote que cria uma nova conexão, seja de entrada ou saída, é encontrado. Esta é a tabela usada para "compatilhar a conexão" e/ou "rotear os pacotes".

mangle: Essa tabela poder realizar alterações especiais de forma a auxiliar os mecanismos de filtro de pacotes, fair queueing e packet routing.

raw: Esta tabela é usada, principalmente, para configurar excessões no mecanismo de connection tracking do kernel (ativado através do módulo ip_conntrack).

A ordem de avaliação das tabelas é a seguinte:

raw ->> mangle ->> nat ->> filter

Agora surge o questionamento: tá, e como eu faço a tomada de decisões? Calma!

3 - Chains
As chains são usadas para o controle de fluxo dos pacotes dentro das tabelas, por exemplo entrada na filter, saída na nat, etc. Existem cinco chains principais:

INPUT (mangle, filter)
Essa chain é utilizada para verificar pacotes destinados a máquina filtro de pacotes.

OUTPUT (raw, mangle, nat, filter)
Essa chain é utilizada para verificar pacotes originados da máquina filtro de pacotes.

FORWARD (mangle, filter)
Essa chain é utilizada para verificar pacotes que irão atravesar duas interfaces de rede.

PREROUTING (raw, mangle, nat)
Essa chain é utilizada para verificar pacotes destinados a máquina filtro de pacotes mas com foco na tomada de decisão de roteamento tais como o redirecionamento dos pacotes. Todos os pacotes de entrada são verificados pelas regras desta chain antes de passar pela avaliação da chain INPUT.

POSTROUTING (mangle, nat)
Essa chain é utilizada para verificar pacotes que tem como endereço uma rede diferente de sua rede de origem. Tentando esmiuçar, quando um cliente dentro de uma rede local tenta acessar o conteúdo da Internet através da máquina filtro de pacotes (gateway).

4 - Comandos
Bem, o comando básico para o uso da userspace tool Netfilter/Iptables é o iptables!!! Incrível!!! O iptables possui os seguintes comandos:

-t ou --table table
Especifica a tabela a qual desejamos utilizar. Por padrão, se o -t não for especificado, a tabela filter será usada.

-L ou --list [chain]
Exibe as regras presentes em todas as chains, caso não seja especificado uma chain. Podemos utilizar os modificadores --line-numbers (exibe o número da regra), -v ou --verbose (modo verbose), -n ou --numeric (todas as informações são exibidas em formato númerico) e -x ou --exact (todos os valores serão exibidos em bytes).

ex: iptables -t nat -L
|
\-> Lista todas as regras presentes nas chains da tabela nat

ex: iptables -t mangle -L OUTPUT
|
\-> Lista todas as regras presentes na chain OUTPUT da tabela mangle.

-F ou --flush [chain]
Apaga todas as regras de todas as chains ou uma chain específica.

ex: iptables -F
|
\-> Apaga todas as regras de todas as chains da tabela filter (Lembre-se: tabela filter é padrão!).

ex: iptables -t nat -F PREROUTING
|
\-> Apaga todas as regras da chain PREROUTING da tabela nat.

-Z ou --zero [chain]
Zera os contadores de bytes de todas as chains ou de uma chain específica.

ex: iptables -t mangle -Z FORWARD
|
\-> Zera os contadores da chain forward da tabela mangle.

ex: iptables -t raw -Z
|
\-> Zera os contadores de todas as chains da tabela raw.

-N ou --new-chain new-chain
Cria uma chain definida pelo usuário. A nova chain não pode ter o mesmo nome de um target ou target extension. Posteriormente falaremos de chains definidas pelo usuário.

-X ou --delete-chain [chain]
Apaga todas as chains definidas pelo usuário ou uma chain específica.

ex: iptables -X
|
\-> Apaga todas as chains definidas pelo usuário na tabela filter.

ex: iptables -t nat -X banidos
|
\-> Apaga a chain banidos da tabela nat.

obs: As chains precisam estar vazias (-F)!

-A ou --append chain [regra]
Adiciona uma regra no final de uma chain.

ex: iptables -A INPUT
|
\-> Adiciona regra vazia após a ultima regras presente na chain INPUT da tabela filter.

-I ou --insert chain [numregra] [regra]
Adiciona uma regra no inicio da chain ou na posição especificada por numregra.

ex: iptables -t mangle -I INPUT 1
|
\-> Adiciona regra vazia na posição 1 da chain INPUT da tabela mangle.

obs: As regras posteriores a numregra serão alocadas na próxima posição.

-R ou --replace chain numregra regra
Repõe a regra presente em numregra com regra.

ex: iptables -t raw -R OUTPUT 3
|
\-> Repõe a regra presente na terceira posição da chain OUTPUT da tabela raw com uma regra nula.

-D ou --delete chain regra
-D ou --delete chain numregra
Apaga a regra que contém regra ou a regra na posição numregra.

ex: iptables -D INPUT
|
\-> Apaga uma regra nula da chain INPUT da tabela filter.

ex: iptables -t mangle -D FORWARD 4
|
\-> Apaga a regra presente na quarta posição da chain FORWARD da tabela mangle.

-P ou --policy chain target
Define o policiamento padrão de uma chain. Apenas as chains padrões podem ter policiamento. Na secção targets veremos quais os targets válidos para policiamento.

5 - Parâmetros
Bom pessoal, na secção anterior tentei trabalhar com regras nulas para não atropelar a explicação dos parâmetros. Parâmetros são os mecanismos usados para verificar o conteúdo dos cabeçalhos dos pacotes. Além dos parâmetros existem as match extensions que adicionam funcinalidades ao Netfilter/Iptables porém dedicarei uma secção exclusiva nesse post para explica-las.

-p, --protocol [!] proto
Verifica o protocolo do pacote. Os valores aceitos para proto são tcp, udp, icmp ou all.

ex: iptables -t raw -A PREROUTING -p tcp
|
\-> Essa regra irá conferir com todos os pacotes que passarão pelo firewall que utilizem o protocolo TCP.

ex: iptables -A INPUT -p ! icmp
|
\-> Essa regra irá conferir com todos os pacotes que estão entrando no filtro de pacotes que não utilizam o protocolo ICMP. ! significa não!

-s ou --source ou --src [!] origem
Verifica a origem do pacote.

ex: iptables -t mangle -I FORWARD -p udp -s 192.168.0.1
|
\-> Essa regra irá conferir com os pacotes atravesando duas interfaces de rede através do protocolo udp e que tenha como origem o endereço 192.168.0.1.

ex: iptables -t nat -A PREROUTING -p icmp -s 10.1.0.0/16
|
\-> Essa regra irá conferir com os pacotes chegando numa interface de rede através do protocolo ICMP e que tenha como origem a rede 10.1.0.0 com máscara de sub-rede 255.255.0.0.

-d ou --destination ou --dst [!] destino
Verifica o destino do pacote.

ex: iptables -A FORWARD -s 10.1.0.2 -d 192.168.55.1
|
\-> Essa regra irá conferir com todos os pacotes atravesando o filtro de pacotes com origem do host 10.1.0.2 e destino 192.168.55.1

ex: iptables -t nat -A POSTROUTING -d 192.168.100.0/24
|
\-> Essa regra irá conferir com todos os pacotes que tentarão deixar a rede através do filtro de pacotes com destino a rede 192.168.100.0 com máscara de sub-rede 255.255.255.0.

-i ou --interface
Verifica a interface na qual o pacote foi recebido. Essa match só existe nas chains INPUT, FORWARD, PREROUTING e em chains criadas pelo usuário.

ex: iptables -t nat -A PREOUTING -i ppp0 -s 192.168.25.25
|
\-> Essa regra irá conferir com pacotes que chegam ao filtro através da interface ppp0 e que tenham como host de origem 192.168.25.25.

ex: iptables -A INPUT -p udp -i eth+
|
\-> Essa regra irá conferir com todos os pacotes destinados ao filtro de pacotes que tenham como interfaces de entrada eth0, eth1, ... , ethN, ou seja todas as interfaces prefixadas por eth.

Por equanto é só...
Continua no próximo post... Limitação de 10000 caracteres!
Categorias
Não Categorizado

Comentários

Página 1 de 2 12 ÚltimoÚltimo
  1. Avatar de benezinha
    Olá,

    Parabens pela iniciativa. Excelente material!
  2. Avatar de PEdroArthurJEdi
    Muito obrigado!
  3. Avatar de Duca
    Putz!
    Muito bom!
    Para não ter limitação de caracteres é só usar o wiki.
    Logo, eu irei colocar seu Tutorial lá.
    Parabéns mesmo!
  4. Avatar de Magnun
    Muito bom cara... É por iniciativas como essa que o Under-Linux cresce cada dia mais!
    Parabéns!!
  5. Avatar de MarcusMaciel
    Duca acho que a limitacao é boa pra nao ficar muito extenso o artigo... Sobre o Wiki o objetivo dele é colocar artigos já existentes para que possam ser completados por outras pessoas. Pois sempre existem lacunas a serem completadas
  6. Avatar de PEdroArthurJEdi
    @Duca

    Pô cara, o que eu gosto aqui nos blogs é a possibilidade de se usar drafts... Esses quatro posts eu venho produzindo desde novembro de 2008. Um assunto muito extenso e precisa ler a documentação pra entender melhor e não falar besteira.

    A verdadeira iniciativa seria tentar conscientizar a galera que o trabalho de documentação leva ao aprendizado. Imagina o quanto eu aprendi sobre o Netfilter/iptables para criar os textos.

    @Magnun

    Complementando o que citei acima, uma da etapas do aprendizado é o repasse. Devemos aproveitar melhor os espaços dos fóruns, dos wikis, dos blogs, seja lá o que for, para disseminar o conhecimento. O que seria da ciÊncia se grandes pesquisadores do passado não tivessem a preocupação de repassar seus conhecimentos? Será que estariamos a milhas de distância discutindo Linux e software livre?
  7. Avatar de Duca
    @Scorpion

    Concordo com a limitação.

    @PEdroArthurJEdi

    A idéia do wiki, é justamente essa que o Scorpion disse. Contudo, é bom colocar os tutoriais aqui postados no wiki, pois existirá mais uma referência e o bom do wiki (minha opinião) é que fica bem formatado.
    Você pode continuar postando seus tutoriais aqui no blog, que estes serão copiados para o wiki também.
    A idéia do Under-wiki, é transformá-lo no nosso centro de documentação.

    E parabéns pelo trabalho, se todo portal tivesse usuários como você a qualidade destes subiriam e muito.
    E graças as Deus, Alá e Buda, temos muitos no Under.
    Ab, Duca.
    Atualizado 12-01-2009 em 11:23 por Duca
  8. Avatar de Duca
    E que a Força esteja conosco!
  9. Avatar de netscaper
    magavilhindilhoso !!
  10. Avatar de jacksonezidio
    Cara vc ta de parabens pela excelente iniciativa, a comunidade agradece...
Página 1 de 2 12 ÚltimoÚltimo

+ Enviar Comentário