Netfilter/Iptables - Parte 1
por
em 11-01-2009 às 15:59 (14449 Visualizações)
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!
Comentários
+ Enviar Comentário