<chapt id="fw-iptables">Firewall iptables
 <p>
Este capítulo documenta o funcionamento do firewall <prgn>iptables</prgn> 
que acompanha a série do kernel 2.4, opções usadas, e aponta alguns 
pontos fundamentais para iniciar a configuração e construção de bons 
sistemas de firewall. 


<sect id="fw-iptables-intro">Introdução
 <p>
O <em>Firewall</em> é um programa que 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). No 
kernel do Linux 2.4, foi introduzido o firewall <prgn>iptables</prgn> 
(também chamado de netfilter) que substitui o <prgn>ipchains</prgn> dos kernels 
da série 2.2. Este novo firewall tem como vantagem ser muito estável (assim como
o <prgn>ipchains</prgn> e <prgn>ipfwadm</prgn>), confiável, permitir muita 
flexibilidade na programação de regras pelo administrador do sistema, mais 
opções disponíveis ao administrador para controle de tráfego, controle 
independente do tráfego da rede local/entre redes/interfaces devido 
a nova organização das etapas de roteamento de pacotes. 
 <p>
O <prgn>iptables</prgn> é um firewall em nível de pacotes e funciona baseado 
no endereço/porta de origem/destino do pacote, prioridade, etc. Ele funciona 
através da comparação de regras para saber se um pacote tem ou não 
permissão para passar. Em firewalls mais restritivos, o pacote é bloqueado e 
registrado para que o administrador do sistema tenha conhecimento sobre o que 
está acontecendo em seu sistema. 
 <p> 
Ele também pode ser usado para modificar e monitorar o tráfego da rede, fazer NAT 
(masquerading, source nat, destination nat), redirecionamento de pacotes, 
marcação de pacotes, modificar a prioridade de pacotes que 
chegam/saem do seu sistema, contagem de bytes, dividir tráfego entre máquinas, 
criar proteções anti-spoofing, contra syn flood, DoS, etc. O tráfego vindo de 
máquinas desconhecidas da rede pode também ser bloqueado/registrado através do 
uso de simples regras. As possibilidades oferecidas pelos recursos de filtragem 
<prgn>iptables</prgn> como todas as ferramentas UNIX maduras 
dependem de sua imaginação, pois ele garante uma 
grande flexibilidade na manipulação das regras de acesso ao sistema, 
precisando apenas conhecer quais interfaces o sistema possui, o que deseja 
bloquear, o que tem acesso garantido, quais serviços devem estar acessíveis 
para cada rede, e iniciar a construção de seu firewall.
 <p>
O <prgn>iptables</prgn> ainda tem a vantagem de ser modularizável, funções podem 
ser adicionadas ao firewall ampliando as possibilidades oferecidas. Usei por 2 
anos o <prgn>ipchains</prgn> e afirmo que este é um firewall que tem possibilidades 
de gerenciar tanto a segurança em máquinas isoladas como roteamento em 
grandes organizações, onde a passagem de tráfego entre redes deve ser 
minuciosamente controlada. 
 <p>
Um firewall não funciona de forma automática (instalando e esperar que ele 
faça as coisas por você), é necessário pelo menos conhecimentos básicos de 
rede tcp/ip, roteamento e portas para criar as regras que farão a segurança de 
seu sistema. A segurança do sistema depende do controle das regras que serão 
criadas por você, as falhas humanas são garantia de mais de 95% de sucesso
nas invasões. 
 <p>
Enfim o <prgn>iptables</prgn> é um firewall que agradará tanto a pessoas 
que desejam uma segurança básica em seu sistema, quando administradores de 
grandes redes que querem ter um controle minucioso sobre o tráfego que 
passam entre suas interfaces de rede (controlando tudo o que pode passar de 
uma rede a outra), controlar o uso de tráfego, monitoração, etc. 


<sect1 id="fw-iptables-versao">Versão
 <p>
É assumido que esteja usando a versão 1.2.3 do <prgn>iptables</prgn> e baseadas 
nas opções do kernel 2.4.16 (sem o uso de módulos experimentais). As explicações 
contidas aqui podem funcionar para versões posteriores, mas é recomendável que 
leia a documentação sobre modificações no programa (changelog) em busca de 
mudanças que alterem o sentido das explicações fornecidas aqui. 


