(M)  s i s t e m a   o p e r a c i o n a l   m a g n u x   l i n u x ~/ · documentação · suporte · sobre

 
  Linux IPCHAINS-HOWTO
  Paul Russell, ipchains@rustcorp.com
  v1.0.7, 12 March 1999
  Tradução por Gleydson Mazioli da Silva, gleydson@linuxbr.com.br

  Este documento descreve como obter, instalar e configurar o avançado
  programa IP chains firewall para Linux, e muitas idéias de como
  você pode usa-lo.
  ______________________________________________________________________

  Tabela de conteúdo




  1. Introdução

     1.1 O que?
     1.2 Porque?
     1.3 Como?
     1.4 Onde?

  2. Básico sobre Filtragem de pacotes

     2.1 O que?
     2.2 Porque?
     2.3 Como?
        2.3.1 Um Kernel com filtragem de pacotes
        2.3.2 ipchains
        2.3.3 Fazendo Regras Permanentes

  3. Estou confuso!  Roteamento, masquerading, portforwarding, ipautofw...

     3.1 Guia de três linhas para Masquerading
     3.2 Promoção Gratuita: Regras Assista o Guarda
     3.3 Configuração de Firewalls simples
        3.3.1 Rede Privada: Proxies Tradicionais
        3.3.2 Rede Privada: Proxies Transparentes
        3.3.3 Rede Privada: Masquerading
        3.3.4 Rede Publica
        3.3.5 Serviços Internos Limitados
     3.4 Mais informações sobre Masquerading: David Ranch escreveu um novo HOWTO excelente sobre Masquerading, que foi um largo sobreposto deste howto.  Vocˆ pode atualmente encontrar este HOWTO em

  4. IP Firewalling Chains

     4.1 Como pacotes atravessam os filtros
        4.1.1 Usando ipchains
        4.1.2 Operações em uma Regra Simples
        4.1.3 Especificação de Filtragem
           4.1.3.1 Especificando Enderecos de Origem e Destino
           4.1.3.2 Especificando Inversão
           4.1.3.3 Especificando o Protocolo
              4.1.3.3.1 Especificando Portas UDP e TCP
              4.1.3.3.2 Especificando tipo de ICMP e Codigo
           4.1.3.4 Especificando a Interface
           4.1.3.5 Especificando somente pacotes TCP SYN
           4.1.3.6 Direcionando Fragmentos
         4.1.4 Efeitos do Lado de Filtragem
           4.1.4.1 Especificando um Alvo
           4.1.4.2 Registrando Pacotes
           4.1.4.3 Manipulando o tipo de serviço
           4.1.4.4 Marcando um Pacotes
           4.1.4.5 Operações em todo o chain
           4.1.4.6 Criando uma novo chain
           4.1.4.7 Deletando um chain
           4.1.4.8 Liberando um chain
           4.1.4.9 Listando um chain
           4.1.4.10 Resetando contadores (Zeroing) 
           4.1.4.11 Configurando o Policiamento
        4.1.5 Operações em Masquerading
        4.1.6 Checando um Pacote Packet
        4.1.7 Multiplas Regras em uma and Watching What Happens
     4.2 Exemplos Úteis
        4.2.1 Usando ipchains-save
        4.2.2 Usando ipchains-restore

  5. Outros.

     5.1 Como organizar suas regras de Firewall
     5.2 O que não descartar no Filtro
        5.2.1 Pacotes ICMP
        5.2.2 Conexões TCP para DNS (nameservers)
        5.2.3 Pesadelos FTP 
     5.3 Descartando o Ping of Death
     5.4 Descartando Teardrop and Bonk
     5.5 Descartando Bombas de Fragmento (Fragment Bombs)
     5.6 Modificando Regras do Firewall
     5.7 Como configurar a proteção de IP Spoof?
     5.8 Projetos Avançados
        5.8.1 SPF: Stateful Packet Filtering
        5.8.2 Michael Hasenstein's ftp-data hack
     5.9 Avanços futuros

  6. Problemas Comuns

     6.1 ipchains -L Congela!
     6.2 Masquerading/Forwarding não funciona!
     6.3 -j REDIR não funciona!
     6.4 O uso de Coringas em Interfaces não funciona!
     6.5 TOS não funciona!
     6.6 ipautofw e ipportfw não funcionam!
     6.7 xosview esta com problema!
     6.8 Segmentation Fault com `-j REDIRECT'!
     6.9 Eu não posso configurar Timeouts em Masquerading!
     6.10 Eu desejo fazer Firewall em IPX!

  7. Um Exemplo Sério.

     7.1 O Arranjo
     7.2 Metas
     7.3 Antes da Filtragem de Pacotes
     7.4 Filtragem de Pacotes para Through Packets
        7.4.1 Set Up Jumps From forward Chain
        7.4.2 Define a icmp-acc Chain
        7.4.3 Bom (Interno) para DMZ (Servidores)
        7.4.4 Ruins (externos) para DMZ (servidores).
        7.4.5 Bom (internos) para Ruins (externos).
        7.4.6 DMZ para Good (internos).
        7.4.7 DMZ para Ruins (externos).
        7.4.8 Ruins (externos) para Bom (internos).
        7.4.9 Filtragem de Pacotes para sua própria Máquina Linux
           7.4.9.1 Má Interfaces (externas).
           7.4.9.2 Interface DMZ.
           7.4.9.3 Boa interface (interna).
     7.5 Finalmente

  8. Apêndice: Diferenças entre ipchains e ipfwadm.

     8.1 Tabela de Referência Rápida.
     8.2 Exemplos de comandos ipfwadm traduzidos

  9. Apêndice: Usando o script ipfwadm-wrapper.

  10. Apêndice: Agradecimentos.



  ______________________________________________________________________

  1.  Introdução

  Este é o Linux IPCHAINS-HOWTO; Veja "Onde?" para o ver site principal,
  que contém a última cópia. Você também deve ler o Linux NET-3-HOWTO.
  O IP-Masquerading HOWTO, o PPP-HOWTO, o Ethernet-HOWTO e o Firewall
  HOWTO que podem ser uma leitura interessante. (Então denovo a FAQ
  alt.fan.bigfoot).

  Se a filtragem de pacotes é passado para você, leia a seção "Porque?",
  Seção "Como?" e verifique os títulos na seção "IP Firewalling Chains".

  Se você esta convertendo através do ipfwadm, leia a secao "Introdução",
  Seção "Como?", e os Apêndices da seção "Diferenças entre ipchains
  e ipfwadm" e a seção "Usando o script ipfwadm-wrapper".


  1.1.  O que?

  O ipchains do Linux é uma regravação do codigo de firewall IPv4 do
  linux (que foi originalmente roubado do BSD) e uma regravação do
  ipfwadm, que foi uma regravação do ipfw dos BSD's, eu acho. É requerido
  para administrar os filtros de pacotes IP nos kernels do linux
  2.1.102 e superiores.


  1.2.  Por que?

  O antigo codigo do firewall do Linux não negociava com fragmentos,
  tinha contadores de 32 bits (no Intel no mínimo), não permitia
  especificação de outros protocolos senão TCP, UDP ou ICMS, não
  faziam grandes alterações dinâmicamente, não especificava regras
  contrárias, possuia alguns truques, e é dificil de gerenciar (
  podendo causar erros do usuário).


  1.3.  Como?

  Atualmente o código está no kernel em desenvolvimento do 2.1.192.
  Para as séries do kernel 2.0, você precisará fazer o download de um
  patch da página Internet. Se seu kernel 2.0 é mais recente que o patch
  fornecido, o patch antigo ser OK; esta parte dos kernels 2.0 é
  razoavelmente estável (eg. o patch do kernel 2.0.34 funciona perfeitamente
  com o kernel 2.0.35). Desde então o patch 2.0 é incompatível com patches do
  ipportfw e ipautofw, eu não recomendo aplica-los a não ser que você
  ralmente necessita da funcionalidade que o ipchains oferece.


  1.4.  Onde?

  A página oficial é The Linux IP Firewall Chains Page
  

  Lá existe uma lista de discussão para relatar bugs, discussões,
  desenvolvimento e uso. Entre na lista de discussão enviando uma
  mensagem contendo a palavra "subscribe" para ipchains-request em
  rustcorp.com. Para enviar E-Mails para a lista use "ipchains" ao
  invés de "ipchains-request".


  2.  Básico sobre a filtragem de pacotes

  2.1.  O que?

  Todo o tráfego da rede é enviado em forma de pacotes. Por exemplo,
  copiando este pacote (digamos de 50k) pode fazer você receber
  36 ou assim pacotes de 1460 bytes em cada um, (puxando números
  ao acaso).


  O inicio de cada pacote diz onde ele esta indo, de onde vem,
  o tipo do pacote, e outros detalhes administrativos. Isto
  inicia o pacote e é chamado de cabeçalho (head). O resto do pacote
  que contém o dado atual sendo transmitido, é usualmente chamado
  de corpo (body).


  Alguns protocolos, como TCP, que é usado para o trafego na web, mail,
  e logins remotos, usam o conceito de "conexão" -- antes de qualquer
  pacote com os dados atuais serem enviados, vários pacotes de
  configuração (com cabeçalhos especiais) são trocados dizendo "Eu
  desejo conectar", "OK" e "Obrigado". Então os pacotes normais são
  trocados.

 
  Uma filtragem de pacotes é uma peça de software que olha no cabeçalho
  do pacote quando eles passam, e decide o destino de todo o pacote.
  Ele pode decidir negar o pacote (DENY - ie. descartar o pacote como se ele
  nunca tivesse o recebido), aceita o pacote (ACCEPT - ie. deixar o pacote seguir
  adiante), ou rejeitar o pacote (REJECT - como negar, mas avisa a origem do pacote
  sobre o acontecido).


  No Linux, a filtragem de pacotes é embutida no kernel, e aqui
  estão algumas coisas que nós podemos fazer com os pacotes, mas o
  principio geral é de olhar o cabeçalho dos pacotes e decidindo seu
  destino.


  2.2.  Por que?

  Controle. Segurança.  Vigilância.



     Controle:
        quando você está usando um computador linux para conectar sua
        rede interna a outra rede (digo, a Internet) você tem a
        oportunidade de permitir certos tipos de tráfego, e desativar
        outros. Por exemplo, o cabeçalho do pacote contém o endereço de
        destino do pacote, assim você pode prevenir pacote de irem para
        certas partes de fora da rede. Como outro exemplo, eu uso o
        Netscape para acessar os arquivos Dilbert. Lá  estão anúncios
        da página doubleclick.net, e o Netscape desperdiça partes
        do meu tempo copiando-a. Dizendo para o filtro de pacotes
        não permitir qualquer pacotes para ou de o endereço conhecido
        por doubleclick.net resolve este problema (lá estão meios
        melhores de se fazer isto).

                                  
     Segurança:
        quando um computador linux é a única coisa entre o caos da
        Internet e sua bonita e organizada rede, é maravilhoso
        conhecer como você pode restringir o que vem batendo em sua
        porta. Por exemplo, você pode permitir ir para fora de sua
        rede, mas você pode estar preocupado com os conhecidos
        "Ping of Death" (ping da morte) que vem de computadores
        maliciosos de fora. Como outro exemplo, você pode não desejar
        que pessoas de fora TELNETiando seu computador linux, embora
        mesmo que todas suas contas tenham senhas; talvez você deseja
        (como muitas pessoas) ser um observador na Internet, e não um
        servidor (legando ou caso contrário) -- simplesmente não deixe
        ninguém conectar em seu computador, tendo filtros de pacotes
        rejeitando pacotes de entrada usado para iniciar conexões.

                                                                  
     Vigilância:
        muitas vezes uma máquina mal configurada na rede local pode
        decidir enviar pacotes para fora da rede. É bom dizer
        ao filtro de pacotes para avisa-lo se alguma coisa de
        anormal ocorre; talvez você pode fazer alguma coisa sobre
        isto, ou talvez você está simplesmente curioso por natureza.

  2.3.  Como?

  2.3.1.  Um kernel com filtragem de pacotes


  Você precisará de um kernel que tem o novo IP firewall chains nele.
  Você pode ver ser o kernel que está  executando tem isto instalado
  verificando pelo arquivo "/proc/net/ip_FWchains". Se ele existe,
  seu kernel tem o suporte.

  Caso contrário, você precisará compilar um kernel com o IP firewall
  chains. Primeiro copie o código fonte do kernel que deseja. Se possui
  um kernel númerado 2.1.102 ou maior, você não precisará aplicar o
  patch (está na versão principal do kernel agora). Caso contrário,
  aplique o patch da página web listada acima, e ajuste a configuração
  como detalhado abaixo. Se você não sabe como fazer isto, sem pânico --
  leia o Kernel-HOWTO.


  As opções de configuração que precisa configurar para os kernels
  da série 2.0 são:
                   
  ______________________________________________________________________
          CONFIG_EXPERIMENTAL=y
          CONFIG_FIREWALL=y
          CONFIG_IP_FIREWALL=y
          CONFIG_IP_FIREWALL_CHAINS=y
  ______________________________________________________________________



  Para os kernels da série 2.1 ou 2.2:

  ______________________________________________________________________
          CONFIG_FIREWALL=y
          CONFIG_IP_FIREWALL=y
  ______________________________________________________________________




  A ferramenta ipchains fala com o kernel e diz a ele quais pacotes
  filtrar. A não ser que você seja um programador, ou curioso demais,
  assim você controlará a filtragem de pacotes.


  2.3.2.  ipchains

  A ferramenta ipchains insere ou deleta regras da seção de filtragem
  de pacotes do kernel. Isto quer dizer que qualquer coisa que você
  configurar, será perdida na reinicialização; veja "Fazendo Regras
  Permanentes" para como fazer as regras serem restauradas quando
  o Linux é iniciado.

  ipchains substitui ipfwadm, que foi usado pelo antigo código
  de firewall de IP. Há um conjunto de scripts úteis disponíveis
  no site ftp do ipchains:

  ftp://ftp.rustcorp.com/ipchains/ipchains-scripts-1.1.2.tar.gz
  

  Este contém um script shell chamado ipfwadm-wrapper que permite 
  fazer a filtragem de pacotes como fez antes. Você provavelmente não
  deve usar este script a não ser se deseje fazer um método rápido
  de upgrade em um sistema que usa o ipfwadm (ele é lento, não checa
  argumentos, etc).
  Neste caso, você não precisa muito deste HOWTO.

  Veja Apêndice "Diferenças entre ipchains e ipfwadm" e Apêndice
  "Usando o script ipfwadm-wrapper" para um assunto mais detalhado
  sobre ipfwadm.


  2.3.3.  Fazendo regras permanentes

  Sua configuração atual do firewall é armazenada no kernel, e assim
  será perdida na reinicialziação. Eu recomendo usar os scripts
  "ipchains-save" e "ipchains-restore" para fazer estas regras
  permanentes. Para fazer isto, configure suas regras, então execute
  (como root):



       # ipchains-save > /etc/ipchains.rules
       #




  Crie um script parecido com o seguinte:



       #! /bin/sh
       # Script para controlar a filtragem de pacotes.

       # Se não existir regras, não faz nada.
       [ -f /etc/ipchains.rules ] || exit 0

       case "$1" in
           start)
               echo -n "Ativando a filtragem de pacotes:"
               /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
               echo 1 > /proc/sys/net/ipv4/ip_forward
               echo "."
               ;;
           stop)
               echo -n "Desativando a filtragem de pacotes:"
               echo 0 > /proc/sys/net/ipv4/ip_forward
               /sbin/ipchains -X
               /sbin/ipchains -F
               /sbin/ipchains -P input ACCEPT
               /sbin/ipchains -P output ACCEPT
               /sbin/ipchains -P forward ACCEPT
               echo "."
               ;;
           *)
               echo "Use: /etc/init.d/packetfilter {start|stop}"
               exit 1
               ;;
       esac

       exit 0




  Tenha certeza que isto está antes no processo de inicialização.
  No meu caso (Debian 2.1), eu fiz um link simbólico chamado 'S39packetfilter'
  em meu diret¢rio "/etc/rcS.d" (isto ser  executado antes de S40network).


  3.  Estou confuso!  Roteamento, masquerading, portforwarding, ipautofw...

  Este HOWTO é sobre filtragem de pacotes. Isto quer dizer decidindo
  que pacote terá permissão de passar ou não. No entanto, o Linux está 
  sendo um parque de diversões para hackers, você provavelmente desejará 
  mais do que isso.

  Um problema é que a mesma ferramenta ("ipchains") é usada para controlar
  tanto o masquerading e transparend proxy, embora estejam nacionalmente
  separados da filtragem de pacotes (a implementação atual do Linux
  obscurece estes junto não naturalmente, deixando a impressão
  que eles foram descontinuados).


  Masquerading e proxying são discutidos em HOWTOs separados, e as
  características auto forwarding e port forwarding são controladas
  por ferramentas separadas, mas mesmo assim muitas pessoas me perguntam
  sobre elas, eu também vou incluir diversos cenários comuns e indicar
  quando cada um deve ser aplicado. Os méritos de segurança de cada
  configuração não serão discutidos aqui.


  3.1.  Guia rápido de três linhas para Masquerading

  Isto assume que sua interface externa é chamada "ppp0". Use ifconfig
  para acha-la, e ajuste ao guia.



       # ipchains -P forward DENY
       # ipchains -A forward -i ppp0 -j MASQ
       # echo 1 > /proc/sys/net/ipv4/ip_forward




  3.2.  Promoção Gratuita: Regras WatchGuard

  Você pode comprar firewall separados. Um excelente é o WatchGuard
  FireBox. Ele é excelente porque eu gosto dele, é seguro, é baseado
  no Linux, e porque eles estão fundindo a manutanção do ipchains
  também como um novo código de firewall (almeijado para 2.3). Resumindo,
  WatchGuard está me pagando enquanto eu trabalho para você. Assim
  por favor considere este material.

  http://www.watchguard.com 


  3.3.  Configurações de firewall simples

  Você trabalha na littlecorp.com. Você tem uma rede interna, e uma 
  conexão dialup (PPP) simples com a Internet (firewall.littlecorp.com 
  que é 1.2.3.4). Você usa Ethernet em sua rede local, e sua máquina 
  pessoal é chamada "myhost".


  Esta seção ilustrará  os diferentes arranjos no qual são comuns.
  Leia com atenção porque cada um é sutilmente diferente.


  3.3.1.  Rede Privada: Proxies Tradicionais

  Neste cenário, pacotes vindo da rede privada nunca atravessam para a
  Internet, e vice versa. O endereço IP da rede privada usam os
  endereços de acordo com o RFC1597 Private Network Allocations (ie.
  10.*.*.*, 172.16.*.* or 192.168.*.*).

  O Único meio de se conectar com a Internet é conectando com o firewall,
  que é a única máquina na rede que conectam ambas. Você executa um
  programa (no firewall) chamado proxy para fazer isto (há proxies para
  FTP, acesso Web, telnet, RealAudio, Usenet News e outros serviços).
  Veja o Firewall HOWTO.

  Qualquer serviço que você deseja acessar na Internet deve estar no
  firewall (mas veja "Serviços Internos Limitados" abaixo).


  Exemplo: Permitindo acesso web da rede privada para a Internet.

  1. A rede privada usa endereços 192.168.1.*, com myhost sendo
     192.168.1.100, e a interface do firewall firewall sendo designada
     192.168.1.1.

  2. Um proxy web (eg. "squid") está instalado e configurado no
     firewall, digo executando na porta 8080.

  3. Netscape na rede privada está configurado para usar a porta 8080
     do firewall como um proxy.

  4. DNS não precisa ser configurado na rede privada.

  5. DNS não precisa estar configurado no firewall.

  6. Sem rota padrão (gateway) necessitando ser configurado na rede
     privada.


  Netscape em myhost lê http://slashdot.org.

  1. Netscape conecta-se com o firewall na porta 8080, usando a porta
     1050 em myhost. Ele pergunta pela página internet "http://slashdot.org".

  2. O proxy procura o nome "slashdot.org", e obtém 207.218.152.131. Ele
     abre uma conexão com aquele endereço IP (usando a porta 1025 na
     interface externa do firewall), e pergunta ao servidor web
     (porta 80) pela página web.

  3. Como ele recebe a página web de sua própria conexão com o servidor
     web, ele copia os dados para a conexão do Netscape.

  4. Netscape desenha a página.

  ie. Do ponto de vista de slashdot.org, a conexão é feita de
  1.2.3.4 (interface PPP do firewall) porta 1025 para 207.218.152.131
  (slashdot.org) porta 80. Do ponto de vista de myhost, a conexão é
  feita de 192.168.1.100 (myhost) porta 1050, para 192.168.1.1
  (interface Ethernet do firewall) porta 8080.



  3.3.2.  Rede Privada: Proxies Transparentes

  Neste cenário, pacotes da rede privada nunca atravessam a Internet
  e vice versa. O endereço IP da rede privada deve ser escolhido
  de acordo com o RFC1597 Private Network Allocations (ie.
  10.*.*.*, 172.16.*.* or 192.168.*.*).

  O Único meio de conectar com a internet é conectando com o firewall,
  que é a única máquina entre as duas redes e que conectam ambas.
  Você executa um programa (no firewall) chamando um proxy transparente
  para fazer isto; o kernel envia pacotes de saída para o
  transparent proxy ao invés de envia-los adiante (ie. ele abastarda
  o roteamento).

  Proxyes transparentes querem dizer que o cliente não precisa saber que
  há um proxy envolvido.

  Qualquer serviço que desejar acessar na Internet deve estar no firewall.
  (Mas veja "Serviços Internos Limitados" abaixo).


  Exemplo: Permitindo acesso web da rede privada para a Internet.

  1. A rede privada usa endereços 192.168.1.*, com myhost sendo
     192.168.1.100, e a interface Ethernet do firewall sendo 192.168.1.1.

  2. Um proxy web transparente (eu acredito que existem patches para squid
     para permitir ele operar desta maneira, ou tente "transproxy") ‚
     instalado e configurado no firewall, digo executando na porta 8080.

  3. O kernel esta configurado para redirecionar conexão para a porta 80
     do proxy, usando ipchains.

  4. Netscape na rede privada está configurado para conectar diretamente.

  5. DNS precisa estar configurado na rede privada (ie. você precisa
     executar um servidor DNS como um proxy no firewall).

  6. A rota default (gateway) precisa estar configurado na rede
     privada, para enviar pacotes para o firewall.

  Netscape em myhost lê http://slashdot.org.

  1. Netscape localiza o nome "slashdot.org", e obtem 207.218.152.131.
     Ele abre uma conexão para aquele endereço IP, usando a porta local
     1050, e pergunta ao servidor web (porta 80) pela página web.

  2. Como os pacotes de myhost (porta 1050) para slashdot.org (porta 80)
     passam pelo firewall, eles são direcionados para proxy transparente
     aguardando na porta 8080. O proxy transparente abre uma conexão
     usando (usando a porta local 1025) com 207.218.152.131 porta 80
     (que é aqui onde os pacotes originais estão indo).

  3. Como o proxy recebe a página web de sua conexão com o servidor web,
     ele copia os dados para a conexão com o Netscape.

  4. Netscape desenha a página.

  ie. Do ponto de vista de slashdot.org, a conexão é feita de
  1.2.3.4 (interface PPP do firewall) porta 1025 para 207.218.152.131
  (slashdot.org) porta 80. Do ponto de vista de myhost, a conexão
  é feita de 192.168.1.100 (myhost) porta 1050, para 207.218.152.131
  (slashdot.org) porta 80, mas ele está atualmente falando com o
  proxy transparente.
                     


  3.3.3.  Rede Privada: Masquerading

  Neste cenário, pacotes da rede privada nunca atravessam a Internet
  sem um tratamento especial, e vice versa. O endereço Ip da rede privada
  devem ser escolhidos de acordo com o RFC1597 Private
  Network Allocations (ie. 10.*.*.*, 172.16.*.* or 192.168.*.*).

  Ao invés de usar um proxy, nós usamos facilidades especiais do kernel
  chamadas "masquerading". Masquerading regravam pacotes quando passam
  através do firewall, assim eles sempre parecem vir do próprio firewall.
  Ele então re-escreve as respostas assim eles pareceram estar indo
  para o recipiente original.


  Masquerading possui módulos separados para manipular protocolos
  "enganados", como FTP, RealAudio, Quake, etc. Para procolos realmente
  difíceis de manipular, a facilidade "auto forwarding" pode manipular
  muitos destes configurando automáticamente o forward de portas para
  configurações de portas relacionadas:
  procure por "ipportfw" (kernels 2.0) ou "ipmasqadm" (kernels 2.1).


  Quaisquer serviços que você deseja acessar na Internet deve estar no
  firewall. (Mas veja "Serviços Internos Limitados" abaixo).

  Exemplo: Permitindo acesso web da rede privada com a Internet.


  1. A rede privada possui endereços 192.168.1.*, com myhost sendo
     192.168.1.100, e a interface Ethernet do firewall sendo 192.168.1.1.

  2. O firewall é configurado para masquerade (mascarar) qualquer pacotes
     vindo da rede privada e indo para a porta 80 de um host da internet.

  3. Netscape está configurado para conectar diretamente.

  4. DNS deve ser configurado corretamente na rede privada.

  5. O firewall deve ser a rota default (gateway) para a rede privada.


  Netscape em myhost lê http://slashdot.org.

  1. Netscape procura o nome "slashdot.org", e obtém 207.218.152.131. Ele
     então abre uma conexão para aquele endereço IP, usando a porta local
     1050, e pergunta ao servidor web (porta 80) pela página web.

  2. Como os pacotes de myhost (porta 1050) para slashdot.org (porta 80)
     passam através do firewall, eles são regravados para virem da
     interface PPP do firewall, porta 65000. O firewall possui um
     endereço Internet válido (1.2.3.4) assim responde pacote de
     www.linuxhq.com.

  3. Como pacotes de slashdot.org (porta 80) para firewall.littlecorp.com
     (port 65000) vem, eles são regravados para irem para myhost, porta
     1050. Esta é a mágica real do masquerading: ele relembra quando ele
     regravou pacotes enviados para regrar as respostas quando retornarem.

  4. Netscape desenha a página.

  ie. Do ponto de vista de slashdot.org, a conexão é feita de 1.2.3.4
  (interface PPP do firewall) porta 65000 para 207.218.152.131 (slashdot.org)
  porta 80. Do ponto de vista de myhost, a conexão é feita de 192.168.1.100
  (myhost) porta 1050, para 207.218.152.131 (slashdot.org) porta 80.



  3.3.4.  Rede Pública

  Neste cenário, sua rede pessoal é uma parte da Internet:
  pacotes pode seguir sem alterações através de ambas as redes. O endereço
  IP da rede interna deve ser escolhido aplicando por um bloco de endereços
  IP, assim o resto da rede conhecerá como obter pacotes para você.
  Isto implica em uma conexão permanente.

  Neste cenário, a filtragem de pacotes é usada para que pacotes podem
  ser direcionados entre sua rede e o resto da internet, eg. para
  restringir o resto da internet para somente acessar seus servidores
  web internos.

  Exemplo: Permitindo acesso web de sua rede privada para a Internet.

  1. Sua rede interna é configurada de acordo com os blocos de endereços
     IP que possui registrados, (digamos 1.2.3.*).

  2. O firewall está configurado para permitir qualquer tráfego.

  3. Netscape está configurado para conectar diretamente.

  4. DNS deve estar configurado corretamente em sua rede.

  5. O firewall deve ser a rota padrão (gateway) para sua rede privada.


  Netscape em myhost lê http://slashdot.org.

  1. Netscape procura o nome "slashdot.org", e obtém 207.218.152.131.
     Ele então abre uma conexão para aquele endereço IP, usando a
     porta local 1050, e pergunta do servidor web (porta 80) pela
     página web.

  2. Pacotes passam através do firewall, simplesmente como passam
     através de diversos firewalls entre você e slashdot.org.

  3. Netscape desenha a página.

  ie.  Aqui existe somente uma conexão: de 1.2.3.100 (myhost) porta 1050,
  para 207.218.152.131 (slashdot.org) porta 80.


  3.3.5.  Serviços Internos Limitados

  Existem alguns truques que você pode usar para permitir a Internet
  acessar seus serviços internos, em lugar de executar serviços no
  firewall. Estes funcionarão com aproximação baseada em proxy ou
  masquerading para conexões externas.

  Uma simples aproximação é executar um "redirector", que é um poor-man's
  proxy que aguarda por uma conexão em uma determinada porta, e então
  abre uma conexão em um porta e host fixo, e copia os dados entre as
  duas conexões. Um exemplo disto é o programa "redir". Do ponto de vista
  da Internet, a conexão é feita para seu firewall. Do ponto de vista
  de seu servidor interno, a coneão é feita da interface interna do
  firewall para o servidor.

  Outra aproximação (que requer um kernel 2.0 com patch para ipportfw,
  ou um kernel 2.1 ou superior) é usar um port forwarding no kernel.
  Isto faz o mesmo trabalho que o redir em um método diferente: o kernel
  regrava os pacotes enquanto passam, alterando seus endereços de
  destino e portas para apontarem para hosts e portas internas. Do ponto
  de vista da da internet, a conexão é feita para seu firewall. Do ponto
  de vista de seu servidor interno, uma conexão é feita do host Internet 
  para o servidor.



  3.4.  David Ranch escreveu um excelente novo HOWTO em Masquerading,
  que tem uma larga quantidade de materiais com este HOWTO. Você pode
  atualmente encontrar ete HOWTO em
  http://www.ecst.csuchico.edu/~dranch/LINUX/index-LINUX.html#ipmasq
  Mais detalhes sobre Masquerading

  Logo eu iria esperar que isto fosse encontrado em algum lugar do Projeto
  de documentação do Linux, em http://www.metalab.unc.edu/LDP
  


  A página oficial do Masquerading está disponível em

  http://ipmasq.cjb.net 



  4.  IP Firewalling Chains

  Esta seção descreve tudo o que você realmente precisa saber para
  construir um filtro de pacotes que se encaixe em suas necessidades.


  4.1.  Como os pacotes atravessam os filtros

  O kernel inicia com três listas de regras; estas listas são chamadas
  firewall chains ou simplesmente chains. Os três chains são chamados
  input output e forward. Quando um pacote entra (digo, através da
  placa Ethernet) o kernel usa o chain de entrada e decide seu destino.
  Se ele sobrevive a este passo, então o pr¢ximo passo do kernel é
  decidir onde enviar o pacote (isto é chamado roteamento). Se o seu
  destino for outra máquina, ele consultará o chain forward. Finalmente,
  antes de simplesmente o pacote ir para fora da rede, o kernel consulta
  o chain output.

  Um chain é uma lista de checagem de regras. Cada regra diz "se o cabeçalho
  do pacote parece com isto, então aqui esta o que fazer com o pacote". Se
  a regra não confere com o pacote, então a próxima regra no chain é
  consultada. Finalmente, se não existem mais regras a consultar, então
  o kernel procura no policiamento do chains para decidir o que fazer.
  Em um sistema consciente em segurança, este policiamento normalmente
  diz ao kernel para rejeitar ou negar o pacote.

  Para fans da arte em ASCII, isto mostra o caminho completo do pacote
  entrando em uma máquina.










          ----------------------------------------------------------------
          |            ACEITAR/                             interface lo |
          v           REDIRECIONAR              _______                  |
  --> C --> S --> ______ --> D --> ~~~~~~~~ -->|forward|----> _______ -->
      h     a    |input |    e    {Routing }   |Chain  |     |output |ACEITAR
      e     n    |Chain |    m    {Decision}   |_______| --->|Chain  |
      c     i    |______|    a     ~~~~~~~~        |     | ->|_______|
      k     t       |        s       |             |     | |     |
      s     y       |        q       |             v     | |     |
      u     |       v        e       v           NEGAR/  | |     v
      m     |     NEGAR/     r  Processo Local REJEITAR  | |   NEGAR/
      |     v   REJEITAR     a       |                   | |  REJEITAR
      |   NEGAR              d       --------------------- |
      v                      e -----------------------------
     NEGAR


  Aqui está uma descrição passo a passo de cada estágio:


     Checksum:
        Este é um teste para verificar se o pacote não está corrompido
        de alguma forma. Se estiver, ele é negado.


     Sanity:
        Esta é atualmente um destas checagens de sanidade antes de
        cada chain firewall, mas o chain input é o mais importante.
        Muitos pacotes malformados podem deixar o código de checagem
        de regras confuso, e estes são negados aqui (uma mensagem é
        mostrada no syslog se isto acontecer).


     input chain:
        Este é o primeiro chain firewall que será testado contra o
        pacote. Se a decisão do chain não for NEGAR ou REJEITAR,
        o pacote passa.


     Demasquerade:
        Se o pacote é uma resposta de um pacote anterior do masquerade,
        (mascaramento) ele é desmascarado, e pula para o chain output.
        Se você não usa o IP masquerading, você pode ignorar esta parte
        no diagrama.


     Routing decision (decisão do roteamento):
        O campo de destino é examinado pelo código de roteamento, para
        decidir se o pacote deve ir para um processo local (veja
        processos locais abaixo) ou direcionado (forward) para uma máquina
        remota (veja forward chains abaixo).


     Local process (processo local):
        Um processo sendo executado em uma máquina pode receber pacotes
        após o passo de decisão do roteamento, e pode enviar pacotes
        (que vão pelo passo de decisão do reteamento, quando atravessam
        o chain output).


     interface lo:
        Se pacotes de um processo locai são desinados a um processo
        local, eles vão através do chain output com a interface
        configurada para "lo", então retorna pelo chain input também
        com a interface "lo". A interface lo é normalmente chamada
        de interface loopback.

     local:
        Se o pacote não foi criado por um processo local, então o
        chain forward é checado, caso contrário o pacote vai através
        do chain output.

     forward chain:
        Este chain é usado para qualquer pacote que está tentando passar
        entre esta máquina para outra.

     output chain:
        Este chain é usado para todos os pacotes antes de serem enviados
        para fora.


  4.1.1.  Usando ipchains

  Primeiro, verifique se você tem a versão do ipchains que este documento
  se refere:



       $ ipchains --version
       ipchains 1.3.9, 17-Mar-1999




  Note que eu recomendo 1.3.4 (que não possui opões longas, como "--sport"),
  ou 1.3.8 ou superior; estes são muito estáveis.

  ipchains tem uma página de manual razoavelmente detalhada (man ipchains),
  e se você precisa de mais detalhes em particularidades, você deve checar
  a interface de programação (man 4 ipfw), ou o arquivo net/ipv4/ip_fw.c no
  código fonte do kernel 2.1.x, que é (obviamente) autoritativo.

  Também existem um excelente guia de referência rápida por Scott Bronson
  no pacote fonte, em ambas A4 e US Letter PosScript(TM).

  Existem diferentes outras coisas que você pode fazer com ipchains.
  Primeiro operações para gerenciar chains completos. Você inicia com
  três chains input, output e forward que voce não pode apagar.


  1. Criar um novo chain (-N).

  2. Deletar um chain vazio (-X).

  3. Alterar o policiamento de um chain embutido. (-P).

  4. Listar as regras em um chain (-L).

  5. Transportar (Flush) as regras fora do chain (-F).

  6. Zerar os contadores de pacote e byte em todas as regras no chain (-Z).

  Existem diversos meios de manipular regras dentro do chain:


  1. Adiciona uma nova regra no chain (-A).

  2. Insere uma nova na mesma posição no chain (-I).

  3. Substitui uma regra na mesma posição no chain (-R).

  4. Deleta uma regra na mesma posição no chain (-D).

  5. Deleta a primeira regra que confere no chain (-D).

  Existem poucas operações para masquerading, que estão no ipchains que
  é um bom lugar para coloca-las:


  1. Lista de conexões atuais do masquerade (-M -L).

  2. Configura os valores de tempo máximo (timeout) do masquerade (-M -S).
     (Mas veja "Eu não posso configurar tempo máximo no masquerade")

  O função final (e talvez a mais útil) permite a você checar o que
  aconteceu com o dado pacote se ele atravessou o chain.


  4.1.2.  Operações em uma regra Simples

  Este é o pão-e-manteiga do ipchains; manipulando regras. Mas especificamente
  você ira provavelmene usar os comandos append (-A) e delete (-D).
  os outros (-I para inserir e -R para substituir) são simples
  extensões nestes conceitos.

  Cada regra especifica uma cofiguração de condições em que o pacote
  se encontra, e o que fazer quando a encontra (um "alvo"). Por exemplo,
  você pode desejar negar todos os pacotes ICMS vindo do endereço IP
  127.0.0.1. Assim neste caso nossas condições são que o protocolo deve
  ser ICMS e que o endereço de origem deve ser 127.0.0.1. Nosso alvo é
  "NEGAR".

  127.0.0.1 ‚ a interface "loopback", que você tem‚ mesmo se não
  possuir uma conexão real da rede. Você pode usar o programa "ping"
  para gerar tais pacotes (ele simplesmente envia um ICMP tipo 8
  (echo request) com todos os hosts cooperativos que devem serviçalmente
  responder com o pacote ICMS tipo 0 (echo reply). Isto é útil para
  testes.



       # ping -c 1 127.0.0.1
       PING 127.0.0.1 (127.0.0.1): 56 data bytes
       64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms

       --- 127.0.0.1 ping statistics ---
       1 packets transmitted, 1 packets received, 0% packet loss
       round-trip min/avg/max = 0.2/0.2/0.2 ms
       # ipchains -A input -s 127.0.0.1 -p icmp -j DENY
       # ping -c 1 127.0.0.1
       PING 127.0.0.1 (127.0.0.1): 56 data bytes

       --- 127.0.0.1 ping statistics ---
       1 packets transmitted, 0 packets received, 100% packet loss
       #



  Você pode ver aqui que o primeiro ping se sucede( o "-c 1"que dizer
  para o ping enviar somente um pacote simples)

  Então nós adicionamos (-A) um chain "input", uma regra especificando
  que para pacotes vindo de 127.0.0.1 ("-s 127.0.0.1") com o protocolo
  ICMS ("-p ICMS") devem ser negados ("-j DENY").

  Quando nós testamos nossa regra, usando o segundo ping, Existe uma
  pausa antes do programa aguardar a resposta que nunca vem.

  Nós podemos apagar uma regra em um dos dois meios. Primeiro
  nós conhecemos que esta é a £nica regra no chain input, nós podemos
  usar um número para apagar, como em:


               # ipchains -D input 1
               #



  Para apagar a regra número 1 no chain input.


  O segundo meio é espelhar o comando -A, mas trocando o -A com -D.
  Isto é útil quando voce tem um complexo conjunto de regras e você não
  deseja conta-las para retirar a regra 37. Neste caso, nós podemos usar:


               # ipchains -D input -s 127.0.0.1 -p icmp -j DENY
               #




  A sintaxe de -D deve ter exatamente as mesmas opções que os comandos -A
  (ou -I ou -R). Se existem múltiplas regras idênticas no mesmo chain,
  somente a primeira ser  apagada.


  4.1.3.  Especificações de Filtragem

  Você deve sempre usar "-p" para especificar um protocolo, e "-s" para
  especificar um endereço de origem, mas existem outras opções que nós
  podemos usar para especificar características do pacote. O que segue
  é um compêndio exaustivo.

                           
  4.1.3.1.  Especificando o endereço IP de origem e Destino

  Endereços IPs de origem (-s) e destino (-d) podem ser especificados
  em quatro meios. O meio mais comum ‚ usar o nome completo, como "localhost"
  ou "www.linuxhq.com". O segundo método é especificar o endereço IP
  como "127.0.0.1".

  O terceiro e quarto meio permite especificar um grupo de endereços
  IPs, como "199.95.207.0/24" ou "199.95.207.0/255.255.255.0".
  Estes dois especificam qualquer endereços IP de 192.95.207.0 para
  192.95.207.255 inclusive; os digitos depois da "/" dizem dizem que
  a parte do endereço IP é significante. "/32" ou "/255.255.255.255" é
  o padrão (abrange todos os endereços IPs). Para especificar qualquer
  endereço IP, deve ser usado "/0", como no exemplo:



          # ipchains -A input -s 0/0 -j DENY
          #



  Isto é raramente usado, como o efeito acima é o mesmo como não 
  especificar a opção "-s".


  4.1.3.2.  Especificando Inversão

  Muitas opções, incluindo a "-s" e "-d" podem ter seus argumentos
  seguidos de "!" (que significa não) para atingirem endereços NÃO
  iguais ao especificado. Por exemplo, "-s ! localhost" atinge qualquer
  pacote menos de localhost.


  4.1.3.3.  Especificando o Protocolo

  O protocolo pode ser especificado com a opção "-p". O protocolo
  pode ser um número (se conhecer os valores numéricos dos protocolos
  para IP) ou um nome para casos especiais de "TCP", "UDP" ou "ICMP".
  Caso especificar "tcp" também funcinará como "TCP".

  O nome do protcolo pode usar o prefixo "!", para inverter a regra,
  como "-p ! TCP".


  4.1.3.3.1.  Especificando portas UDP e TCP

  Para casos especiais onde um protocolo TCP ou UDP é especificado,
  existem argumentos extras indicando a porta TCP ou UDP, ou um
  (exclusivo) faixa de portas (mas veja "Dirigindo Fragmentos" abaixo).
   Uma faixa é representada pelo caracter ":", como "6000:6010", que
   abrange 11 números de portas, de 6000 para 6010. Se o menor número
   é omitido, o padrão será 0. Se o maior número for omitido, o padrão
   será 65535. Assim para especificar conexões TCP vindo de portas abaixo
   de 1024, a sintaxe deve ser como "-p TCP -s 0.0.0.0/0 :1023". Números
   de portas podem ser especificadas por nomes, eg. "www".


  Note que a especificação de portas devem ser precedidas por uma "!",
  que inverte a regra. Assim para especificar qualquer pacote TCP menos
  uma pacote WWW, você deve especificar

  -p TCP -d 0.0.0.0/0 ! www


  É importante realizar aquela especificação


  -p TCP -d ! 192.168.1.1 www


  é muito diferente de 

  -p TCP -d 192.168.1.1 ! www


  A primeira especifica qualquer pacote TCP para a porta WWW em qualquer
  máquina menos 192.168.1.1. O segundo especifica qualquer conexão
  TCP para qualquer porta em 192.168.1.1 menos a porta WWW.

  Finalmente, este caso significa não para a porta WWW e não para 
  192.168.1.1:

  -p TCP -d ! 192.168.1.1 ! www




  4.1.3.3.2.  Especificando tipo do ICMP Type e Code

  ICMP também permite um argumento opcional, mas como ICMP não possui
  portas, (ICMP possui tipo e código) eles possuem diferentes significados.

  Você pode especifica-los como nomes ICMP (use ipchains -h icmp para
  listar os nomes) após a opão "-s", ou como um tipo e código ICMP
  numérico, onde os tipos seguem a opcão "-s" e o código segue a opção
  "-d".

  Os nomes ICMP são razoavelmente logos: você somente precisa usar
  bastante letras para fazer um nome se distinguir de outros.

  Aqui está um pequena tabela de alguns dos pacotes ICMP mais comuns:


       Número  Nome                     Requerido por

       0       echo-reply               ping
       3       destination-unreachable  Qualquer tráfego TCP/UDP.
       5       redirect                 roteamente se não estiver executando um daemon de roteamento
       8       echo-request             ping
       11      time-exceeded            traceroute




  Note que os nomes ICMS não podem ser precedidos de "!" no momento.


  NÃO, NÃO, NÃO, bloqueie as mensagems ICMP do tipo 3! (Veja "Pacotes
  ICMP" abaixo)


  4.1.3.4.  Especificando a Interface

  A opção "-i" especifica o nome de uma interface para atingir. Uma
  interface é o dispositivo físico onde o pacote vem, ou onde vai.
  Você pode usar o comando ifconfig para listas as interfaces que
  estão em "up" (ie. trabalhando no momento).

  A interface para pacotes de entrada (ie. pacotes atravessando
  as regras de entrada) é considerada sendo uma interface onde eles vem.
  Lógicamente, a interface para pacotes enviados (pacotes atravessando
  as regras de saída) é a interface onde eles vão. A interface para pacotes
  atravessando os chains forward é também a interface onde eles serão
  enviados para fora; me parece uma decisão bastante arbitrária.

  É perfeitamente legal especificar uma interface que atualmente não
  existe; a regra não atingirá  nada até que a interface seja iniciada.
  Isto é extremamente útil para conexões PPP dialup (normalmente a
  interface ppp0).

  Como um caso especial, um nome de interface finalizando com um "+"
  atinge todas as interfaces (até mesmo se existem atualmente ou não)
  que começam com aquele string. Por exemplo, para especificar uma regra
  que atinge todas as interfaces PPP, a opção "-i ppp+" pode ser usada.

  O nome da interface pode ser precedida por uma "!" para não atingir
  pacotes que NÃO conferem com a interface especificada.


  4.1.3.5.  Especificando somente pacotes TCP SYN

  É muitas vezes útil permitir conexões TCP em uma direção, mas não em
  outra. Por exemplo, você pode desejar permitir conexões para uma
  servidor WWW externo, mas não conexões daquele servidor.

  Uma aproximação ingênua pode ser bloquear pacotes TCP vindo do
  servidor. Infelizmente, conexões TCP requerem pacotes indo em ambas
  direções para funcionarem corretamente.

  A solução é bloquear somente os pacotes usados para requisitar uma
  conexão. Estes pacotes são chamados SYN (ok, técnicamente
  eles são pacotes com a flag SYN configurada, e as flags FIN e ACK
  limpas, mas nós os chamamos de pacotes SYN). Desativando
  somente estes pacotes, nós podemos parar tentativas de conexões
  em seus rastros.

  A flag "-y" é usada para isto: é somente válida para regras que
  especificam TCP como seu protocolo. Por exemplo, para especificar
  tentativas de conexão TCP de 192.168.1.1:

  -p TCP -s 192.168.1.1 -y



  Mais uma vez, esta opção pode ser invertida se for precedida de
  um "!", que diz que cada pacote sem ser a inicialização da conexão.


  4.1.3.6.  Dirigindo Fragmentos

  As vezes um pacote é muito largo para passar de uma só vez. Quando isto
  aconteçe, o pacote é dividido em framentos, e enviado como múltiplos
  pacotes. O outro lado remonta os fragmentos para reconstruir o
  pacote inteiro.


  O problema com fragmentos é que muitas das especificaçõess listadas
  acima (em particular, porta de origem, porta de destino, tipo ICMP,
  código ICMP, ou opção TCP SYN) requerem que o kernel verifique no
  inicio do pacote, que é o único que contém o primeiro fragmento.


  Se sua máquina é a única conectada a uma rede externa, então você
  pode dizer para o kernel do linux para remontar todos os fragmentos
  dos pacotes que passam através dele, compilando o kernel com IP: always
  defragment (sempre desfragmentar) configurado para "Y". Isto nítidamente
  evita isto.
  

  Caso contrário, é importante entender como os fragmentos são tratados
  pelas regras de filtragem. O primeiro fragmento é tratado
  como qualquer outro pacote. O segundo e os fragmentos seguintes não são.
  Assim uma regra -p TCP -s 192.168.1.1 www (especificando uma porta de
  origem de "www") nunca atingirá um fragmento (do segundo em diante).
  Nem será o oposto a regra -p TCP -s 192.168.1.1 ! www.


  No entanto, você pode especificar uma regra especificamente para o
  segundo e outros fragmentos, usando a opção "-f". Obviamente, é ilegal
  especificar uma porta TCP ou UDP, tipo ICMP, código ICMP ou a opção
  TCP SYN em tal regra de fragmento.

  É também permitido especificar que uma regra que não se aplica ao 
  segundo e fragmentos seguintes, procedendo "-f" com  "!".

  Normalmente é considerado como seguro deixar o segundo e outros
  fragmentos atravessarem, desde que a filtragem afetará o primeiro
  fragmento, e assim previne a remontagem no computador de destino,
  porém, tem sido conhecido bugs para permitir o travamento de máquinas
  simplesmente enviando fragmentos.

  Nota para cabeças de rede: pacotes mal formados (TCP, UDP e pacotes
  ICMP muitos curtos para o c¢digo de firewall ler as portas ou código
  e tipo ICMP) são tratados como fragmentos também. Sometne fragmentos
  TCP iniciando na posição 8 são explicitamente derrubados pelo código
  do firewall (uma mensagem aparecerá no syslog se isto ocorrer).

  Como um exemplo, a seguinte regra derrubará quaisquer fragmentos
  indo para 192.168.1.1:




       # ipchains -A output -f -d 192.168.1.1 -j DENY
       #





  4.1.4.  Efeitos do Lado da Filtragem

  OK, agora nÓs conhecemos todos os métodos que podemos atingir
  um pacote usando uma regra. Se um pacote confere com a regra, as
  seguintes coisas podem acontecer:


  1. O contador de byte para aquela regra é aumentado pelo tamando do
     pacote (cabeçalho e tudo).

  2. O contador de pacotes para aquela regra é incrementado.

  3. Se a regra o requisitar, o pacote é registrado.

  4. Se a regra o requisitar, o campo do pacote Type Of Service é
     alterado.

  5. Se a regra o requisitar, o pacote é marcado (não em kernels da série
     2.0).

  6. O alvo da regra é examinado para decidir o que fazer com o
     próximo pacote.

  Para variedade, todos estas regras estão em ordem de importância.


  4.1.4.1.  Especificando um alvo

  Um alvo diz ao kenrel o que fazer com um pacote que confere cum uma
  regra. ipchains usa "-j" (pense como "jump-to" - pular para) para a
  especificação do alvo. O nome do alvo deve ser menor que 8 letras, e
  case sensitive: "RETURN" e "return" são completamente diferentes.


  O caso mais simples é quando não há um alvo especificado. Este tipo de
  regra (muitas vezes chamado de uma regra de "contagem") é útil para
  uma contagem simples de certos tipos de pacotes. Se esta regra confere
  ou não, o kernel simplesmente examina a próxima regra no chain. Por
  exemplo, para contar o número de pacotes de 192.168.1.1, nós podemos
  fazer isto:


       # ipchains -A input -s 192.168.1.1
       #




  (Usando "ipchains -L -v" nós podemos ver os contadores e bytes
  associados com cada regra).


  Existem seis alvos especiais. Os primeiros três, ACCEPT, REJECT e
  DENY são muito simples. ACCEPT aceita o pacote, DENY bloqueia o
  pacote, é como se nunca o tivesse recebido. REJECT rejeita o pacote,
  mas (se ele não é um pacote ICMP) gera uma resposta ICMP para a
  origem para dizer que o destino está inalcançavel.


  A próxima, MASQ diz ao kernel mascarar (masquerade) o pacote. Para
  isto funcionar, seu kernel precisa estar compilado com IP Masquerading
  ativado. Para detalhes sobre isto, veja Masquerading_HOWTO e o
  apêndice "Diferenças ente ipchains e ipfwadm". Este alvo é somente
  válido para pacotes atravessando o chain forward.


  O alvo mais especial é REDIRECT que diz ao kernel para enviar um pacote
  para uma porta local em vez de onde tivesse vindo.
  Isto pode ser somente especificado por regras especificando TCP ou UDP
  como seus protocolos. Opcionalmente, uma porta (nome ou número) podem
  ser especificadas seguidas de "-j REDIRECT" que causar  o redirecionamento
  do pacote para uma porta particular, até mesmo se for endereçado para
  outra porta. Este alvo é somente válido para pacotes atravessando
  a regra de entrada.

  O alvo final especial é RETURN que é idêntico a cair fora do final
  da regra imediatamente. (Veja "Configurando o Policiamento" abaixo).

  Qualquer outro alvo indica uma regra definida pelo usuário (como
  descrita em "Operações em todo o Chain" abaixo). O pacote começará
  atravessando as regras naquele chain. Se aquele chain não decide o
  destino do pacote, então uma vez passam por aquele chain como
  finalizado, passar se resume na próxima regra no chain atual.

  Hora de mais arte ASCII. Considere dois (tolos) chains: input (o
  chain embutido) e Test (um chain definido pelo usuário).

           `input'                         `Test'
          ----------------------------    ----------------------------
          | Rule1: -p ICMP -j REJECT |    | Rule1: -s 192.168.1.1    |
          |--------------------------|    |--------------------------|
          | Rule2: -p TCP -j Test    |    | Rule2: -d 192.168.1.1    |
          |--------------------------|    ----------------------------
          | Rule3: -p UDP -j DENY    |
          ----------------------------



  Considerando um pacote TCP vindo de 192.168.1.1, indo para 1.2.3.4. Ele
  entra no chain input, e é testado na regra 1 - sem bater com a regra.
  A regra 2 bate, e seu alvo é Test, assim a próxima regra examinada é
  o inicio do teste. Regra 1 em test confere, mas não especifica um
  alvo, assim a próxima regra é examinada, Regra 2. Isto não confere,
  assim nós atingimos o final do chain. Nós retornamos ao chain de
  entrada, onde nós simplesmente examinamos a Regra 2, assim nós agora
  examinamos Regra3, que não confere.


  Assim o caminho do pacote é:

                                  v    __________________________
           `input'                |   /    `Test'                v
          ------------------------|--/    -----------------------|----
          | Rule1                 | /|    | Rule1                |   |
          |-----------------------|/-|    |----------------------|---|
          | Rule2                 /  |    | Rule2                |   |
          |--------------------------|    -----------------------v----
          | Rule3                 /--+___________________________/
          ------------------------|---
                                  v




  Veja a seção "Como organizar suas regras de Firewall" para meios para
  usar regras definidas pelo usu rios efetivamente.


  4.1.4.2.  Registrando pacotes

  Este é o lado do efeito que confere com uma regra que possui; você pode
  ter o pacote que bateu com a regra registrado com a opção "-l". Você
  normalmente não precisará disto para pacotes rotineiros, mas ela é uma
  característica útil se você deseja verificar por eventos excepcionais.


  O kernel registra esta informação parecida como:



       Packet log: input DENY eth0 PROTO=17 192.168.2.1:53 192.168.1.1:1025
         L=34 S=0x00 I=18 F=0x0000 T=254



  Esta mensagem de registro é designada para ser concisa, e contém
  informações técnicas úteis somente para gurus de rede, mas ela pode
  ser útil para o resto de nós. Cada uma que dizer o seguinte:



  1. "input" este é o chain que contém a regra que confere com o pacote,
     causando a mensagem de registro.

  2. "DENY" é o que a regra disse fazer com o pacote. Se isto é "-"
     então a regra não afetou o pacote (uma regra de registro).

  3. "eth0" é o nome da interface. Porque isto foi o chain de entrada, ela
     significa que o pacote veio de "eth0".

  4. "PROTO=17" significa que o pacote foi protocolo 17. Uma lista de
     números de protocolos esta disponível em "etc/prococols". Os mais
     comuns são 1 (ICMP), 6(TCP) e 17(UDP).

  5. "192.168.2.1" significa que o endereço IP de origem do pacote foi
     "192.168.2.1".

  6. ":53" significa que a porta de origem foi 53. Olhando em "/etc/services"
     é verificado que esta é uma porta "domínio" (ie. esta é provavelmente
     a resposta do DNS). Para UDP e TCP, este número é a porta de origem.
     Para ICMP, ele é o tipo ICMP. Para outros, ele será 65535.

  7. "192.168.0.1" é o IP de destino.

  8. ":1025" significa que a porta de destino foi 1025. Para UDP e TCP,
     este némero é a porta de destino. Para ICMP, ele é o código ICMP.
     Para outros, ele será 65535.

  9. "L=34" significa que o pacote teve um total de 34 bytes.

  10. "S=0x00" campo que significa o tipo do serviço (dividido por 4 para
     obter o tipo do serviço com usado pelo ipchains).

  11.
     `I=18' é a identificação do IP.

  12. "F=0x0000" é os fragmentos 16-bits offset plus flags. Um valor
     iniciando com "0x4" ou "0x5" significa que o bit de fragmento não
     esta configurado. "0x2" ou "0x3" significa que o bit "mais fragmentos"
     esta configurado; espere mais fragmentos após isto. O resto dos números
     são o offset deste fragmento, dividido por 8.

  13.
     "T=254" é o tempo de vida do pacote. Um é subtraído deste valor
     para cada ciclo, e normalmente iniciam em 15 ou 255.

  14.
     "(#5)" este pode ser um número final em parênteses em kernels mais
     recentes (talvez após 2.2.9). Este é um número de regra que causa
     o registro do pacotes.


  Em sistemas linux padrões, esta saída do kernel é capturada por klogd
  (o daemon de registro do kernel) que o envia para o syslogd (o daemon
  de registro do sistema). O arquivo "/etc/syslog.conf" controla o
  funcionamento de syslogd, especificando um destino para cada facilidade
  (facility - em nosso caso, a facilidade é "kernel") e nível (para ipchains,
  o nível usado é "info").

  Por exemplo, meu (Debian) /dec/syslog.conf contém duas linhas que
  conferem "kern.info":
                         

  kern.*                          -/var/log/kern.log
  *.=info;*.=notice;*.=warn;\
          auth,authpriv.none;\
          cron,daemon.none;\
          mail,news.none          -/var/log/messages




  Estas significam que as mensagem são duplicadas em "/var/log/kern.log" e
  "/var/log/messages". Para mais detalhes, veja "man syslog.conf".


  4.1.4.3.  Manipulando o tipo do Serviço

  Existem quatro bits raramente usados no cabe‡alho IP, chamaos de
  bits de tipo do serviço (TOS). Eles afetam o método como os pacotes são
  tratados; os quatros bits são "Minima Espera", "Máximo processamento",
  "Máxima Confiabilidade" e "Mínimo Custo". Somente um destes bits é
  permitido ser configurado. Rob van Nieuwkerk, o autor do TOS-mangling
  code, colocou o que segue:

       Especialmente o "Minimo de Espera" é importante para mim. Eu
       deixo ele ligado para pacotes "interativos" em meu
       roteador (Linux). Eu uso um modem de 33k6. O linux
       inicializa pacotes em 3 meios. Deste meio eu tenho
       performance interativa aceitável enquando faço downloads
       grandes ao mesmo tempo. (Ele pode até mesmo ser melhor se
       lá não tiver tal bit no driver serial, mas a latencia é
       mantida agora por 1.5 segundos).


  Nota: Obviamente, você tem o controle através de pacotes de entrada:
  você pode somente controlar a prioridade dos pacotes deixando seu
  computador. Para negociar prioridades com o outro computador, um
  protocolo como RSVP (que não conheço nada sobre ele, não me pergunte
  sobre isto) deve ser usado.

  O uso mais comum é configurar telnet e conexões de controle FTP para
  o "Minima Espera" e dados FTP para "Máximo Processamento". Isto
  pode ser feito como segue:


       ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
       ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
       ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08


  A opção "-t" pede dois parâmetros extras, ambos em hexadecimal. Estes
  permitem giros complexos dos bitos TOS: o primeira mascara é ANDed com
  o pacote atual TOS, e então a segunda máscara é XORed com ele.
  Se isto é muito confuso, apenas use a seguinte tabela:


  TOS Name                Value           Typical Uses

  Minimum Delay           0x01 0x10       ftp, telnet
  Maximum Throughput      0x01 0x08       ftp-data
  Maximum Reliability     0x01 0x04       snmp
  Minimum Cost            0x01 0x02       nntp



  Andi Klenn foi ao ponto fora dos seguintes (também editado para
  postaridade):

       Talvez ele pode ser £til para incluir uma referência para
       de ifconfig para a discussão sobre bits TOS. O tamanho do
       dispositivo padrão é afinado para placas ethernet, em
       modems ele é muito grande e faz os 3 agendamentos das bandas
       (que possui canais baseados no TOS) funcionarem subótimamente.
       É uma boa idéia configura-lo para um valor entre 4-10 no modem
       ou simples canal b para links ISDN: em dispositivos empacotados
       é necessário um grande canal.
       Este é uma problema 2.0 e não 2.1, mas em 2.1 ele é um opção
       do ifconfig (com nettools recentes), enquanto em 2.0 ele requer
       patches fontes nos controladores de dispositivos para alterar.

  Assim, para ver máximos beneficios da manipulação TOS para links
  de modems PPP, faça "ifconfig $1 txqueuelen" em seu /etc/ppp/ip-up script.
  O número usado depende da velocidade do modem e da quantidade de
  buffer no modem; aqui configurações que Andi me passou denovo:

       O melhor valor para dadas configurações precisam ser testadas.
       Se os canais são muito pequenos em um roteador então os pacotes
       serão derrubados. Também é claro que um obtém o benefício até
       mesmo sem regravação TOS, apenas aquela regravação TOS ajuda
       obter benefícios para programas não coperativos (mas todos os
       programas padrões do linux são coperativos).



  4.1.4.4.  Marcando um Pacote

  Isto permite complexas e poderosas interações com Alexey Kuznetsov's
  nova Qualidade de implementações de Serviço, também como forwarding
  baseado em marcas em kernels da série 2.1. Esta opção é no entanto
  ignorada em kernels da série 2.0.


  4.1.4.5.  Operações em todo o chain

  Uma característica muito útil do ipchains é a abilidade de agrupar
  regras relacionadas em chains. Você pode chamar chains do que 
  quiser, desde que não sejam nomes utilizados pelos chains embutidos
  (input, output e forward) ou os alvos (MASQ, REDIRECT, ACCEPT, DENY,
  REJECT ou RETURN). Eu sugiro evitar totalmente identificações em
  maiúsculas, porque que eu posso usar estas para futura extensão. O nome
  do chain pode ser maior que 8 caracteres.



  4.1.4.6.  Criando um novo chain

  Vou criar um novo chain. Porque eu sou como um imaginador da mesma
  categoria, eu chamarei isto de test.



  # ipchains -N test
  #




  É muito simples. Agora você pode colocar regras nele como detalhado acima.


  4.1.4.7.  Apagando um chain

  Apagar um chain também é simples.



       # ipchains -X test
       #



  Porque "-X"? Bem, todas as boas letras foram usadas.

  Existem um par de restrições para apagar chains: elas devem ser vazias
  (veja "Limpando um Chain" abaixo) e eles não devem ser o alvo
  de qualquer regra. Você não pode deletar qualquer destes três chains
  embutidos.


  4.1.4.8.  Limpando um Chain

  Existe um método simples de esvaziar todas as regras fora do chain, usando
  o comando "-F".



               # ipchains -F forward
               #




  Se você não especificar um chain, então todos os chains serão limpos.


  4.1.4.9.  Listando um chain

  Você pode listar todas as regras em um chain usando o comando "-L".



       # ipchains -L input
       Chain input (refcnt = 1): (policy ACCEPT)
       target     prot opt    source                destination           ports
       ACCEPT     icmp -----  anywhere              anywhere              any
       # ipchains -L test
       Chain test (refcnt = 0):
       target     prot opt    source                destination           ports
       DENY       icmp -----  localnet/24           anywhere              any
       #



  O "refcnt" listado para test é o número de regras que tem test como
  seu alvo. Este pode ser zero (e o chain ser vazio) antes deste chain
  ser apagado.

  Se o nome do chain é omitido, todos os chains são listados.

  Existem três opções que podem acompanhar "-L". A "-n" (numérica)
  opção é muito útil porque ela previne ipchains de tentar localizar
  endereços IP, que (se você esta usando DNS como muitas pessoas)
  causa larga espera se seu DNS se não estiver configurado corretamente,
  ou se você filtrará suas requisições DNS. Ele faz as portas serem listadas
  como números ao invés de nomes.

  A opção "-v" mostra os detalhes das regras, como o pacote e contadores
  de byes, as máscaras TOS, a interface, e a marca do pacote. Caso contrário
  estes valores são omitidos. Por exemplo:



       # ipchains -v -L input
       Chain input (refcnt = 1): (policy ACCEPT)
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any




  Note que o pacote e o contador do byte são mostrados usando os sufixos
  "K", "M" ou "G" para 100, 1,000,000 e 1,000,000,000 respectivamente.
  Usando a opção "-x" (n£meros expandidos) são mostrados números completos,
  não discutirei como eles são grandes.


  4.1.4.10.  Resetando (Zerando) Contadores

  Isto é útil para permitir resetar os contadores. Isto pode ser feito com
  a opção "-Z" (zero counters). Por exemplo:



       # ipchains -v -L input
       Chain input (refcnt = 1): (policy ACCEPT)
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
       # ipchains -Z input
       # ipchains -v -L input
       Chain input (refcnt = 1): (policy ACCEPT)
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
           0     0 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any
       #




  O problema disto é que muitas vezes você precisa conhecer os valores
  do contador imediatamente antes dele ser resetado. No exemplo acima,
  muitos pacotes pode passar entre os comandos "-L" e "-Z".
  Por esta razão, você pode usar "-L" e "-Z" juntos, para
  resetar os contadores enquando os lê. Infelizmene, se você fizer isto,
  você não poderá operar em um chain simples: você terá que listar e zerar
  todos os chains imediatamente.
       # ipchains -L -v -Z
       Chain input (policy ACCEPT):
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

       Chain forward (refcnt = 1): (policy ACCEPT)
       Chain output (refcnt = 1): (policy ACCEPT)
       Chain test (refcnt = 0):
           0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
       # ipchains -L -v
       Chain input (policy ACCEPT):
        pkts bytes target     prot opt   tosa tosx  ifname    mark        source                destination           ports
          10   840 ACCEPT     icmp ----- 0xFF 0x00  lo                    anywhere              anywhere              any

       Chain forward (refcnt = 1): (policy ACCEPT)
       Chain output (refcnt = 1): (policy ACCEPT)
       Chain test (refcnt = 0):
           0     0 DENY       icmp ----- 0xFF 0x00  ppp0                  localnet/24           anywhere              any
       #





  4.1.4.11.  Configurando o Policiamento

  Nós mostramos o que acontece quando um pacote atinge o final do
  chain de entrada embutido quando nós discutimos como um pacote anda
  através dos chains em "Especificando um Alvo" acima. Neste caso, o
  policiamento do chain determina o destino do pacote. Somente chains
  embutidos (input output e forward) tem policiamento, porque se um
  pacote cai no final de um chain definido pelo usuário, a passagem é
  resumida no chain anterior.


  O policiamento pode ser qualquer dos primeiros quatro alvos especiais:
  ACCEPT, DENY, REJECT, MASQ. MASQ é somente válido para o chain "forward".

  É também importante notar que o alvo RETURN em uma regra em um dos
  chains embutidos é útil para acertar o policiamento de um chain
  quando o pacote se encaixa em uma regra.


  4.1.5.  Operações em Masquerading

  Existem diversos parâmetros que você pode usar para IP Masquerading. Eles
  estão empacotados com ipchains porque não compensa fazer uma ferramenta
  separada para eles (no entanto isto pode mudar).

  O comando IP Masquerading é "-M", e ele pode ser combinado com "-L"
  para listar conexões Masquerade atuais, ou "-S" para configurar
  parâmetros masquerade.

  O comando "-L" pode ser acompanhado por "-n" (mostar números ao invés
  de nomes dos hosts e nomes das portas) ou "-v" (mostra deltas em
  números sequenciais para conexão masquerade, apenas em caso de
  preocupação).

  O comando "-S" deve ser seguido de três valores de timeout, cada um
  em segundos: para seções TCP, para seções TCP após um pacote FIN, e
  para pacotes UDP. Se você não desejar alterar um destes valores,
  simplesmente passe um valor "0".


  Os valores padrões estão listados em
  `/usr/src/linux/include/net/ip_masq.h', atualmente 15 minutos, 2
  minutos e 5 minutes respectivamente.


  O valor mais comum para ser alterado é o primeiro, para FTP (veja
  "Pesadelos FTP" abaixo).

  Note os problemas com as configurações de timeout listados em "Eu não
  posso configurar timeouts em masquerade!".


  4.1.6.  Checando um Pacote

  Muitas vezes você deseja ver o que esta acontecendo quando um certo
  pacote entra em sua máquina, tal como para verificar seus chains de
  entrada. ipchains tem o comando "-C" para permitir isto, usando
  exatamente as mesmas rotinas que o kernel usa para diagnosticar
  pacotes reais.
                
  Você especifica que chain testará o pacote seguido do argumento "-C"
  com seu nome. Considerando que o kernel sempre inicia atravessando
  os chains input, output e forward, você está permitido o inicio
  da travessia em qualquer chain para fins de testes.


  Os detalhes do "pacote" são especificados usando a mesma sintaxe
  usada para expecificar regras do firewall. Em particular, um protocolo
  ("-p"), endereço de origem ("-s"), endereço de destino ("-d") e
  interface ("-i") são compulsórios. Se o protoclo é TCP ou UDP, então
  uma porta simples de origem e destino devem ser especificadas, e um
  tipo ICMP e um código devem ser especificados para o protocolo ICMP
  (a não ser que a opção "-f" é espeficada para indicar uma regra de
  fragmento, em tal caso estas opções são ilegais).

  Se o protocolo é TCP (e a opção "-f" não é especificada), a opção
  "-y" deve ser especificada, para indicar que o pacote test deve
  ter o bit SYN ajustado.

  Aqui está um exemplo de teste de um pacote TCP SYN de 192.168.1.1 porta
  60000 para 192.168.1.2 porta www, vindo na interface eth0, entrando
  no chain "input". Isto é uma clássica inicialização de conexão WWW.



       # ipchains -C input -p tcp -y -i eth0 -s 192.168.1.1 60000 -d 192.168.1.2 www
       packet accepted
       #





  4.1.7.  Multiplas Regras at Once and Watching What Happens

  Muitas vezes uma simples linha de comando pode resultar em múltiplas
  regras sendo afetadas. Isto é feito em duas maneiras. Primeiro, se
  você especificar um hostname que resolve (usando DNS) múltiplos endereços
  IPs, ipchains pode atuar como se você tivesse digitado m£ltiplos comandos
  com cada combinação de endereços.

  Assim se o hostname "www.foo.com" resolve três endereços IPs, e o
  hostname "www.bar.com" resolve dois endereços IPs, então o comando
  "ipchains -A input -j reject -s www.bar.com -d www.foo.com" acumula
  seis regras para o chain de entrada.

  O outro meio de ter o ipchains fazendo múltiplas ações é usar a
  opção bidirecional ("-b"). Esta opção faz o ipchains se comportar como
  se você tivesse digitado o comando duas vezes, a segunda vez com os
  argumentos "-s"  e "-d" invertidos. Assim, para evitar forwarding
  para ou de 192.168.1.1, você deve fazer o seguinte:



       # ipchains -b -A forward -j reject -s 192.168.1.1
       #




  Pessoalmente, eu não gosto muito da opção "-b"; se você deseja
  conveniência, veja "Usando ipchains-save" abaixo.


  A opção -b pode ser usada com insert ("-I"), delete ("-D") (mas não
  com variações que pegam regras numúricas), comando append ("-A") e
  comando check ("-C").


  Outra opção útil é "-v" (verbose) que mostra exatamente o que o
  ipchains está fazendo com seus comandos. Isto é útil se você está
  negociando com comandos que podem afetar multiplas regras. Por exemplo,
  aqui nós checamos a ação dos fragmentos entre 192.68.1.1 e 192.168.1.2.



       # ipchains -v -b -C input -p tcp -f -s 192.168.1.1 -d 192.168.1.2 -i lo
         tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.1  -> 192.168.1.2    * ->   *
       packet accepted
         tcp opt   ---f- tos 0xFF 0x00  via lo    192.168.1.2  -> 192.168.1.1    * ->   *
       packet accepted
       #





  4.2.  Exemplos úteis

  Eu tenho uma conexão dialup PPP (-i ppp0). Eu pego news (-p TCP -s
  news.virtual.net.au nntp) e mail (-p TCP -s mail.virtual.net.au pop-3)
  a toda hora que disco. Eu uso o método FTP da Debian para atualizar
  minha máquina regularmente (-p TCP -y -s ftp.debian.org.au ftp-data).
  Eu surfo na WEB através do meu proxy ISP enquando isto está sendo
  feito (-p TCP -d proxy.virtual.net.au 8080), mas odeio os anúncios
  de doubleclick.net dos arquivos Dilbert (-p TCP -y -d 199.95.207.0/24 e
  -p TCP -y -d 199.95.208.0/24).


  Eu não noto pessoas tentando entrar pelo ftp em minha máquina enquando
  eu estou online (-p TCP -d $LOCALIP ftp), mas não desejo qualquer um
  de fora pretendendo ter um endereço IP de minha rede interna (-s 192.168.1.0/24).
  Isto é normalmente chamado de IP spoofing, e aqui está um belo meio de
  proteger você dele em kernels 2.1.x e superiores: veja "Como eu
  configuro a proteção IP spoof?".


  A configuração é razoavelmente simples, porque existem atualmente
  nenhuma outra máquina na minha rede interna.

  Eu não desejo que nenhum processo local (ie. Netscape, linx etc...) se 
  conecte em doubleclick.net:



       # ipchains -A output -d 199.95.207.0/24 -j REJECT
       # ipchains -A output -d 199.95.208.0/24 -j REJECT
       #




  Agora eu desejo configurar prioridades em varios pacotes de saída (não
  existe muitos motivos de se fazer isto em pacotes que entram). Desde
  que eu tenho diversos números destas regras, é sensato colocar todas elas
  em um simples chain, chamado ppp-out.



       # ipchains -N ppp-out
       # ipchains -A output -i ppp0 -j ppp-out
       #




  Minimo de espera para tráfego WEB e telnet.



       # ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
       # ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10
       #




  Baixo custo para dados ftp, nntp, pop-3:



       # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
       # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
       # ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02
       #




  Existem algumas restrições em pacotes vindo da inteface ppp0:
  deixe criar um chain chamado "ppp-in"




  # ipchains -N ppp-in
  # ipchains -A input -i ppp0 -j ppp-in
  #




  Agora, nenhum pacote vindo de ppp0 deve reivindicar um endereço de
  origem de 192.168.1.*, assim nós registramos e negamos todos eles:



       # ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY
       #




  Eu permito pacotes UDP para DNS (eu executo um programa de cache de
  nomes que redireciona todas as requisições para 203.29.16.1, assim
  eu espero respostas DNS somente dele), entrada FTP, e somente retorno
  de dados ftp(ftp-data) (que deve somente estar indo para uma porta
  acima de 1023, e não as portas X11 em torno de 6000).



       # ipchains -A ppp-in -p UDP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
       # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
       # ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
       # ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT
       #




  Finalmente, pacotes local-para-local estão OK:



       # ipchains -A input -i lo -j ACCEPT
       #




  Agora, meu policiamento padrão no chain de entrada é DENY, assim
  qualquer outra coisa é derrubada:



       # ipchains -P input DENY
       #




  NOTA: Eu não configurei meus chains nesta ordem, como os pacotes
  podem ir através da minha configuração. Seguramente é normalmente
  feito o DENY (bloqueio) primeiro, então inseridas as regras. É claro,
  se suas regras requerem chamadas DNS para resolver nomes de hosts,
  você terá problemas.


  4.2.1.  Usando ipchains-save

  Configurar regras de firewall simplesmente do jeito que desejar, e então
  tente se lembrar dos comandos que usou assim você pode estar na próxima
  hora em pane.

  Assim ipchains-save é um script que lê sua configuração atual dos chains
  e salva em um arquivo. No momento eu mantenho seu suspense sobre o que
  o ipchains-restore faz.

  ipchains-save pode salvar uma simples regra, ou todas as regras (se
  nenhum nome de regra é especificada). A única opção atualmente permitida
  é "-v" que mostra as regras (para stderr) quando são salvas. O
  policiamento do chain é também salvo para as regras input, output e 
  forward.



       # ipchains-save > my_firewall
       Saving `input'.
       Saving `output'.
       Saving `forward'.
       Saving `ppp-in'.
       Saving `ppp-out'.
       #





  4.2.2.  Usando ipchains-restore

  ipchains-restore restaura chains que foram salvos com ipchains-save.
  Ele pode usar duas opções "-v" que descreve cada resgra sendo incluída,
  e "-f" que força a limpeza de regras definidas pelo usuário se
  elas existem, como descrito abaixo.


  Se uma regra definida pelo usuário é encontrada em input, ipchains-restore
  checa se aquele chain realmente existe. Se existir, então você será 
  perguntado se os chains devem ser limpos (limpeza de todas as regras)
  ou se a restauração deste chain deve ser ignorada. Se você especificar
  "-f" na linha de comando, você não será perguntado; a regra será limpa.


  Por exemplo:



       # ipchains-restore < my_firewall
       Restoring `input'.
       Restoring `output'.
       Restoring `forward'.
       Restoring `ppp-in'.
       Chain `ppp-in' already exists. Skip or flush? [S/f]? s
       Skipping `ppp-in'.
       Restoring `ppp-out'.
       Chain `ppp-out' already exists. Skip or flush? [S/f]? f
       Flushing `ppp-out'.
       #





  5.  Diversos

  Esta seção contém todas as informações e FAQs que eu pude colocar dentro
  da estrutura do arquivo abaixo.


  5.1.  Como organizar suas regras de firewall

  Esta questão requer muita concentração. Você pode tentar organiza-las
  para melhorar a velocidade (minimizar o números de checagem de
  regras para os pacotes mais comuns) ou para diminuir o gerenciamento.

  Se você tiver um link intermitente, digamos PPP, você pode desejar
  configurar a primeira regra do chain de entrada para "-i ppp0 -j DENY"
  na inicialização, então tendo qualquer coisa como esta em seu script
  ip-up:



       # Re-create the `ppp-in' chain.
       ipchains-restore -f < ppp-in.firewall

       # Replace DENY rule with jump to ppp-handling chain.
       ipchains -R input 1 -i ppp0 -j ppp-in




  Seu script ip-down deve se parecer com isto:



       ipchains -R input 1 -i ppp0 -j DENY






  5.2.  O que não filtrar

  Existem muitas coisa que você deve estar atento antes de iniciar
  a filtragem de tudo o que não desejar.


  5.2.1.  Pacotes ICMP

  Pacotes ICMP são usados (entre outras coisas) para indicar falhas de
  outros protocolos (tal como TCP e UDP). Pacotes "destination-unreachable"
  em particular. Bloqueando estes pacotes significa que você nunca
  obterá erros "Host unreachable" ou "No route to host"; qualquer
  conexão simplesmente aguardará por uma resposta que nunca virá.
  Isto é irritante, mas raramente fatal.

  Um problema pior é o papel de pacotes ICMP em na descoberta MTU.
  Todas as boas implementações TCP (incluindo o Linux) usa a descoberta
  MTU para tentar entender qual pacote grande que pode ir para um destino
  sem ser fragmentado (fragmentação diminui a performance, especialmente
  quando fragmentos ocasionais são perdidos). Descoberta MTU funciona
  enviando pacotes com o bit "Don't Fragment" ajustado, e então enviando
  pacotes pequenos se ele obter um pacote ICMP indicando "Fragmentação
  necessária mas DF ajustado" ("fragmentação necessária"). Este é um tipo
  de pacote "destination-unreachable", e se ele nunca é recebido, o host
  local não reduzirá o MTU, e a performance será abismal ou não existente.
  Note que é comum ele bloquear todas as mensagens de redirecionamento
  ICMP (tipo 5); estas podem ser usados para manipular roteamento (embora
  boas stacks IP tem proteções), e assim são frequentemente vistas como
  ligeiramente ariscadas.


  5.2.2.  Conexões TCP para DNS (servidores de nomes)

  Se estiver tentando bloquear conexões TCP de saída, se lembre que
  DNS nem sempre usa UDP; se a resposta do servidor excede, 512 bytes,
  o cliente usa uma conexão TCP (ainda indo para o número de porta 53)
  para obter a resposta.

  Isto pode ser uma armadilha porque DNS sempre "trabalha principalmente" 
  se você bloquear tais transferências TCP; você pode experimentar esperas
  longas e estranhas ou outros problemas DNS ocasionais se você o fizer.

  Se suas requisições DNS sempre são direcionadas para a mesma origem
  externa (ou diretamente usando a linha nameserver em /etc/resolv.conf
  ou usando um servidor de nomes cache no modo forward), então você
  precisará somente permitir conexões TCP para a porta domínio naquele
  servidor de nomes da porta de domínio local (se usando um servidor
  de nomes cache) ou de uma porta alta (>1023) se estiver usando
  /etc/resolv.conf.


  5.2.3.  Pesadelos FTP

  O problema clássico de filtragem de pacotes é o FTP. FTP tem dois modos;
  um é o tradicional que é chamado modo ativo e o mais recente é chamado
  de modo passivo. Navegadores Web normalmente usam o modo passivo, mas
  programas FTP de linha de comando normalmente usam o modo ativo.


  No modo ativo, quando o computador remoto tenta enviar um arquivo (ou
  até mesmo o resultado de um comando ls ou dir) ele tenta abrir uma
  conexão TCP com a máquina local. Isto significa que você não pode
  filtrar estas conexões TCP sem bloquear o FTP ativo.

  Se você tem a opção de usar o modo passivo, então bem; modo passivo
  faz as conexäes de dados de cliente para servidor, até mesmo para
  dados de entrada. Caso contrário, é recomendado que você somente permita
  conexões TCP para portas acima de 1024 e não entre 6000 e 6010 (6000
  é usada pelo X-Window).


  5.3.  Filtrando o Ping of Death (ping da morte)

  Computadores Linux são agora imunes aos famosos Ping of Death, que
  envolve o envio de grandes pacotes ICMP ilegais que sobrecarrega
  os buffers na pilha TCP no receptor e causa destruição.

  Se você está protegendo computadores que podem ser vulneráveis, você
  deve simplesmente bloquear fragmentos ICMP. Pacotes normais ICMP
  não são grandes o bastante para requerer fragmentação, assim você
  não deve bloquear nada exceto grandes pings. Eu tenho ouvido (não
  confirmados) relatos que muitos sistemas requerem somente o último
  fragmento de um pacote ICMP acima de seu tamanho para o corromper,
  assim bloquear somente o primeiro fragmento não é recomendado.

  Sobre os programas exploit e tenho sempre visto que todos usam ICMP,
  não existem razões que fragmentos TCP ou UDP (ou um protocolo
  desconhecido) possa ser usado neste ataque, assim bloqueando
  fragmentos ICMP é somente uma solução temporária.


  5.4.  Filtrando o Teardrop e Bonk

  Teardrop e Bonk são dois ataques (principalmente sobre máquinas Microsoft
  Windows NT) que confiam em fragmentos sobrepostos. Tendo seu roteador
  Linux fazendo desfragmentação, ou não permitindo todos os fragmentos
  para suas máquinas vulneráveis são as outras opções.


  5.5.  Filtrando Bombas de Fragmento

  Algumas pilhas TCP são comentadas por ter problemas negociando com
  grandes números de fragmentos de pacotes quando eles não recebem
  todos os fragmentos. Linux não tem este problema. Você pode filtrar
  fora fragmentos (que podem interromper legitimos usuários) ou compilar
  seu kernel com "IP: always defragment" ajustado para "Y" (somente se
  seu computador linux é o roteador para estes pacotes).


  5.6.  Modificando regras do firewall

  Existem alguns assuntos cronometrados envolvidos em alterar regras
  do firewall. Se você não é cuidadoso, você pode deixar pacotes
  passarem enquanto estiver fazendo suas alterações. Uma solução
  simplíssima é fazer o seguinte:



       # ipchains -I input 1 -j DENY
       # ipchains -I output 1 -j DENY
       # ipchains -I forward 1 -j DENY

       ... faz alterações ...

       # ipchains -D input 1
       # ipchains -D output 1
       # ipchains -D forward 1
       #



  Isto bloqueia todos os pacotes durante as alterações.

  Se suas alterações são restritas para um chain simples, você deve
  criar um novo chain com novas regras, e então trocar ("-R") a
  regra que aponta para o antigo chain para a nova que aponta para o
  novo chain: então você pode apagar o antigo chain. Esta substituição
  ocorrerá atomicamente.


  5.7.  Como eu configuro a proteção IP Spoof?

  IP spoofing é uma técnica onde um host envia pacotes que parecem
  ser de outro host. Desde que a filtragem de pacotes faz decisões
  baseadas no endereço de origem, IP spoofing ‚ usado para filtros
  de pacotes bobos. Ele é também usado para ocultar a identidade
  de atacantes usando ataques SYN, Teardrop, Ping of Death e outros
  (não se preocupe se não sabe o que eles fazem).

  O melhor meio para proteger de IP spoofing é chamado Verificação
  do endereço de Origem, e é feito pelo código de roteamento, e não
  o firewall completamente. Procure por um arquivo chamado
  /proc/sys/net/ipv4/conf/all/rp_filter. Se ele existe, então
  ligando a Verificação do Endereço de Origem (Source Address Verification)
  em cada inicialização é a solução certa para você. Para fazer isto,
  insira as seguintes linhas em qualquer lugar de seus scripts init, antes
  de qualquer placa de rede ser inicializada:



       # This is the best method: turn on Source Address Verification and get
       # spoof protection on all current and future interfaces.
       if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
         echo -n "Setting up IP spoofing protection..."
         for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
             echo 1 > $f
         done
         echo "done."
       else
         echo PROBLEMS SETTING UP IP SPOOFING PROTECTION.  BE WORRIED.
         echo "CONTROL-D will exit from this shell and continue system startup."
         echo
         # Start a single user shell on the console
         /sbin/sulogin $CONSOLE
       fi




  Se você não puder fazer isto, você pode inserir manualmente regras para
  proteger cada interface. Isto requer conhecimento de cada interface.
  Os kernels 2.1 automáticamente rejeitam pacotes dizendo vir de
  endereços 127.* (reservados para a interfaceloopback local, lo).


  Por exemplo, digamos que temos três interfaces, eth0, eth1 e ppp0. Nós
  podemos usar ifconfig para nos dizer o endereço e netmask das interfaces.
  Digamos eth0 foi ligada a rede 192.168.1.0 com a netmasq 255.255.255.0,
  eth1 foi ligada a rede 10.0.0.0 com a netmask 255.0.0.0, e ppp0 conectado
  com a internet (onde qualquer endereço exceto endere‡os IP privados
  são permitodos), nós devemos inserir as seguintes regras:



       # ipchains -A input -i eth0 -s ! 192.168.1.0/255.255.255.0 -j DENY
       # ipchains -A input -i ! eth0 -s 192.168.1.0/255.255.255.0 -j DENY
       # ipchains -A input -i eth1 -s ! 10.0.0.0/255.0.0.0 -j DENY
       # ipchains -A input -i ! eth1 -s 10.0.0.0/255.0.0.0 -j DENY
       #




  Esta idéia não é tão boa como a Verificação do endereço de origem,
  porque se sua rede muda, você deve mudar suas regras de firewall
  para prevenila.

  Se você está executando um kernel da série 2.0, você pode desejar
  proteger a interface loopback também, usando uma regra como esta:



       # ipchains -A input -i ! lo -s 127.0.0.0/255.0.0.0 -j DENY
       #



  5.8.  Projetos Avançados

  Existe uma livraria userspace que eu escrevi que está incluida com
  a distribuição fonte chamada "libfw". Ela usa a abilidade de IP
  chains 1.3 e acima para copiar pacotes para userspace (usando a opção
  de configuração IP_FIREWALL_NETLINK).

  Os valores marcados pode ser usados para especificar os parâmetros
  da qualidade do serviço para pacotes, ou para especificar como
  os pacotes devem ser redirecionados para as portas. Eu nunca usei isto,
  mas se quiser escrever sobre ele, me contacte.


  Coisas tal como inspeções stateful (eu prefiro o termo
  firewall dinâmico) pode ser implementado no userspace usando esta
  biblioteca. Outras idéias bonitas incluem o controle de pacotes
  em uma base por-usuário fazendo uma procura emum daemos userspace.
  Isto pode ser muito fácil.


  5.8.1.  SPF: Condição para Filtragem de Pacotes (Stateful Packet Filtering)

  ftp://ftp.interlinx.bc.ca/pub/spf 
  no site Brian Murrell;s SPF projeto, que faz conexão localizada
  no userspace. Ele inclui segurança significativa para sites de
  baixa largura de banda.

  Existe uma documentação pequena presente, mas aqui está uma mensagem
  para a mailing list onde Brian respondeu muitas questões:



       > I believe it does exactly what I want: Installing a temporary
       > "backward"-rule to let packets in as a response to an
       > outgoing request.

       Yup, that is exactly what it does.  The more protocols it
       understands, the more "backward" rules it gets right.  Right
       now it has support for (from memory, please excuse any errors
       or omissions) FTP (both active and passive, in and out), some
       RealAudio, traceroute, ICMP and basic ICQ (inbound from the ICQ
       servers, and direct TCP connections, but alas the secondary
       direct TCP connections for things like file transfer, etc. are
       not there yet)

       > Is it a replacement for ipchains or a supplement?

       It is a supplement.  Think of ipchains as the engine to allow
       and prevent packets from travelling across a Linux box.  SPF is
       the driver, constantly monitoring traffic and telling ipchains
       how to change it's policies to reflect the changes in traffic
       patterns.





  5.8.2.  Michael Hasenstein's ftp-data hack

  Michael Hasenstein da SuSE escreveu um patch para o kernel que incluir
  localizações de conexões para o ipchains. Ele está atualmente localizado em:
  http://www.csn.tu-chemnitz.de/~mha/patch.ftp-data-2.gz
  

  
  5.9.  Avanços Futuros

  Firewalling e NAT estão sendo redesenhados para 2.3. Planos e
  discussões estão disponíveis nos arquivos netdev, e na lista
  ipchains-dev. Estes avanços devem limpar muitos assuntos
  de usabilidade (realmente, firewall e masquerade não deve ser
  difícil), e permitir o crescimento de firewalls mais flexíveis.


  6.  Problemas comuns


  6.1.  ipchains -L Trava!

  Você está provavelmente bloqueando chamada DNS; e eventualmente o
  time out. Tente usar a opção "-n" (númerico) com ipchains, que
  não mostra nomes.



  6.2.  Masquerading/Forwarding não funciona!

  Certifique-se que o forward de pacotes está ativado (em kernels
  recentes é desativado por padrão, dizendo que pacotes nunca tentam
  atravessar o chain "forward"). Você pode alterar isto (como root)
  digitando:



       # echo 1 > /proc/sys/net/ipv4/ip_forward
       #




  Se isto funciona para você, coloque isto em algum lugar em seus
  scripts de inicialização assim ele será ativado toda hora; você
  deve configurar seu firewall antes de executar este comando,
  caso contrário existe uma oportunidade de pacotes escaparem.



  6.3.  -j REDIR não funciona!

  Você deve permitir pacotes forward (veja acima) para o redirecionamento
  funcionar; caso contrário o código de roteamento bloqueia o pacote. Assim
  se você está simplesmente usando o redirecionamento, e não tem qualquer
  forward, você deverá estar atento a isto.

  Note que REDIR (sendo no chain input) não afeta conexões de um
  processo local.


  6.4.  Coringas nas Interfaces não funcinam!

  Existe um bug nas versões 2.1.102 e 2.1.103 do kernel (e alguns
  patches antigos que produzi) que fazem comandos ipchains falharem
  ao especificar uma inteface com coringas (tal como -i ppp+).


  Isto está corrigido nos kernels mais recentes, e no patch 2.0.34 do
  web site. Você pode também pode corrigir alterando o fonte do kernel
  alterando a linha 63 ou assim em include/linu/ip_fw.h


       #define IP_FW_F_MASK    0x002F  /* All possible flag bits mask   */





  Isto deve ser lido como ``0x003F''.  Corrija isto e recompile o kernel.


  6.5.  TOS não funciona!

  Isto foi meu erro: configurando o campo tipo do serviço não
  configurava atualmente o tipo do serviço nos kernels versões
  2.1.102 entre 2.1.111. Este problema foi corrigido em 2.1.112.


  6.6.  ipautofw e ipportfw não funcionam!

  Para 2.0.x, isto é verdade; Eu não tenho tempo para criar e manter um patch
  gigantesco para ipchains e ipautofw/ipportfw.


  Para 2.1.x, copia Juan Ciarlante's ipmasqadm de

  


  e use-o exetamente como usaria como ipautofw ou ipportfw, exceto
  ao invés de ipportfw você digita ipmasqadm portfw, e ao invés de
  ipautofw você deve digitar ipmasqadm autofw.


  6.7.  xosview está quebrado!

  Atualize para a versão 1.6.0 ou superior, que não requerem qualquer
  regra de firewall para kernels 2.1.x. Isto parece ter quebrado
  denovo no lançamento 1.6.1; por favor fale sobre o erro para o autor
  (este erro não é meu).


  6.8.  Falta de Segmentação com "-j REDIRECT"!

  Este foi um bug no ipchains versão 1.3.3.  Por favor atualize.



  6.9.  Eu não posso configurar tempo limite no masquerade!

  Verdadeiro (para kernels 2.1.x) até 2.1.123. Em 2.1.124, tentando
  configurar o tempo limite no masquerading causava uma chamada no
  kernel (altere return para ret = na linha
  1328 de net/ipv4/ip_fw.c). Em 2.1.125, funciona corretamente.


  6.10.  Eu desejo proteger IPX!

  Assim como outros, eu vejo. Meu código somente cobre IP, infelizmente.
  Do lado bom, todos os ganchos estão lá para IPX! Você apenas precisa
  re-escrever o código; Eu ficaria feliz em ajudar onde for possível.


  7.  Um exemplo Sério.

  Este exemplo foi extraído de Michael Neuling e meu tutorial
  LinuxWorld em Março de 1999; este não é o único meio de resolver
  o dado problema, mas ele é provavelmente o mais simples. Eu espero
  que você ache ele informativo.



  7.1.  O arranjo


  ·  Rede interna em Masquerade (vários sistemas opearacionais), que nós
     chamamos "GOOD".

  ·  Servidores expostos em uma rede separada (chamada "DMZ" para
     Zona Delimitada).

  ·  Conexão PPP para a Internet (chamada "BAD").




          Rede Externa (BAD)
                  |
                  |
              ppp0|
           ---------------
           | 192.84.219.1|             Servidor de Rede (DMZ)
           |             |eth0
           |             |----------------------------------------------
           |             |192.84.219.250 |             |              |
           |             |               |             |              |
           |192.168.1.250|               |             |              |
           ---------------          --------       -------        -------
                  | eth1            | SMTP |       | DNS |        | WWW |
                  |                 --------       -------        -------
                  |              192.84.219.128  192.84.219.129  192.84.218.130
                  |
          Rede Interna (GOOD)





  7.2.  Metas


  Filtragem de Pacotes:

      PING em qualquer rede
        Isto é realmente útil para dizer se uma máquina está desativada.


      TRACEROUTE em qualquer rede
        Mais uma vez, útil para diagnósticos.


      Acesso DNS
        Para fazer ping e DNS mais úteis.



  Dentro do DMZ:


  Servidor de Mail

  ·  SMTP para externo


  ·  Aceitar SMTP da rede interna e externa

  ·  Aceitar POP-3 da rede interna

  Servidor de Nomes

  ·  Enviar DNS para externa

  ·  Aceitar DNS da rede interna, externa e computador de filtragem de pacotes


  Servidor Web

  ·  Aceitar HTTP da rede interna e externa

  ·  Acesso Rsync da rede interna


  Interna:

     Permitir WWW, ftp, traceroute, ssh para rede externa
        Existem coisas razoavelmente padrões para permitir: muitos lugares
        iniciam permitindo máquinas internas fazer apenas tudo, mas
        aqui nós estamos sendo restritivos.


      Permitir SMTP para o Servidor Mail 
        Obviamente, nós desejamos enviar emais para fora.


      Permitir POP-3 para o Servidor de Mail
        Isto é como eles lerão seus Emails.


      Permitor DNS para o servidor de nomes
        Eles precisam ser capazes de procurar nomes externos para WWW,
        ftp, traceroute e ssh.


      Permitir rsync para o servidor Web
        Isto é como eles sincronizam o servidor web externo com o
        interno.


      Permitir WWW para o Servidor WEB
        Obviamente, eles devem ser capazes de conectar para servidoes
        web externos.


      Permitir ping para o computador de filtragem de pacotes
        Isto é uma coisa cortês para permitir: Isto significa que nós
        podemos testar se o firewall está operando (assim nós não
        teremos culpa de um site externos está quebrado).



  7.3.  Antes da Filtragem de pacotes


  ·  Anti-spoofing

     Desde que nós não temos qualquer roteamento asimétrico, nós podemos
     simplesmente ligar anti-spoofing para todas as interfaces.


       # for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f; done
       #





  ·  Configurando regras de filtragem para NEGAR tudo:


     Nós ainda permitimos tráfego no loopback local, mas bloqueamos
     qualquer outra coisa.




       # ipchains -A input -i ! lo -j DENY
       # ipchains -A output -i ! lo -j DENY
       # ipchains -A forward -j DENY
       #





  ·  Configurando Interfaces

     Isto é normalmente concluído com os scripts de inicialização.
     Tenha certeza que os passos acima estão concluídos antes das
     interfaces serem configuradas, para prevenir vazamentos de pacotes
     antes que as regras sejam definidas.


  ·  Inserir módulos masquerade por-protocolo.

     Nós precisamos inserir o módulo masquerade para FTP, assim que
     o FTP ativo e passivo "apenas trabalhe" na rede interna.




       # insmod ip_masq_ftp
       #





  7.4.  Filtragem de pacotes por pacotes

  Com masquerading, é melhor filtrar no chain forward.

  Divida o chain forward em vários chains de usuários dependendo
  das interfaces de origem/destino; Isto quebra o problema
  em pedaços menores.



       ipchains -N good-dmz
       ipchains -N bad-dmz
       ipchains -N good-bad
       ipchains -N dmz-good
       ipchains -N dmz-bad
       ipchains -N bad-good


  Aceitar (accept) erros simples ICMSs é uma coisa comum a fazer, assim
  nós criamos um chain para ele.



       ipchains -N icmp-acc





  7.4.1.  Configurando pulos para o chain forward

  Infelizmente, nós somente conhecemos (no chain forward) a interface
  de saída. Assim, entender que interface o pacote está vindo, nós
  usamos o endereço de origem (o anti-spoofing previne falsificação
  de endereço).

  Note que nós registramos qualquer coisa que não confira com qualquer
  um destes (obviamente, isto nunca deveria acontecer).



       ipchains -A forward -s 192.168.1.0/24 -i eth0 -j good-dmz
       ipchains -A forward -s 192.168.1.0/24 -i ppp0 -j good-bad
       ipchains -A forward -s 192.84.219.0/24 -i ppp0 -j dmz-bad
       ipchains -A forward -s 192.84.219.0/24 -i eth1 -j dmz-good
       ipchains -A forward -i eth0 -j bad-dmz
       ipchains -A forward -i eth1 -j bad-good
       ipchains -A forward -j DENY -l





  7.4.2.  Defina o chain icmp-acc 

  Pacote que são somente um dos erros ICMPs são aceitos, caso contrário,
  o controle passará ao chain chamado anteriormente.




       ipchains -A icmp-acc -p icmp --icmp-type destination-unreachable -j ACCEPT
       ipchains -A icmp-acc -p icmp --icmp-type source-quench -j ACCEPT
       ipchains -A icmp-acc -p icmp --icmp-type time-exceeded -j ACCEPT
       ipchains -A icmp-acc -p icmp --icmp-type parameter-problem -j ACCEPT





  7.4.3.  GOOD (Interno) para DMZ (Servidores)

  Restrições Internas:

  ·  Permitir WWW, ftp, traceroute, ssh para servidores externos

  ·  Permitir SMTP para o Servidor de Mail

  ·  Permitir POP-3 para o servidor de Mail

  ·  Permitir DNS para o servidor de Nomes

  ·  Permitir rsync para o servidor Web

  ·  Permitir WWW para o servidor Web

  ·  Permitir ping para o computador de filtragem de pacotes.

  Pode fazer o masquerading da rede interna em DMZ, mas aqui nós
  não faremos. Desde nenhum na rede interna deveria tentar fazer
  coisas maldosas, nós registramos qualquer pacote que foi negado.




       ipchains -A good-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.219.128 pop-3 -j ACCEPT
       ipchains -A good-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
       ipchains -A good-dmz -p tcp -d 192.84.218.130 rsync -j ACCEPT
       ipchains -A good-dmz -p icmp -j icmp-acc
       ipchains -A good-dmz -j DENY -l






  7.4.4.  Bad (externo) para DMZ (servidores).



  Restrições DMZ:

  ·  Servidor de Mail

  ·  SMTP para externo

  ·  Aceitar SMTP da rede interna e externa

  ·  Aceitar POP-3 da rede interna


  ·  Servidores de nomes

  ·  Enviar DNS para a rede externa

  ·  Aceitar DNS da rede interna, externa e computador de filtragem de pacotes


  ·  Servidor Web

  ·  Aceitar HTTP da rede interna e externa

  ·  Acesso Rsync da rede interna


  ·  Nós permitimos coisas da rede externa para DMZ.

  ·  Não registrar violações, como elas podem acontecer.









  ipchains -A bad-dmz -p tcp -d 192.84.219.128 smtp -j ACCEPT
  ipchains -A bad-dmz -p udp -d 192.84.219.129 domain -j ACCEPT
  ipchains -A bad-dmz -p tcp -d 192.84.219.129 domain -j ACCEPT
  ipchains -A bad-dmz -p tcp -d 192.84.218.130 www -j ACCEPT
  ipchains -A bad-dmz -p icmp -j icmp-acc
  ipchains -A bad-dmz -j DENY





  7.4.5.  Good (interna) para Bad (externa).


  ·  Restrições Internas:

  ·  Permitir WWW, ftp, traceroute, ssh para a rede externa

  ·  Permitir SMTP para o servidor de Mail

  ·  Permitir POP-3 para servidores de Mail

  ·  Permitir DNS para o Servidor de nomes

  ·  Permitir rsync para o servidor Web

  ·  Permitir WWW para o Servidor Web

  ·  Permitir ping para o computador de filtragem de pacotes

  ·  Muitas pessoas permitem qualquer coisa da rede interna para a externa,
     então adicionamos restrições. Nós estamos sendo facistas.

  ·  Log de violações.

  ·  FTP passivo dirigido pelo módulo masquerade.



       ipchains -A good-bad -p tcp --dport www -j MASQ
       ipchains -A good-bad -p tcp --dport ssh -j MASQ
       ipchains -A good-bad -p udp --dport 33434:33500 -j MASQ
       ipchains -A good-bad -p tcp --dport ftp --j MASQ
       ipchains -A good-bad -p icmp --icmp-type ping -j MASQ
       ipchains -A good-bad -j REJECT -l





  7.4.6.  DMZ para Good (intena).



  ·  Restrições Internas:

  ·  Permitir WWW, ftp, traceroute, ssh para a rede externa

  ·  Permitir SMTP para o servidor de Mail

  ·  Permitir POP-3 para o servidor de Mail

  ·  Permitir DNS para o servidor de nomes

  ·  Permitir rsync para o servidor Web

  ·  Permitir WWW para o servidor Web

  ·  Permitir ping para o computador de filtragem


  ·   Se nós estamos fazendo o masquerade da rede interna para a DMZ,
     simplesmente recusamos qualquer outro pacote vindo de outro
     meio. Permitindo somente pacote que são partes de uma conexão
     estabelecida.



       ipchains -A dmz-good -p tcp ! -y -s 192.84.219.128 smtp -j ACCEPT
       ipchains -A dmz-good -p udp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
       ipchains -A dmz-good -p tcp ! -y -s 192.84.218.130 rsync -j ACCEPT
       ipchains -A dmz-good -p icmp -j icmp-acc
       ipchains -A dmz-bad -j DENY -l





  7.4.7.  DMZ para bad (externa).



  ·  Restrições DMZ:

  ·  Servidor de Mail

  ·  SMTP para rede externa

  ·  Aceitar SMTP da rede interna e externa

  ·  Aceitar POP-3 da rede interna


  ·  Servidor de Nomes

  ·  Enviar DNS para a rede Externa

  ·  Aceitar DNS da rede interna, externa e computador de filtragem de pacotes


  ·  Servidor Web

  ·  Aceitar HTTP da rede interna e externa

  ·  Acesso Rsync da rede interna 


  ·


       ipchains -A dmz-bad -p tcp -s 192.84.219.128 smtp -j ACCEPT
       ipchains -A dmz-bad -p udp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-bad -p tcp -s 192.84.219.129 domain -j ACCEPT
       ipchains -A dmz-bad -p tcp ! -y -s 192.84.218.130 www -j ACCEPT
       ipchains -A dmz-bad -p icmp -j icmp-acc
       ipchains -A dmz-bad -j DENY -l





  7.4.8.  Bad (externa) para Good (interna).



  ·  Nós não permitimos nada (não-masquerade) da rede externa para a rede
     interna.

       ipchains -A bad-good -j REJECT





  7.4.9.  Filtragem de pacote para a própria máquina Linux


     
  ·  Se nós desejamos usar filtragem de pacotes em pacotes vindo da própria
     máquina, nós precisamos fazer a filtragem no chain de entrada. Nós
     criamos um chain para cada interface de destino:


       ipchains -N bad-if
       ipchains -N dmz-if
       ipchains -N good-if





  ·  Criamos saltos para elas:



       ipchains -A input -d 192.84.219.1 -j bad-if
       ipchains -A input -d 192.84.219.250 -j dmz-if
       ipchains -A input -d 192.168.1.250 -j good-if





  7.4.9.1.  Bad (externa) interface.



  ·  Computador de Filtragem de Pacotes:

  ·  PING em qualquer rede

  ·  TRACEROUTE em qualquer rede

  ·  Acesso DNS


  ·  Interface Externa também recebe respostas para pacotes masquerade,
     e erros ICMP para eles e respostas PING.








  ipchains -A bad-if -i ! ppp0 -j DENY -l
  ipchains -A bad-if -p TCP --dport 61000:65096 -j ACCEPT
  ipchains -A bad-if -p UDP --dport 61000:65096 -j ACCEPT
  ipchains -A bad-if -p ICMP --icmp-type pong -j ACCEPT
  ipchains -A bad-if -j icmp-acc
  ipchains -A bad-if -j DENY





  7.4.9.2.  Interface DMZ.



  ·  Restrições do computador de filtragem de pacotes:

  ·  PING em qualquer rede

  ·  TRACEROUTE em qualquer rede 

  ·  Acesso DNS


  ·  A interface DMZ recebe respostas DNS, respostas ping e erros ICMP.



       ipchains -A dmz-if -i ! eth0 -j DENY
       ipchains -A dmz-if -p TCP ! -y -s 192.84.219.129 53 -j ACCEPT
       ipchains -A dmz-if -p UDP -s 192.84.219.129 53 -j ACCEPT
       ipchains -A dmz-if -p ICMP --icmp-type pong -j ACCEPT
       ipchains -A dmz-if -j icmp-acc
       ipchains -A dmz-if -j DENY -l





  7.4.9.3.  Good (interna) Interface.



  ·  Restrições do computador de filtragem de pacotes:

  ·  PING em qualquer rede

  ·  TRACEROUTE em qualquer rede

  ·  Acesso DNS

  ·  Restrições Internas:

  ·  Permitir WWW, ftp, traceroute, ssh para external

  ·  Permitir SMTP para o servidor de Mail

  ·  Prmitir POP-3 para o servidor de Mail

  ·  Permitir DNS para o servidor de Nomes

  ·  Permitir rsync para o servidor Web

  ·  Permitir WWW para o servidor Web

  ·  Permiir ping para o computador de filtragem de pacotes


  ·  Interface interna recebe pings, respostas ping e erros ICMP.



       ipchains -A good-if -i ! eth1 -j DENY
       ipchains -A good-if -p ICMP --icmp-type ping -j ACCEPT
       ipchains -A good-if -p ICMP --icmp-type pong -j ACCEPT
       ipchains -A good-if -j icmp-acc
       ipchains -A good-if -j DENY -l





  7.5. Finalmente


  ·  Apaga-se as regras bloqueadas:


       ipchains -D input 1
       ipchains -D forward 1
       ipchains -D output 1





  8.  Apendice: Diferenças entre ipchains e ipfwadm

  Algumas destas alterações são resultados de alterações no kernel, e
  alguns resultados do ipchains sendo diferente de ipfwadm.



  1. Muitos argumentos foram remapeados: maiúsculas agora indicam um comando,
     e minúsculas indicam uma opção.

  2. Chains arbitrários são suportados, assim até mesmo chains embutidos
     tem nomes completos ao invés de opções.(eg. "input" ao invés de "-I").

  3. A opção "-k" foi retirada: use "! -y".

  4. A opção "-b"  atualmente insere/junta/apaga duas regras, em lugar de
     uma simples regra "bidirecional".

  5. A opção "-b" foi passada para "-C" para fazer duas checagens (uma em cada
     direção).

  6. A opção "-x" para "-l" foi substituida por "-v".

  7. Multiplas portas de origem e destino não são mais suportadas.
     Esperançosamente sendo capaz de negar faixa de portas será um
     pouco feito para aquilo.

  8. Interfaces podem somente ser especificadas por nome (não endereço).  A semântica
     antiga será silenciosamente alterada nos kernels série 2.1 de qualquer
     maneira.

  9. Fragmentos são examinadas, e não permitidos através do chain.

  10.
     chains de contas foram praticamente apagados.

  11.
     Protocolos arbitrários sobre IP foram testados.

  12.
     O antigo procedimento da conferência SYN e ACK (que foi anteriormente
     ignorada para pacotes não-TCP) foi alterado; a opção SYN não é
     válida para regras não específicas TCP.

  13.
     Contadores são agora de 64 bits em máquinas de 32 bits.

  14.
     Opções inversas são agora suportadas.

  15.
     Códigos ICMP são agora suportados.

  16.
     Interfaces curingas são agora suportadas.

  17.
     Manipulações TOS possuem agora checagem de sanidade: O antido código
     do kernel possuem agora checagem de sanidade: Ipchains agora retorna
     um erro neste caso, também para outros casos ilegais.


  8.1.  Tabela de referência rápida.

  [ Argumentos de comandos são em MAIÚSTULAS, e argumentos de opções são
    em minúsculas ]

  Uma coisa a notar, masquerade é especificado por "-j MASQ"; é
  completamente diferente de "-j ACCEPT", e não é tratado meramente
  como efeito de um lado, ao contrário do que ipfwadm faz.


  ================================================================
  | ipfwadm      | ipchains              | Notes
  ----------------------------------------------------------------
  | -A [both]    | -N acct               | Cria um chain "acct" e tem
  |              |& -I 1 input -j acct   | pacotes de saída e entrada
  |              |& -I 1 output -j acct  | atravessando-o.
  |              |& acct                 |
  ----------------------------------------------------------------
  | -A in        | input                 | Uma regra sem alvo
  ----------------------------------------------------------------
  | -A out       | output                | Uma regra sem alvo
  ----------------------------------------------------------------
  | -F           | forward               | Use isto como [chain].
  ----------------------------------------------------------------
  | -I           | input                 | Use isto como [chain].
  ----------------------------------------------------------------
  | -O           | output                | Use isto como [chain].
  ----------------------------------------------------------------
  | -M -l        | -M -L                 |
  ----------------------------------------------------------------
  | -M -s        | -M -S                 |
  ----------------------------------------------------------------
  | -a policy    | -A [chain] -j POLICY  | (mas veja -r e -m).
  ----------------------------------------------------------------
  | -d policy    | -D [chain] -j POLICY  | (mas veja -r e -m).
  ----------------------------------------------------------------
  | -i policy    | -I 1 [chain] -j POLICY| (mas veja -r e -m).
  ----------------------------------------------------------------
  | -l           | -L                    |
  ----------------------------------------------------------------
  | -z           | -Z                    |
  ----------------------------------------------------------------
  | -f           | -F                    |
  ----------------------------------------------------------------
  | -p           | -P                    |
  ----------------------------------------------------------------
  | -c           | -C                    |
  ----------------------------------------------------------------
  | -P           | -p                    |
  ----------------------------------------------------------------
  | -S           | -s                    | Só pega uma porta de uma
  |              |                       | faixa, não múltiplas portas.
  ----------------------------------------------------------------
  | -D           | -d                    | Só pega uma porta de uma
  |              |                       | faixa, não múltiplas portas.
  ----------------------------------------------------------------
  | -V           |                 | Use -i [nome].
  ----------------------------------------------------------------
  | -W           | -i                    |
  ----------------------------------------------------------------
  | -b           | -b                    | Agora atualmente faz 2 regras.
  ----------------------------------------------------------------
  | -e           | -v                    |
  ----------------------------------------------------------------
  | -k           | ! -y                  | Não funciona ao menos que
  |              |                       | -p tcp seja também especificado.
  ----------------------------------------------------------------
  | -m           | -j MASQ               |
  ----------------------------------------------------------------
  | -n           | -n                    |
  ----------------------------------------------------------------
  | -o           | -l                    |
  ----------------------------------------------------------------
  | -r [redirpt] | -j REDIRECT [redirpt] |
  ----------------------------------------------------------------
  | -t           | -t                    |
  ----------------------------------------------------------------
  | -v           | -v                    |
  ----------------------------------------------------------------
  | -x           | -x                    |
  ----------------------------------------------------------------
  | -y           | -y                    | Não funciona ao menos que
  |              |                       | -p tcp também seja especificado.
  ----------------------------------------------------------------




  8.2.  Exemplos de comandos ipfwadm traduzidos

  Antigo comando: ipfwadm -F  -p deny

  Novo comando: ipchains -P forward DENY


  Antigo comando: ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0

  Novo comando: ipchains -A forward -j MASQ -s 192.168.0.0/24 -d
  0.0.0.0/0


  Antigo comando: ipfwadm -I -a accept -V 10.1.2.1 -S 10.0.0.0/8 -D
  0.0.0.0/0

  Novo comando: ipchains -A input -j ACCEPT -i eth0 -s 10.0.0.0/8 -d
  0.0.0.0/0

  (Note que não existe equivalente para especificar interfaces por
  endereço: use o nome da interface.  Nesta máquina, 10.1.2.1
  corresponde a eth0).


  9.  Apêndice: Usando o script ipfwadm-wrapper.

  O shell script ipfwadm-wrapper deve ser um plug-in de substituição
  do ipfwadm para compatibilidade com ipfwadm 2.3a.

  A única característica que foi realmente alterada foi a opção "-V". Quando
  esta é usada, uma alerta é dado. Se a opção "-W" também é usada, a
  opção "-V" é ignorada. Caso contrário, os scripts tentam encontrar
  o nome da interface associada com aquele endereço, usando ifconfig. Se
  aquilo falha (tas como uma interface desativada) então ele sairá com
  uma mensagem de erro.

  Este alerta pode ser retirado alterando "-V" para "-W", ou
  direcionando a saída padrão do script para /dev/null.

  Se você puder encontrar qualquer erro neste script, ou qualquer
  alteração entre o ipfwadm e este script, por favor envie um bug para
  mim: envie um e-mail para ipchains@rustcorp.cm com "BUG-REPORT" no
  assunto. Por favor liste sua versão antiga do ipfwadm (ipfwadm -h), sua
  versão do ipchains (ipchains --version), a versão do script ipfwadm
  wrapper (ipfwadm-wrapper --version). Envie também a saída do ipchains-save.
  Agradeço antecipadamente.

  Misture ipchains com este script ipfwadm-wrapper por seu próprio risco.


  10.  Apêndice: Agradecimentos.

  Muitos gradecimentos para Michael Neuling, quem escreveu a
  primeira parte do código do IP chains enquanto trabalhava para mim.
  Apologias públicas para misturar estas idéias resultantes, enquanto
  Alan Cox propôs mais tarde e eu começei finalmente a implementar, tendo
  visto o erro de meus modos.

  Obrigado a Alan Cox por seu suporte técnico por E-Mail de 24 Horas,
  e encorajamento.


  Agradecimento a todos os autores do código ipfw e ipfwadm, especialmetne
  Jos Vos. Se levantando nos ombros de gigantes e tudo mais... Isto também
  se aplica a Linus Torvalds e todos os hackers de kernel e do userspace.


  Agradecimentos aos diligentes testadores de versões beta e caçadores
  de bugs, especialmente  Jordan Mendelson, Shaw Carruthers, Kevin Moule, 
  Dr. Liviu Daia, Helmut Adams, Franck Sicard, Kevin Littlejohn, Matt 
  Kemner, John D. Hardin, Alexey Kuznetsov, Leos Bitto, Jim Kunzman, 
  Gerard Gerritsen, Serge Sivkov, Andrew Burgess, Steve Schmidtke, 
  Richard Offer, Bernhard Weisshuhn, Larry Auton, Ambrose Li, Pavel Krauz, 
  Steve Chadsey, Francesco Potorti` and Alain Knaff.