Curso ministrado pelo Centro de Difusão de Tecnologia e Conhecimento no período de 27 Nov a 03 Dez 2006.
Copyright (c) 2005, Centro de Difusão de Tecnologia e Conhecimento. É dada permissão para copiar, distribuir e/ou modificar este curso sob os termos da Licença de Documentação Livre GNU, Versão 1.1 públicada pela Free Software Foundation com a Seção Invariante Sobre o CDTC. Uma cópia da licença está inclusa na seção entitulada ¨Licença de Documentação Livre GNU¨.
O projeto Netfilter/Iptables foi iniciado em 1998 por Rusty Russel, que também é autor do projeto predecessor, Ipchains. Com o crescimento do projeto ele fundou o Netfilter Core Team (ou simplesmente coreteam) em 1999. O software criado por eles foi licenciado sob os termos da GPL (GNU Public License) e incorporado ao kernel do Linux em março do ano 2000.
O Firewall é um programa que tem como objetivo proteger a máquina contra acessos indesejados, tráfego indesejado, proteger serviços que estejam rodando na máquina e bloquear a passagem de coisas que você não deseja receber (como conexões vindas da Internet para sua segura rede local, evitando acesso aos dados corporativos de uma empresa ou a seus dados pessoais).
Antes do Iptables, o software predominante para a criação de firewalls no Linux era o Ipchains nos kernels do Linux da série 2.2 e o Ipfwadm nos da série 2.0, que por sua vez foi baseado no Ipfw dos BSDs.
Firewall filtro de pacotes
O Firewall filtro de pacotes possui a capacidade de analisar cabeçalhos (headers) de pacotes enquanto os mesmos trafegam. Mediante esta análise, que é fruto de uma extensa comparação de regras previamente adicionadas, pode decidir o destino de um pacote como um todo.
A filtragem pode, então, deixar tal pacote trafegar livremente pela rede ou simplesmente parar sua trajetória, ignorando-o por completo. O mesmo é, sem dúvida, a classe mais utilizada de Firewall e não aplicar seus conceitos é deixar as portas abertas e permitir a livre circulação de pacotes não confiáveis por sua rede.
Um Firewall filtro de pacotes em sua rede lhe fornecerá controle, segurança e vigilância.
Firewall NAT
Um firewall aplicado à classe NAT, a princípio, possui o objetivo de manipular a rota padrão de pacotes que atravessam o kernel do host Firewall aplicando-lhes o que conhecemos por "tradução de endereçamento". Isso lhe agrega diversas funcionalidades dentro deste resumido conceito como, por exemplo, a de manipular o endereçamento de origem (SNAT) e destino (DNAT) dos pacotes, tal como realizar o que conhecemos como "mascaramento" (Masqueranding) sobre conexões PPP, entre outras potencialidades.
Um firewall NAT pode, por exemplo, realizar o trabalho de um proxy de forma simples e eficiente, independentemente do IP. Veremos estas potencialidades citadas, com mais detalhes, posteriormente.
Netfilter/Iptables
O Netfilter é um conjunto de situações de fluxo de dados agregadas ao kernel do linux e dividido em tabelas. Sob uma ótica mais prática, podemos ver o Netfilter como um grande banco de dados que contém em sua estrutura 3 tabelas padrões: Filter, Nat e Mangle. Cada uma destas tabelas contém regras direcionadas a seus objetivos básicos. A tabela Filter, por exemplo, guarda todas as regras aplicadas a um Firewall filtro de pacotes; a tabela Nat as regras direcionadas a um Firewall Nat e a Mangle à funções mais complexas de tratamento de pacote como o TOS. Todas as tabelas possuem situações de fluxo (entrada, saída, redirecionamento, etc.) que lhes proporcionam a realização de seus objetivos.
O Iptables trata-se, na verdade, de uma ferramenta a nível de usuário para a manipulação das tabelas do Netfilter, embora o mesmo seja frequentemente confundido com um Firewall por si só. Ele é uma versão mais robusta, completa e estável que seus antecessores Ipfwadm e Ipchains, dos kernels do Linux 2.0 e 2.2 respectivamente.
Como principais características, o Iptables (além de realizar suas tarefas de forma veloz, eficaz e econômica, tanto no aspecto financeiro quanto no de requerimento de hardware) nos dá um amplo leque de possibilidades tais como a implementação desde filtros de pacotes, utilizando a tabela Filter, a NAT via tabela NAT e mais controles avançados como o desenvolvimento de QOS sobre o tráfego, suporte à SNAT e DNAT, redirecionamento de endereçamento e portas, mascaramento de conexões, detecção de fragmentos, monitoramento de tráfego, TOS, bloqueio de ataques, scanners ocultos, pings da morte e muito mais. E além disso tudo, ainda podemos utilizar módulos externos ampliando ainda mais o nosso leque de funcionalidades.
Os requerimentos básicos para o funcionamento do Iptables são um computador sobre a arquitetura 386 com, no mínimo, 4MB de RAM e obviamente, um kernel da série 2.4 ou superior.
O Iptables é composto dos seguintes aplicativos:
Iptables: Aplicativo principal do pacote iptables para protocolos ipv4.
Ip6tables: Aplicativo principal do pacote iptables para protocolos ipv6.
Iptables-save: Aplicativo que salva todas as regras, para protocolos ipv4, inseridas na sessão ativa e também em um determinado arquivo informado pelo administrador do Firewall.
Ip6tables-save: Aplicativo que salva todas as regras, para protocolos ipv6, inseridas na sessão ativa e também em um determinado arquivo informado pelo administrador do Firewall.
Iptables-restore: Aplicativo que restaura todas as regras, para protocolos ipv4, salvas pelo software Iptables-save.
Ip6tables-restore: Aplicativo que restaura todas as regras, para protocolos ipv6, salvas pelo software Ip6tables-save.
A Tabela Filter
A tabela Filter é a tabela padrão do Netfilter/Iptables e trata das situações (chains) implementadas por um Firewall filtro de pacotes.
Estas situações são:
INPUT: Todos os pacotes que entram no host.
FORWARD: Todos os pacotes que entram no host, mas que devem ser redirecionados à um host secundário ou outra interface de rede.
OUTPUT: Todos os pacotes que saem do host.