<sect1 id="fw-iptables-historia">Um resumo da história do iptables
 <p>
O <prgn>iptables</prgn> é um código de firewall das versões 
2.4 do kernel, que substituiu o <prgn>ipchains</prgn> (presente
nas séries 2.2 do kernel). Ele foi incluído no kernel da série 2.4 
em meados de Junho/Julho de 1999. 
 <p>
A história do desenvolvimento (desde o porte do <prgn>ipfw</prgn> do 
<prgn>BSD</prgn> para o <prgn>Linux</prgn> até o <prgn>iptables</prgn> 
(que é a quarta geração de firewalls do kernel) está disponível no documento, 
<tt>Netfilter-howto</tt>. 


<sect1 id="fw-iptables-caracteristicas">Características do firewall iptables
 <p>
<list compact>
 <item>Especificação de portas/endereço de origem/destino
 <item>Suporte a protocolos TCP/UDP/ICMP (incluindo tipos de mensagens icmp)
 <item>Suporte a interfaces de origem/destino de pacotes
 <item>Manipula serviços de proxy na rede
 <item>Tratamento de tráfego dividido em chains (para melhor controle do tráfego 
 que entra/sai da máquina e tráfego redirecionado.
 <item>Permite um número ilimitado de regras por chain
 <item>Muito rápido, estável e seguro
 <item>Possui mecanismos internos para rejeitar automaticamente pacotes duvidosos 
 ou mal formados. 
 <item>Suporte a módulos externos para expansão das funcionalidades padrões
 oferecidas pelo código de firewall
 <item>Suporte completo a roteamento de pacotes, tratadas em uma área diferente
 de tráfegos padrões.
 <item>Suporte a especificação de tipo de serviço para priorizar o tráfego de 
 determinados tipos de pacotes.
 <item>Permite especificar exceções para as regras ou parte das regras
 <item>Suporte a detecção de fragmentos
 <item>Permite enviar alertas personalizados ao <prgn>syslog</prgn> sobre o 
 tráfego aceito/bloqueado.
 <item>Redirecionamento de portas
 <item>Masquerading
 <item>Suporte a SNAT (modificação do endereço de origem das máquinas para um 
 único IP ou faixa de IP's). 
 <item>Suporte a DNAT (modificação do endereço de destino das máquinas para um
único IP ou fixa de IP's)
 <item>Contagem de pacotes que atravessaram uma interface/regra
 <item>Limitação de passagem de pacotes/conferência de regra (muito útil para 
criar proteções contra, syn flood, ping flood, DoS, etc).

</list> 
 
<sect1 id="fw-iptables-ficha">Ficha técnica
 <p>
Pacote: <package>iptables</package>
 <p>
<list compact>
 <item>
<tt>iptables</tt> - Sistema de controle principal para protocolos ipv4

 <item>
<tt>ip6tables</tt> - Sistema de controle principal para protocolos ipv6

 <item>
<tt>iptables-save</tt> - Salva as regras atuais em um arquivo especificado 
como argumento. Este utilitário pode ser dispensado por um shell script
contendo as regras executado na inicialização da máquina.

 <item>
<tt>iptables-restore</tt> - Restaura regras salvas pelo utilitário 
<prgn>iptables-save</prgn>.
</list>

<sect1 id="fw-iptables-hwreq">Requerimentos
 <p>
É necessário que o seu kernel tenha sido compilado com suporte ao 
<prgn>iptables</prgn> (veja <ref id="fw-iptables-supkernel">. O 
requerimento mínimo de memória necessária para a execução do 
<prgn>iptables</prgn> é o mesmo do kernel 2.4 (4MB). Dependendo 
do tráfego que será manipulado pela(s) interface(s) do firewall
ele poderá ser executado com folga em uma máquina 386 SX com 4MB 
de RAM.
 <p>
Como as configurações residem no kernel não é necessário espaço 
extra em disco rígido para a execução deste utilitário. 


<sect1 id="fw-iptables-logs">Arquivos de logs criados pelo iptables
 <p>
Todo tráfego que for registrado pelo <prgn>iptables</prgn> é registrado 
por padrão no arquivo <file>/var/log/kern.log</file>. 


<sect1 id="fw-iptables-install">Instalação
 <p>
<tt>apt-get install iptables</tt>
 <p>
O pacote <package>iptables</package> contém o utilitário <prgn>iptables</prgn>
(e <prgn>ip6tables</prgn> para redes ipv6) necessários para inserir suas 
regras no kernel. Se você não sabe o que é ipv6, não precisará se preocupar com 
o utilitário <prgn>ip6tables</prgn> por enquanto. 


<sect1 id="fw-iptables-contribuindo">Enviando Correções/Contribuindo com o projeto
 <p>
A página principal do projeto é <tt><url id="&url-netfilter-www;"></tt>. 
Sugestões podem ser enviadas para a lista de desenvolvimento oficial do 
<prgn>iptables</prgn>: <tt><url id="&url-netfilter-dev;"></tt>.


<sect1 id="fw-iptables-oldfw">O que aconteceu com o <prgn>ipchains</prgn> e 
<prgn>ipfwadm</prgn>?
 <p>
O <prgn>iptables</prgn> faz parte da nova geração de firewalls que acompanha 
o kernel 2.4, mas o suporte ao <prgn>ipchains</prgn> e <prgn>ipfwadm</prgn> 
ainda será mantido através de módulos de compatibilidade do kernel até 2004. 
Seria uma grande falta de consideração retirar o suporte a estes firewalls 
do kernel como forma de obrigar a "aprenderem" o <prgn>iptables</prgn> (mesmo 
o suporte sendo removido após este período, acredito que criarão patches 
"externos" para futuros kernels que não trarão mais este suporte). Se precisa 
do suporte a estes firewalls antes de passar em definitivo para o 
<prgn>iptables</prgn> leia <ref id="fw-iptables-supkernel">. 
 <p>
Se você é um administrador que gosta de explorar todos os recursos de um 
firewall, usa todos os recursos que ele oferece ou mantém 
uma complexa rede corporativa, tenho certeza que gostará do <prgn>iptables</prgn>. 


<sect1 id="fw-iptables-tiposfw">Tipos de firewalls 
 <p>
Existem basicamente dois tipos de firewalls: 
<list compact>
 <item>
<tt>nível de aplicação</tt> - Este tipo de firewall analisam o conteúdo do 
pacote para tomar suas decisões de filtragem. Firewalls deste tipo são mais 
intrusivos (pois analisam o conteúdo de tudo que passa por ele) e permitem um 
controle relacionado com o conteúdo do tráfego. Alguns firewalls 
em nível de aplicação combinam recursos básicos existentes em firewalls 
em nível de pacotes combinando as funcionalidade de 
controle de tráfego/controle de acesso em uma só ferramenta. 
Servidores proxy, como o <prgn>squid</prgn>, são um exemplo deste tipo de 
firewall. 

 <item>
<tt>nível de pacotes</tt> - Este tipo de firewall toma as decisões baseadas
nos parâmetros do pacote, como porta/endereço de origem/destino, estado 
da conexão, e outros parâmetros do pacote. O firewall então pode 
negar o pacote (DROP) ou deixar o pacote passar (ACCEPT). O 
<prgn>iptables</prgn> é um excelente firewall que se encaixa nesta categoria. 
 <p>
Firewall em nível de pacotes é o assunto explicado nesta seção do guia mas 
será apresentada uma explicação breve sobre o funcionamento de análise de 
strings do <prgn>iptables</prgn>.
</list>
Os dois tipos de firewalls podem ser usados em conjunto para fornecer uma 
camada dupla de segurança no acesso as suas máquinas/máquinas clientes. 


<sect1 id="fw-iptables-proteger-oque">O que proteger?
 <p>
Antes de iniciar a construção do firewall é bom pensar nos seguintes pontos: 
<list compact>
 <item>
Quais serviços precisa proteger. Serviços que devem ter acesso garantido 
a usuários externos e quais serão bloqueados a todas/determinadas máquinas. 
É recomendável bloquear o acesso a todas portas menores que 1024 por 
executarem serviços que rodam com privilégio de usuário <tt>root</tt>, e 
autorizar somente o acesso as portas que realmente deseja (configuração 
restritiva nesta faixa de portas).
 <item>
Que tipo de conexões eu posso deixar passar e quais bloquear. Serviços 
com autenticação em texto plano e potencialmente inseguros como rlogin, 
telnet, ftp, NFS, DNS, LDAP, SMTP RCP, X-Window são serviços que devem 
ser ter acesso garantido somente para máquinas/redes que você confia. 
Estes serviços podem não ser só usados para tentativa de acesso ao 
seu sistema, mas também como forma de atacar outras pessoas aproveitando-se 
de problemas de configuração. 
 <p>
A configuração do firewall ajuda a prevenir isso, mesmo se um serviço 
estiver mal configurado e tentando enviar seus pacotes para fora, será impedido. 
Da mesma forma se uma máquina Windows de sua rede for infectada por um 
trojan não haverá pânico: o firewall poderá estar configurado para 
bloquear qualquer tentativa de conexão vinda da internet (cracker) para as 
máquinas de sua rede. 
 <p>
Para cópia de arquivos via rede insegura (como através da Internet), é 
recomendado o uso de serviços que utilizam criptografia para login 
e transferência de arquivos <![ %CAPJUNTOS [ (veja <ref id="s-ssh">)]]> 
ou a configuração de uma VPN. 
 <item>
Que máquinas terão acesso livre e quais serão restritas.
 <item>
Que serviços deverão ter prioridade no processamento.
 <item>
Que máquinas/redes NUNCA deverão ter acesso a certas/todas máquinas.  
 <item>
O volume de tráfego que o servidor manipulará. Através disso você pode 
ter que balancear o tráfego entre outras máquinas, configurar proteções
contra DoS, syn flood, etc. 
 <item>
O que tem permissão de passar de uma rede para outra (em máquinas que 
atuam como roteadores/gateways de uma rede interna).
 <item>
Etc.
</list>
A análise destes pontos pode determinar a complexidade do firewall, custos 
de implementação, prazo de desenvolvimento e tempo de maturidade do código
para implementação. Existem muitos outros pontos que podem entrar na questão 
de desenvolvimento de um sistema de firewall, eles dependem do tipo de firewall 
que está desenvolvendo e das políticas de segurança de sua rede.



<sect1 id="fw-iptables-regras-oque">O que são regras?
 <p>
As regras são como comandos passados ao <prgn>iptables</prgn> para que ele 
realize uma determinada ação (como bloquear ou deixar passar um pacote) de 
acordo com o endereço/porta de origem/destino, interface de origem/destino, 
etc. As regras são armazenadas dentro dos chains e processadas na ordem que 
são inseridas. 
 <p>
As regras são armazenadas no kernel, o que significa que quando o computador
for reiniciado tudo o que fez será perdido. Por este motivo elas deverão
ser gravadas em um arquivo para serem carregadas a cada inicialização. 
 <p>
Um exemplo de regra: <tt>iptables -A INPUT -s 123.123.123.1 -j DROP</tt>.



<sect1 id="fw-iptables-chains-oque">O que são chains?
 <p>
Os <em>Chains</em> são locais onde as regras do firewall definidas pelo 
usuário são armazenadas para operação do firewall. Existem dois 
tipos de chains: os embutidos (como os chains <em>INPUT</em>, <em>OUTPUT</em> e
<em>FORWARD</em>) e os criados pelo usuário. Os nomes dos chains embutidos
devem ser especificados sempre em maiúsculas (note que os nomes dos chains
são case-sensitive, ou seja, o chain <tt>input</tt> é completamente 
diferente de <tt>INPUT</tt>).


<sect1 id="fw-iptables-tabelas">O que são tabelas?
 <p>
Tabelas são os locais usados para armazenar os chains e conjunto de 
regras com uma determinada característica em comum. As tabelas podem ser 
referenciadas com a opção <em>-t tabela</em> e existem 3 tabelas disponíveis no 
<prgn>iptables</prgn>:
<list>
 <item><tt>filter</tt> - Esta é a tabela padrão, contém 3 chains padrões:
 <list compact>
  <item><tt>INPUT</tt> - Consultado para dados que chegam a máquina
  <item><tt>OUTPUT</tt> - Consultado para dados que saem da máquina
  <item><tt>FORWARD</tt> - Consultado para dados que são redirecionados 
  para outra interface de rede ou outra máquina.
 </list>
 Os chains <em>INPUT</em> e <em>OUTPUT</em> somente são atravessados por 
 conexões indo/se originando de localhost. 
 <![ %OBS [
  <p>
 <strong>OBS</strong>: Para conexões locais, somente os chains <em>INPUT</em> e 
 <em>OUTPUT</em> são consultados na tabela filter. ]]>

 <item><tt>nat</tt> - Usada para dados que gera outra conexão (masquerading, 
source nat, destination nat, port forwarding, proxy transparente são alguns
exemplos). Possui 3 chains padrões:
 <list compact>
  <item><tt>PREROUTING</tt> - Consultado quando os pacotes precisam ser modificados
logo que chegam. É o chain ideal para realização de DNAT e redirecionamento de 
portas (<ref id="fw-iptables-nat-dnat">).
  <item><tt>OUTPUT</tt> - Consultado quando os pacotes gerados localmente 
precisam ser modificados antes de serem roteados. Este chain somente é 
consultado para conexões que se originam de IPs de interfaces locais. 
  <item><tt>POSTROUTING</tt> - Consultado quando os pacotes precisam ser modificados 
após o tratamento de roteamento. É o chain ideal para realização de SNAT e 
IP Masquerading (<ref id="fw-iptables-nat-snat">).
 </list>

 <item><tt>mangle</tt> - Utilizada para alterações especiais de pacotes (como 
modificar o tipo de serviço (TOS) ou outros detalhes que serão explicados 
no decorrer do capítulo. Possui 2 chains padrões:
 <list compact>
   <item><tt>INPUT</tt> - Consultado quando os pacotes precisam ser modificados
 antes de serem enviados para o chain <em>INPUT</em> da tabela <em>filter</em>.
   <item><tt>FORWARD</tt> - Consultado quando os pacotes precisam ser modificados
 antes de serem enviados para o chain <em>FORWARD</em> da tabela <em>filter</em>.
   <item><tt>PREROUTING</tt> - Consultado quando os pacotes precisam ser modificados
antes de ser enviados para o chain <em>PREROUTING</em> da tabela <em>nat</em>.
   <item><tt>POSTROUTING</tt> - Consultado quando os pacotes precisam ser 
 modificados antes de serem enviados para o chain <em>POSTROUTING</em> da 
 tabela <em>nat</em>.
   <item><tt>OUTPUT</tt> - Consultado quando os pacotes precisam ser modificados
  antes de serem enviados para o chain <em>OUTPUT</em> da tabela <em>nat</em>.
 </list>
 Veja <ref id="fw-iptables-mangle"> para mais detalhes sobre a tabela mangle.
</list>


<sect1 id="fw-iptables-supkernel">Habilitando o suporte ao iptables no kernel
 <p>
Para usar toda a funcionalidade do firewall <prgn>iptables</prgn>, permitindo
fazer o controle do que tem ou não permissão de acessar sua máquina, fazer 
Masquerading/NAT em sua rede, etc., você precisará dos seguintes componentes 
compilados em seu kernel (os módulos experimentais fora ignorados 
intencionalmente): 
<example>
*
* Network Options:
*

Network packet filtering (replaces ipchains) [Y/m/n/?]
 Network packet filtering debugging [Y/m/n/?]

e na Subseção:

*
*   IP: Netfilter Configuration
*
Connection tracking (required for masq/NAT) (CONFIG_IP_NF_CONNTRACK) [M/n/y/?] 
  FTP protocol support (CONFIG_IP_NF_FTP) [M/n/?] 
  IRC protocol support (CONFIG_IP_NF_IRC) [M/n/?]
IP tables support (required for filtering/masq/NAT) (CONFIG_IP_NF_IPTABLES) [Y/m/n/?]
  limit match support (CONFIG_IP_NF_MATCH_LIMIT) [Y/m/n/?] 
  MAC address match support (CONFIG_IP_NF_MATCH_MAC) [M/n/y/?] 
  netfilter MARK match support (CONFIG_IP_NF_MATCH_MARK) [M/n/y/?] 
  Multiple port match support (CONFIG_IP_NF_MATCH_MULTIPORT) [M/n/y/?] 
  TOS match support (CONFIG_IP_NF_MATCH_TOS) [M/n/y/?] 
  LENGTH match support (CONFIG_IP_NF_MATCH_LENGTH) [M/n/y/?]
  TTL match support (CONFIG_IP_NF_TTL) [M/n/y/?]
  tcpmss match support (CONFIG_IP_NF_MATCH_TCPMSS) [M/n/y/?] 
  Connection state match support (CONFIG_IP_NF_MATCH_STATE) [M/n/?] 
  Packet filtering (CONFIG_IP_NF_FILTER) [M/n/y/?] 
    REJECT target support (CONFIG_IP_NF_TARGET_REJECT) [M/n/?] 
  Full NAT (CONFIG_IP_NF_NAT) [M/n/?] 
    MASQUERADE target support (CONFIG_IP_NF_TARGET_MASQUERADE) [M/n/?] 
    REDIRECT target support (CONFIG_IP_NF_TARGET_REDIRECT) [M/n/?] 
  Packet mangling (CONFIG_IP_NF_MANGLE) [M/n/y/?] 
    TOS target support (CONFIG_IP_NF_TARGET_TOS) [M/n/?] 
    MARK target support (CONFIG_IP_NF_TARGET_MARK) [M/n/?] 
  LOG target support (CONFIG_IP_NF_TARGET_LOG) [M/n/y/?] 
  TCPMSS target support (CONFIG_IP_NF_TARGET_TCPMSS) [M/n/y/?] 

</example> 
Esta configuração permite que você não tenha problemas para iniciar o uso 
e configuração do seu firewall iptables, ela ativa os módulos necessários 
para utilização de todos os recursos do firewall <prgn>iptables</prgn>. Quando
conhecer a função de cada um dos parâmetros acima (durante o decorrer do texto), 
você poderá eliminar muitas das opções desnecessárias para seu estilo de 
firewall ou continuar fazendo uso de todas ;-)
<![ %OBS [ 
 <p>
<strong>OBS1:</strong> A configuração acima leva em consideração que você NÃO 
executará os códigos antigos de firewall <prgn>ipfwadm</prgn> e 
<prgn>ipchains</prgn>. Caso deseje utilizar o <prgn>ipchains</prgn> ou o 
<prgn>ipfwadm</prgn>, será preciso responder com "M" a questão 
"IP tables support (required for filtering/masq/NAT) (CONFIG_IP_NF_IPTABLES)". 
Será necessário carregar manualmente o módulo correspondente ao firewall
que deseja utilizar (<tt>modprobe <file>iptables_filter.o</file></tt> no caso 
do <prgn>iptables</prgn>). 
 <p>
Não execute mais de um tipo de firewall ao mesmo tempo!!!
 <p>
<strong>OBS2:</strong> É recomendável ativar o daemon <prgn>kmod</prgn> para 
carga automática de módulos, caso contrário será necessário compilar todas 
as partes necessárias embutidas no kernel, carregar os módulos necessários 
manualmente ou pelo <prgn>iptables</prgn> (através da opção 
<em>--modprobe=módulo</em>). ]]>
    

<sect1 id="fw-iptables-proxy">Ligando sua rede interna a Internet
 <p>
Se a sua intenção (como da maioria dos usuários) é conectar sua rede interna 
a Internet de forma rápida e simples, leia 
<ref id="fw-iptables-nat-fastmasquerade"> ou <ref id="fw-iptables-nat-snat">. Um 
exemplo prático de configuração de Masquerading deste tipo é encontrado em 
<ref id="fw-iptables-exemplo-snat">. 
 <p>
Após configurar o masquerading, você só precisará especificar o endereço IP da 
máquina masquerading (servidor) como <em>Gateway</em> da rede. No 
<prgn>Windows 9x/NT/2000</prgn> isto é feito no Painel de 
Controle/Rede/Propriedades de Tcp/IP. No <prgn>Linux</prgn> 
pode ser feito com <tt>route add default gw IP_do_Servidor</tt>. 