A Tabela NAT
A tabela NAT é a tabela que implementa funções de NAT (Network Address Translation) ao host Firewall. O Nat por sua vez, possui diversas utilidades, conforme abordado anteriormente.
Suas situações (chains) são:
PREROUTING: É utilizada quando há necessidade de se fazer alterações em pacotes antes que os mesmos sejam roteados.
OUTPUT: Trata os pacotes emitidos pelo host Firewall.
POSTROUTING: Utilizado quando há necessidade de se fazer alterações em pacotes após o tratamento de roteamento.

A Tabela Mangle
A tabela MANGLE implementa alterações especiais em pacotes em um nível mais complexo. A tabela mangle é capaz, por exemplo, de alterar a prioridade de entrada e saída de um pacote baseado no tipo de serviço (TOS) o qual o pacote se destinava.
Suas situações são:
PREROUTING: Modifica pacotes dando-lhes um tratamento especial antes que os mesmos sejam roteados.
OUTPUT: Altera pacotes de forma especial gerados localmente antes que os mesmo sejam roteados.
Antes de começar
Antes de começar a utilizar o Iptables, precisamos nos certificar de que o ambiente está pronto.
Cheque se o pacote iptables está instalado em seu sistema.
Abra um terminal, como o gnome-terminal, e digite:
# dpkg -l | grep iptables
Caso este comando não retorne nada, significa que você não o tem instalado e antes de dar sequência ao nosso curso precisamos instalá-lo com o seguinte comando:
# apt-get install iptables
Sintaxe de uso do Iptables
O Iptables possui a seguinte sintaxe de uso, que pode variar um pouco dependendo da ação desejada mas que, em geral, pode ser representada por:
iptables [-t tabela] -[comando] [situação (chain)] especificação-da-regra [alvo]
Veremos adiante uma descrição mais detalhada de cada parte desta sintaxe de uso.
Comandos
Segue abaixo uma lista de comandos básicos do Iptables com exemplos explicativos:
Exemplo que adiciona uma nova regra no final da lista referente a INPUT chain:
# iptables -A INPUT
-D: Apaga uma regra especificada da lista:
Exemplo que apaga a regra inserida anteriormente apenas trocando o comando -A por -D:
#iptables -D INPUT
Obs: O comando -D também permite apagar uma certa regra por seu número da lista de ocorrências do Iptables
Exemplo que apaga a regra de número 2 referente a FORWARD chain:
# iptables -D FORWARD 2
# iptables -L FORWARD
# iptables -F
Exemplo que remove todas as regras existentes referentes a OUTPUT chain:
# iptables -F OUTPUT
# iptables -I OUTPUT
# iptables -R FORWARD 2 -s 10.0.40.3 -d 10.0.30.0/8 -j DROP
-N: Este comando nos permite inserir/criar uma nova chain na tabela especificada.
Exemplo que cria uma nova chain chamada internet na tabela filter:
# iptables -t filter -N internet
# iptables -X INTERNET
Especificação das Regras
#iptables -t filter -A INPUT -i eth0 -p tcp --dport 6881 -j ACCEPT#iptables -t filter -A INPUT -i eth0 -p tcp --dport 6881 -j ACCEPT#iptables -t filter -A INPUT -s 192.168.1.1/24 --dport 6112 -j DROP#iptables -t filter -A INPUT -d 192.168.1.1/24 --dport 6112 -j DROP#iptables -t filter -A INPUT -i eth0 -p tcp --dport 6881 -j ACCEPT#iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 6881 -j DROP
Obs: Para uma lista mais completa, consulte a página de manual do Iptables ($man iptables).
Alvos
Segue abaixo um lista de alguns dos principais alvos para nossas regras:
ACCEPT: Este alvo faz com que o Netfilter aceite a passagem do pacote. O significado prático disto depende da situação (chain) em que é feita esta aceitação. Por exemplo, um pacote que é aceito numa situação de entrada (INPUT chain) terá permissão para ser recebido pelo host, já um pacote que é aceito numa situação de saída (OUTPUT chain) terá permissão para ser enviado pelo host, assim como um pacote que é aceito numa situação de encaminhamento (FORWARD chain) terá permissão para ser roteado através da rede.
DROP: Este alvo faz com que o Netfilter descarte o pacote referenciado sem processamento prévio deste. Este pacote simplesmente desaparece sem nenhuma indicação do fato de ter sido descartado ao host ou aplicação que o enviou. Frequentemente é enviada para o emissor de tal pacote uma indicação de tempo de comunicação esgotado (timeout), o que pode gerar uma certa confusão.
QUEQUE: Este alvo faz com que o pacote seja enviado a uma fila e aguarda até que uma aplicação o requeira. Caso não exista nenhuma aplicalvo capaz de requerer tal pacote na fila, esta alvo equivale a alvo DROP e o pacote é descartado.
REJECT: Este alvo tem o mesmo efeito da alvo DROP exceto pelo fato de que ela envia, ao remetente do pacote, um outro pacote de erro.
LOG: Este alvo "loga" o tráfego do pacote. Ou seja, cria um relatório, no syslog, do seu percurso na rede. Pode ser usado em qualquer situação (chain) e em qualquer tabela. Muito útil para análise de quais pacotes estão sendo descartados.
SNAT: Este alvo faz com que o pacote tenha seu endereço de origem alterado. Utilizamos a flag "--to-source" para indicar o novo endereço de origem do pacote. Este alvo só é válido para situações(chains) de POSTROUTING dentro da tabela NAT.
DNAT: Este alvo faz com que o pacote tenha seu endereço de destino alterado. Utilizamos a flag "--to-destination" para indicar o novo enderço de destino do pacote. Este alvo é válido apenas para situações (chains) de OUTPUT e PREROUTING dentro da tabela NAT.
MASQUERADE: Este alvo é uma forma especial restrita de SNAT para conexões com IP's dinâmicos. Ao invés de ter que alterar a uma alvo SNAT toda vez que o IP for alterado, esta alvo calcula o endereço IP de origem para fazer o NAT analizando o endereço IP da interface de saída quando um pacote encontra esta regra.
REDIRECT: Este alvo é responsável pelo redirecionamento de portas. Utilizamos a flag --to-port para especificar a porta para a qual o tráfego da regra será redirecionado.
Considerações Iniciais
Antes de iniciarmos a manipulação de qualquer regra que se utilize da tabela NAT, é importante que habilitemos a função de redirecionamento de pacotes (forward) em nosso kernel através do seguinte comando:
#echo "1" > /proc/sys/net/ipv/ip_forward
Não se esqueça de utilizar este comando antes de adicionar qualquer regra que envolva a tabela NAT.
Outra observação importante é que sempre que fizermos um SNAT utilizaremos a situação (chain) POSTROUTING e sempre que fizermos um DNAT utilizaremos a situação (chain) PREROUTING, por motivos obvios.
SNAT
Com o SNAT ( Source NAT ) é possível alterar o endereço de origem no cabeçalho (header) dos pacotes que casarem com a regra criada.
Exemplo:
#iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.1.223
Neste exemplo todos os pacotes que sairem pela interface de rede eth0 terão os endereços de origem alterados para 192.168.1.223.
DNAT
Com o DNAT é possível alterar o endereço de destino dos pacotes que casarem com a regra criada.
Exemplo:
#iptables -t nat PREROUTING -i eth0 -j DNAT --to 192.168.1.223
Neste exemplo todos os pacotes que entrarem pela interface de rede eth0 terão o endereço de destino alterados para 192.168.1.223.
Proxy transparente
O proxy transparente é a forma que a tabela NAT possui de realizar um redirecionamento de portas em um mesmo host de destino. Este método é comumente utilizado, por exemplo, pelo software Squid, pois este costuma disponibilizar acesso à internet através da porta 3128 ao invés da porta padrão, 80, para este tipo de acesso.
Logo, concluímos que o Squid faz um redirecionamento das portas solicitadas por seus clientes, uma vez que estes solicitam conexão via porta 80 e são redirecionados à porta 3128. Para esta finalidade utilizamos as situações (chains) PREROUTING e OUTPUT da tabela NAT e o alvo REDIRECT.
Não confunda proxy transparente com DNAT. A única forma de se fazer redirecionamento de portas de destino em um mesmo host é pelo alvo REDIRECT que caracteriza o modelo de proxy transparente.
Exemplo:
#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
Neste exemplo, os pacotes que entram pela interface eth0 com destino à porta 80 serão redirecionados para a porta 3128.
Compartilhamento de internet via NAT
Podemos utilizar ainda a tabela NAT para realizar o compartilhamento do acesso à internet. Isto é útil, por exemplo, quando desejamos que nossa rede local tenha acesso à internet. Para tanto, utilizamos o alvo MASQUERADE para fazer o que conhecemos como "mascaramento".
Exemplo:
#iptables -t nat -A POSTROUTING -o lo -d 127.0.0.0/8 -j ACCEPT #iptables -t nat -P POSTROUTING DROP #iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
Neste exemplo, todos os IP's da rede 192.168.1.0 com máscara de rede 255.255.255.0 serão "mascarados".
TOS
O TOS (Type of Service) nos permite filtrar pacotes que trafegam na nossa rede capturando informações sobre o tipo de serviço ao qual o pacote se destina. Estas informações estão contidas no cabeçalho de cada pacote. O campo TOS foi criado especificamente para que pudessemos fazer tal filtragem.
Para usufruirmos desta funcionalidade, nós utilizamos a tabela mangle do Netfilter. O TOS é um alvo (target) para o qual direcionamos os pacotes desejados referenciando-os em uma determinada regra. Compreenderemos o seu uso mais adiante.
Aplicando TOS
Para aplicar filtragem por TOS em nossa rede fazemos uso da tabela mangle e do alvo TOS seguido pelo parâmento --set-tos valor, em que os valores possíveis são, em ordem descrescente de prioridade:
Espera Mínima: É especificado através de Minimize-Delay, 16 ou 0x10.#iptables -t mangle -A OUTPUT -o eth0 -p tcp --dport 5123 -j TOS --set-tos 16Este exemplo dá prioridade de espera mínima à todos os pacotes tcp que saem da rede pela interface de rede eth0 com porta de destino 5123. Ou seja, estes pacotes terão uma facilidade maior para trafegar na rede.
TOS no tráfego de entrada
Esta operação é realizada nas situações (chains) INPUT ou PREROUTING. Não faz muito sentido o uso desta chain (situação) dentro de uma rede pequena ou média, pois o tráfego que recebermos será
priorizado pelo chain de saída de outras máquinas da internet ou de outras redes
antes de chegar a nossa (desde que elas também estejam usando TOS).
Exemplo:
#iptables -t mangle -A PREROUTING -i eth0 -p tcp --sport 6666-6668 -j TOS --set-tos 0x10
TOS no tráfego de saída
Esta operação pode ser realizada somente na situação (chain) OUTPUT e tem por objetivo controlar o tráfego de saída em nossa rede.
Exemplos:
Para priorizar todo o tráfego de IRC de nossa rede interna indo para a
interface ppp0:
#iptables -t mangle -A OUTPUT -o ppp0 -p tcp --dport 6666-6668 -j TOS --set-tos 16
O bit TOS é ajustado para espera mínima e será enviado antes dos
pacotes com prioridade normal para fora.
Para priorizar a transmissão de dados
ftp saindo da rede:
#iptables -t mangle -A OUTPUT -o ppp0 -p tcp --dport 20 -j TOS --set-tos 8
Para priorizaer o tráfego de ICQ da rede:
#iptables -t mangle -A OUTPUT -o ppp0 -p tcp --dport 5190 -j TOS --set-tos 16
Os módulos do iptables são especificados com a opção -m módulo ou --match módulo e permitem expandir a funcionalidade do firewall através de novas conferências e recursos de filtragem adicionais, como limitar a conferência de regras do firewall (um método útil de limitar ping floods, syn floods, etc).
Limit
Regras sob o módulo limit especificam exatamente quantas vezes as mesmas devem ser executadas em um intervalo de tempo específico e, caso isto ocorra, ela automaticamente executará a regra seguinte.
Trata-se de um módulo muito útil para conter ataques sofisticados como ataques do tipo DOS (Denial Of Service) onde o cracker tenta enviar o máximo de requisições ICMP possíveis em um menor intervalo de tempo, esperando que com isso cause uma negação de serviços por parte de seu Firewall.
Exemplo:
#iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Neste exemplo, temos que os pacotes de respostas de ICMP ( -p icmp ) serão aceitos somente se recebidos em um intervalo de tempo de 1 segundo ( -m limit --limit 1/s -j ACCEPT ). Caso algum pacote ultrapasse este limite imposto pela regra, esta deverá automaticamente executar a regra seguinte que deverá ser algo como:
#iptables -A INPUT -p icmp -j DROP
Esta regra irá bloquear ( -j DROP ) qualquer pacote ICMP ( -p icmp ) que chegar ao FIrewall.
State
O módulo state atribui regras mediante a análise do estado da conexão de um pacote. Tais estados podem ser:
NEW: Indica que o pacote está criando uma nova conexão.
ESTABLISHED: Informa que o pacote pertence à uma conexão já existente, logo, trata-se de um pacote de resposta.
RELATED: Referente à pacotes que relacionam-se indiretamente com outro pacote, a exemplo das mensagens de erros de conexão.
INVALID: Referente à pacotes não identificados por algum motivo desconhecido. Aconselha-se que estes pacotes sejam descartados pelo Firewall.
Exemplo:
#iptables -A INPUT -m state --state NEW -i eth0 -j DROP
Este exemplo faz com que qualquer nova conexão que parta da interface eth0 seja rejeitada.
Mac
Mac (Media access control) é a identificação de mais baixo nível que um dispositivo de rede pode ter.
O módulo mac permite que seu Firewall atue neste nível, independentemente de endereçamento de rede. Logo, a checagem da regra não depende mais do endereço IP e sim do endereço Mac do dispositivo de rede.
Exemplo:
#iptables -A INPUT -m mac --mac-source 00:0F:B0:C2:0C:5C -j DROP
Este exemplo bloquearia qualquer pacote proveniente deste dispositivo de rede cujo endereço mac foi referenciado.
Multiport
O módulo multiport permite que seja especificado múltiplas portas para um alvo. Podem ser especificadas até 15 portas em um único parâmetro e basta que uma porta confira para que a regra entre em ação, pois a comparação é feita usando condições "or". O parâmetro multiport deve ser acompanhado de um dos argumentos abaixo:
Este módulo pode eliminar muitas regras de firewall que fazem o mesmo
tratamento de pacotes para diversas portas diferentes.
Exemplo:
#iptables -A INPUT -p tcp -i ppp0 -m multiport --destination-port 21,23,25,80,110,113,6667 -j DROP
Este exemplo bloqueia todos os pacotes vindo de ppp0 para as portas 21 (ftp), 23 (telnet),
25 (smtp), 80 (www), 110 (pop3), 113 (ident), 6667 (irc).
String
O módulo string do Iptables permite a inspeção de
conteúdo de um pacote e tomar uma ação se determinado tipo de tráfego for
encontrado em um pacote. Esta técnica pode ser usada tanto para segurança como
para economia de banda dentro da rede. Esta opção *NÃO* torna o Iptables como
um firewall proxy, pois o proxy tem a habilidade de inspecionar o conteúdo,
protocolo, comandos do pacote e decidir se o seu conteúdo é nocivo ou não.
O
firewall em nível de pacotes fazendo inspeção de conteúdo, chega a ser 3 a 10
vezes mais rápido do que um proxy, assim seu uso deve ser analisado dependendo
do tráfego que circula pelo link e da segurança dos dados que trafegam através
dele.
Uma boa prática é aliar esta opção a um IDS externo usando o alvo QUEUE e deixando o trabalho de inspeção de conteúdo para ele. Um
exemplo de restrição direta é o bloqueio do envio de qualquer informação
confidencial sigilosa para fora da rede interna (número de contas, tudo que
conferir com CPF, CGC, endereços de e-mail, memorandos, etc).
De qualquer
forma, analise o tráfego de sua rede antes de querer implementar qualquer
solução baseada neste método sob o risco de afetar tráfego legítimo.
Outra utilidade eficiente é a diminuição de tráfego, pois podemos barrar
programas que sobrecarregam o link em uma rede com muitos usuários como, por
exemplo, usando o Kazaa ou qualquer outro programa para cópia de
arquivos via Internet.
Veja alguns exemplos:
Bloqueia qualquer tentativa de acesso ao programa Kazaa:
#iptables -A INPUT -m string --string "X-Kazaa" -j DROP
Não permite que dados confidenciais sejam enviados para fora da empresa e registra o ocorrido:
#iptables -A OUTPUT -m string --string "conta" -j LOG --log-prefix "ALERTA: dados confidencial "
#iptables -A OUTPUT -m string --string "conta" -j DROP
Somente permite a passagem de pacotes que não contém ".exe" em seu conteúdo:
#iptables -A INPUT -m string --string ! ".exe" -j ACCEPT
Owner
Este módulo confere com o usuário que iniciou a conexão. É somente válido no chain OUTPUT da tabela filter. Os seguintes argumentos são válidas para este módulo:
OBS: - Lembre-se que pacotes que não possuem detalhes
suficientes de cabeçalho nunca serão conferidos!
Exemplo:
#iptables -A OUTPUT -m owner --gid-owner 100 -p udp -j DROP
Este exemplo rejeita conexões indo para portas UDP de pacotes criados pelo usuários
pertencentes ao grupo 100.