                              _               _ _         
         _   _ _ __  ___  ___| | ___   _ _ __(_) |_ _   _ 
        | | | | '_ \/ __|/ _ \ |/ / | | | '__| | __| | | |
        | |_| | | | \__ \  __/   <| |_| | |  | | |_| |_| |
         \__,_|_| |_|___/\___|_|\_\\__,_|_|  |_|\__|\__, |
                     T     E     A     M            |___/ 
                                                 apresenta...



                ################################
                #TUTORIAL BASICO SOBRE IPCHAINS#
                ################################                



Escrito por segfault.
[segfault@mail.com]



                                        "A informacao deve ser compartilhada
                                                                  por todos."


Este tutorial bem como outros otimos tutoriais podem ser encontrados em:

http://unsekurity.virtualave.net   -> Home page oficial do grupo.


        Bem, este tutorial nao foi feito com o objetivo de lhe informar
*TUDO* sobre ipchains, mas sim ensinar o basico para que voce possa talvez
se interessar e aprender mais sobre o assunto. Um conhecimento basico de
Linux e TCP/IP seriam necessarios para um bom acompanhamento das 
informacoes aqui contidas. Recomendo a leitura do texto feito pelo module
que fala sobre o Projeto Loki (ICMP Tunneling) e tambem do texto sobre
TCP/IP feito pelo Dimitri Vashnov. 


INDICE:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INTRODUCAO................................................................1
POLITICA DE SEGURANCA DA REDE ATRAVES DO FIREWALL.........................2
FILTRAGEM DE PACOTES......................................................3
A TOPOLOGIA...............................................................4
COLOCANDO SUPORTE NO KERNEL PARA O IPCHAINS...............................5
CONSTANTES................................................................6
HABILITANDO TRAFEGO LOCAL.................................................7
FILTRAGEM DE PACOTES DA ORIGEM............................................8
O RESTO DAS REGRAS........................................................9
OS SCRIPTS...............................................................10
EXEMPLO DE SCRIPT PARA O SERVIDOR WEB....................................11
EXEMPLO DE SCRIPT PARA O SERVIDOR MAIL...................................12
REDIRECIONAMENTO E "MASCARAMENTO" NO LINUX...............................13
CONSTRUINDO KERNEL COM SUPORTE A MASCARAMENTO............................14
EXEMPLO DE SCRIPT PARA O SERVIDOR GATEWAY................................15
SCRIPT PARA CONEXOES DIAL-UP.............................................16
FINALIZANDO..............................................................17

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1. INTRODUCAO:

        Uma certa vez, eu li uma pergunta que era mais ou menos assim: "Alguem 
pode me dizer por que eu deveria escolher um firewall comercial em vez de apena
s
usar o IPchains e restringir algumas conexoes e coisas do tipo? O que eu
perco usando o IPchains?". Bom, certamente existem diversas respostas para
essas perguntas e sem duvida, uma grande discussao seria gerada em
consequencia dessas respostas.
        O IPchains eh muito bom e ha quem acredite que ele seja melhor que
os firewalls comerciais, devido a sua facilidade de uso e uma grande
quantidade de materiais existentes sobre ele pela internet.
        Mas o que faria o IPchains? Ele na verdade eh um software *opensource*
que serve para a administracao das regras do seu firewall. Ele eh usado para
configurar, fazer manutencao e inspecionar as regras no kernel do Linux.
Essas regras podem ser divididas em 4 partes: a IP chain("cadeia") de
entrada (input), a IP chain de saida (output) , a IP chain de retransmissao 
(forwarding) e as chains definidas pelo usuario.


2. POLITICA DE SEGURANCA DA REDE ATRAVES DO FIREWALL:

        Essa politica define quais servicos serao permitidos ou barrados,
como esses servicos serao usados e as exececoes dessas regras. Numa rede,
essa politica (regras) deve ser determinada de acordo com a necessidade de
seguranca, o que deveria ser prioridade em todas as redes (muito dificil
achar locais com firewalls). Geralmente, um firewall usa um dos metodos
abaixo:

_Tudo o que nao for especificado como permitido serah barrado_

        Esse tipo bloqueia todo o trafego entre duas redes com excessao 
daqueles servicos que seriam permitidos. Mas cada servico deveria ser 
configurado um a um. Como todos deveriam saber, nenhum servico que possa 
comprometer o sistema deveria ser permitido (wuftpd, qpop2.53, 
bind<8.2.2-P5, etc.). Esse metodo eh o mais seguro, pois o admin soh 
liberaria o que fosse realmente necessario, tendo um controle maior sobre 
o sistema. Esse metodo serah usado para a explicacao mais pra frente... :)

_Tudo que nao for especificado como barrado, serah permitido_

        Esse permite o trafego entre duas redes com excessao daqueles 
servicos que foram barrados. Ele pode parecer mais facil, mas como os 
ataques `as redes estao crescendo cada vez mais, nao seria muito recomendado. 


3. FILTRAGEM DE PACOTES:

        A filtragem de pacotes eh um tipo de firewall que estah inserido no
kernel do Linux. Esse tipo de firewall funciona ao nivel da rede, ou seja,
os dados soh poderiam sair do sistema se o firewall permitisse. Quando os
pacotes chegam, eles sao filtrados pelo seu tipo, endereco de origem,
endereco do destino e a informacao das portas contidas em cada pacote!
        Na maioria das vezes, a filtragem de pacotes trabalha junto com um
roteador que pode repassar os pacotes de acordo com as regras da filtragem.
Quando um pacote passa pelo roteador, ele extrai certas informacoes do 
cabecalho (header) do pacote e decide se o pacote pode passar ou deve ser 
barrado, de acordo com as regras de filtragem do firewall. Algumas 
informacoes podem ser extraidas do cabecalho de um pacote:

* O IP de origem;
* O IP de destino;
* A porta TCP/UDP de origem;
* A porta TCP/UDP de destino;
* O tipo de mensagem ICMP;
* A informacao encapsulada do protocolo (TCP, UDP, ICMP ou tunel IP).


4. A TOPOLOGIA:

        Todos os servidores deveriam ser configurados para bloquear portas
inutilizadas mesmo que eles nao sejam um firewall. Isso seria implementar a
seguranca numa rede e nao ser paranoico.. hehehe :) Imagine se alguem
consegue acesso `a sua rede, e os computadores ligados a ela nao estao
configurados para barrar certos tipos de servicos... a pessoa que conseguiu
penetrar na sua rede acharia uma maravilha, pois isso resulta em mais
maquinas, e um maior controle do que acontece na sua rede!! Um exemplo
basico:


(192.168.1.0/24)
                                             ---        -------------------
 ---     ---                                | 3 | <--- |Servidor Apache com|
| 4 |---| 5 |                                ---       |caching DNS        |
 ---     ---                                  |        |208.164.186.3      |
  |       |                                   |         -------------------
  |       |               ----------------    |
 ---     ---             |Servidor Gateway|   |
| 6 |---| 7 |            |DNS primario    |   |
 ---  |  ---             |208.164.186.1   |   F <------------> Firewalls
      |                   ----------------    |      |
      |                        |              |      |
      |    Rede Interna        `---------->  ---     |             ----------
      `-------------------------------------| 1 |----F------------| INTERNET |
                                             ---     |             ----------
                                              |      |
                        ----------------      |      |
                       |Servidor de MAIL|     F <----'
                       |DNS secundario  |     |
                       |208.164.186.2   |     |
                        ----------------     ---
                               `----------> | 2 |
                                             ---


Permissoes:
.-----------------------------------------------------------------------------,
| www.unsekurity.org     | server.unsekurity.org     | mail.unsekurity.org    |
| Caching DNS            | DNS primario              | DNS secundario         |
| 208.164.186.3          | 208.164.186.1             | 208.164.186.2          |
|------------------------|---------------------------|------------------------|
|1. trafego ilimitado na |1. trafego ilimitado na    |1. trafego ilimitado na |
|interface de loopback   |interface de loopback      |interface de loopback   |
|2. trafego de ICMP      |2. trafego de ICMP         |2. trafego de ICMP      |
|3. DNS Caching e cliente|3. servidor DNS e cliente  |3.servidor DNS e cliente|
|servidor na porta 53    |na porta 53                |na porta 53             |
|4. servidor SSH na porta|4. servidor SSH e cliente  |4.servidor SSH e cliente|
|22                      |na porta 22                |na porta 22             |
|5.servidor HTTP na porta|5. servidor HTTP e HTTPS   |5.servidor STMP e client|
|80 e HTTPS na porta 443 |nas portas 80 e 443        |na porta 25             |
|6. cliente STMP na porta|6. WWW-CACHE na porta 8080 |6. servidor IMAP na 143 |
|25                      |7. cliente externo na porta|7. requisicao de saida  |
|7.servidor FTP nas ports|110 (POP)                  |de traceroutes          |
 
|20 e 21                 |8. servidor e cliente SMTP |                        |
|8. Requisicao de saida  |na porta 25                |                        |
|de traceroutes          |9. servidor IMAP na 143    |                        |
|                        |10. clientes IRC na porta  |                        |
|                        |6667                       |                        |
|                        |11. clientes ICQ na porta  |                        |
|                        |4000                       |                        |
|                        |12. clientes FTP nas portas|                        |
|                        |20 e 21                    |                        |
|                        |13. Requisicao de saida    |                        |
|                        |de traceroutes             |                        |
`-----------------------------------------------------------------------------'

WWW.UNSEKURITY.ORG eh o nosso servidor WEB, MAIL.UNSEKURITY.ORG eh o nosso
servidor de MAIL para toda a rede interna, e SERVER.UNSEKURITY.ORG eh o
nosso servidor GATEWAY, que serah a nossa base de explicacao sobre o IPchains.
Como voces perceberam, "telnet" eh obsoleto, pois ao conectar voce envia o seu
login e senha em texto, podendo ser capturados por sniffers.. :)
Vale lembrar que o exemplo acima soh vale pro tutorial, voce deve montar as
suas politicas de acordo com a necessidade da sua rede!


5. COLOCANDO SUPORTE NO KERNEL PARA O IPCHAINS:

        A primeira coisa que voce deve fazer eh ter certeza que o kernel
estah compilado com suporte ao IPchains. Lembre-se que todas as maquinas da
rede deveriam estar configuradas para barrar portas inutilizadas (sempre
alguem tenta invadir a sua rede, mesmo que voce nao saiba!). No kernel
2.2.16 (outros tambem..hehe), ficaria assim:

[root@unsekurity:~]# cd /usr/src/linux
[root@unsekurity:/usr/src/linux]# make menuconfig

        Vah em "Networking options" e marque:

[*] Network firewalls
[*] IP: firewalling
[*] IP: TCP syncookie support (not enabled per default) 

Depois eh soh recompilar o kernel e rebootar a maquina...

[root@unsekurity:/usr/src/linux]# make dep ; make clean ; make bzImage ;
make modules ; make modules_install

:)


6. CONSTANTES USADAS NOS SCRIPTS:

INTERFACE_EXTERNA
Essa eh o nome da interface de rede externa, a interface que liga a rede com
a internet. Serah usada "eth0" nos exemplos.

INTERFACE_LOCAL_1 
Essa eh a interface de rede interna, a da LAN. Serah definida como "eth1".

LOOPBACK_INTERFACE
Essa eh a interface de loopback, serah definida como "lo".

IPADDR
Esse eh o endereco IP da sua interface externa. Pode ser um IP estatico
registrado com a InterNIC ou entao um IP designado dinamicamente pelo seu
ISP (geralmente via DHCP)

REDELOCAL_1
Eh o endereco da sua rede (LAN) local. Nos exemplos serah usado 192.168.1.0/24
, uma classe C privada.

QUALQUERLUGAR
Essa eh o nome para os enderecos usados pelo ipchains para encaixar
quaisquer enderecos. Serah usado any/0, o que significa 0.0.0.0/0

NAMESERVER_1
Esse eh o IP do servidor primario de DNS da sua rede, ou do seu ISP.

NAMESERVER_2
Eh o IP do seu servidor secundario de DNS da sua rede, ou do ISP.

LOOPBACK
O alcance do loopback eh 127.0.0.0/8. A interface em si ja estah definida
como 127.0.0.1 (em /etc/hosts).

PORTASPRIV
Sao as portas privilegiadas, de 0 a 1023.

PORTASNAOPRIV
Sao as portas nao privilegiadas, de 1024 ateh 65535. Sao portas designadas
dinamicamente para a parte cliente de uma conexao.

Politica Padrao:

Um firewall tem uma politica padrao e uma lista de acoes para fazer em
resposta a tipos especificos de mensagens. Isso significa que se um certo
pacote nao foi selecionado por uma ou outra regra, entao a politica(regra)
padrao serah aplicada. 


7. HABILITANDO TRAFEGO LOCAL:

        Levando em conta que as regras padroes para os exemplos do tutorial
sao de barrar tudo, algumas regras devem ser mudadas. Servicos de rede locais
nao passam pela interface de rede interna, mas sim por uma especial, privada
interface chamada "LOOPBACK INTERFACE". Nenhum dos seus programas de rede irao
funcionar enquanto nao for permitido trafego nessa interface!!!

# Trafego ilimitado na interface de loopback!

ipchains -A input -i $LOOPBACK_INTERFACE -j ACCEPT
ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT


-A --> APPEND: adiciona uma ou mais regras para o final da chain
selecionada (input ou output, no caso acima). 

-i --> INTERFACE: interface na qual os pacotes sao recebidos ou estao sendo
enviados. Essa opcao pode ser omitida, entao todas as interfaces serao
selecionadas. Se for usado o caracter "!", entao o sentido da regra serah 
invertido. Se a interface terminar com um "+", entao todas as interfaces que 
comecam com os caracteres antes do "+" serao selecionadas.

-j --> JUMP: especifica o destino da regra. Ou seja, o que fazer se o pacote
se encaixar nas regras especificadas.


8. FILTRAGEM DE PACOTES DA ORIGEM:

        Todos os cabecalhos(headers) de pacotes contem a origem e destino dos 
IPs e o tipo da mensagem do protocolo (ICMP, TCP ou UDP). Isso quer dizer que
a identificacao do Protocolo de Internet (Internet Protocol, IP) eh o endereco
de origem contido no cabecalho do pacote!! Isso eh um problema que abre uma
porta para o "spoofing", uma tentativa de forjar o IP real de origem!

# Recusar pacotes forjados tentando parecer como se fossem do IP externo!!

ipchains -A input -i $INTERFACE_EXTERNA -s $IPADDR -l -j DENY

-s --> SOURCE: eh o endereco de origem. Pode ser o hostname, uma rede ou um
endereco IP. 

-l --> LOG: ativa o kernel logging dos pacotes que se encaixam nas regras.
Quando essa opcao estah ativada, serao gravadas informacoes sobre todos os
pacotes que se encaixaram (geralmente os cabecalhos dos IPS) via printk().
Esse log pode ser modificado na config do syslogd (/etc/syslog.conf),
adicionando "kern.*         /local/do/log". 

        Na opcao "-s", eu omiti algumas partes da sua sintaxe, pois no exemplo 
o que eu deveria explicar era apenas o que ele faz no mesmo. Mais pra frente a 
sua sintaxe serah explicada melhor!! :)

        Existem tambem pelo menos mais 7 tipos de enderecos de origem que
deveriam ser filtrados pela sua interface externa em TODOS os casos!!
Sao os pacotes que fingem vir de:

* Seu IP externo;
* Uma classe A de IPs privados;
* Uma classe B de IPs privados;
* Uma classe C de IPs privados;
* Uma classe D de enderecos multicast;
* Uma classe E de enderecos reservados;
* Da interface local.

        Com excecao do seu proprio IP, bloquear pacotes de saida contendo
esses enderecos de origem protege voce de um possivel erro de configuracao!

OBS: Nao esqueca de excluir o seu IP dos pacotes que serao bloqueados!!


9. O RESTO DAS REGRAS:

        As outras regras usadas nos scripts serao:

* Acesso de um servico disponivel na Internet;
* Disponibilizacao de um servico para todos na Internet;
* Masquerading("compartilhamento") com as maquinas internas.


10. OS SCRIPTS DO FIREWALL:

        O utilitario IPchains permite que voce configure firewalls, IP
masquerading, etc. O IPchains "conversa" com o kernel e diz a ele quais
pacotes devem ser filtrados. Apesar de as suas configuracoes estarem
configuradas no kernel, apos um reboot, elas serao perdidas. Para prevenir
isso, eu recomendo o uso dos inits scripts do System V, para que as suas
regras sejam permanentes. Para fazer isso, crie um script como o que serah
mostrado abaixo em "/etc/rc.d/init.d/" para cada servidor que voce tiver. Eh
claro que cada servidor terah uma configuracao diferente, entao voce deverah
personaliza-lo!! Por isso, eu disponibilizarei 3 tipos de scripts, com os
quais voce pode modificar para as suas necessidades.
        Agora, usuarios do Slackware que possuem um certo conhecimento devem
estar dizendo: "Putz, ele usa Red Hat" ou "Nao tenho esse diretorio", mas
isso nao importa, pois eu acho o meu Red Hat bem estavel e nao eh tao
inseguro, hehe! Os usuarios do slackware podem criar o diretorio que eu
mencionei e depois adicionar uma chamada ao nome do script no rc.local!
Assim: echo "/etc/rc.d/init.d/nome-do-script" >> /etc/rc.d/rc.local , onde
"nome-do-script" deve ser substituido pelo seu respectivo nome..


11. EXEMPLO DE UM SCRIPT "/etc/rc.d/init.d/firewall" PARA O SERVIDOR WEB:

        Essa eh a configuracao do nosso servidor web (WWW.UNSEKURITY.ORG,
lembram?). Essa configuracao permite: Trafego ilimitado na interface de
loopback, ICMP, DNS Caching e Cliente-Servidor (na porta 53), servidor SSH
(22), servidor HTTP (80), servidor HTTPS (443), cliente SMTP (25), servidor
FTP (20, 21), e requisicoes de SAIDA DE TRACEROUTE por padrao!
        Se voce nao quiser que alguns servicos listados no script sejam
ativados por padrao, basta comenta-los, adicionando "#" na frente de cada
linha desejada. Ou se quiser que uma regra seja adicionada e que esteja
comentada, basta retirar o "#".

Crie o script de firewall (touch /etc/rc.d/init.d/firewall) do seu servidor
WEB e adicione:

#!/bin/sh
#
# Adaptado para o tutorial de IPCHAINS por segfault.
# 11/07/2000
# Unsekurity Team.
# 
# ----------------------------------------------------------------------------
# Modified by Gerhard Mourani:  02-01-2000
# ----------------------------------------------------------------------------
# Copyright (C) 1997, 1998, 1999  Robert L. Ziegler
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for educational, research, private and non-profit purposes,
# without fee, and without a written agreement is hereby granted. 
# This software is provided as an example and basis for individual firewall
# development.  This software is provided without warranty.
#
# Any material furnished by Robert L. Ziegler is furnished on an 
# "as is" basis.  He makes no warranties of any kind, either expressed 
# or implied as to any matter including, but not limited to, warranty 
# of fitness for a particular purpose, exclusivity or results obtained
# from use of the material.
# ----------------------------------------------------------------------------
#
# Inicializado em /etc/rc.d/init.d/firewall.
# chkconfig: - 60 95
# descricao: Inicia e para o firewall IPCHAINS.
#             

# Source function library.
. /etc/rc.d/init.d/functions # Usuarios do Slackware: comentem esta linha. 

# Source networking configuration.
. /etc/sysconfig/network     # Usuarios do Slackware: comentem esta linha.

# Check that networking is up.
if [ ${NETWORKING} = "no" ]  # Usuarios do Slackware: comentem esta linha.
then                         # Usuarios do Slackware: comentem esta linha.
        exit 0               # Usuarios do Slackware: comentem esta linha.
fi                           # Usuarios do Slackware: comentem esta linha.

[ -f /sbin/ipchains ] || exit 0 

# See how we were called.
case "$1" in                 # Usuarios do Slackware: comentem esta linha.
  start)                     # Usuarios do Slackware: comentem esta linha.
        echo -n "Iniciando servicos de Firewall: "

# Algumas definicoes para uma manutencao facil.

# ----------------------------------------------------------------------------
#  EDITE AS CONSTANTES ABAIXO DE ACORDO COM O SEU SISTEMA!.

INTERFACE_EXTERNA="eth0"                        # a que liga voce com a INET
LOOPBACK_INTERFACE="lo"
IPADDR="208.164.186.3"                          # o seu IP, no caso eh do WEB
QUALQUERLUGAR="any/0"
NAMESERVER_1="208.164.186.1"                    # o ip do servidor DNS primario
NAMESERVER_2="208.164.186.2"                    # o ip do servidor DNS secundar
io

SMTP_SERVER="mail.unsekurity.org"               # o endereco do servidor de MAI
L
SYSLOG_SERVER="mail.unsekurity.org"             # seu servidor syslog interno
SYSLOG_CLIENT="208.164.168.0/24"                # os clientes do syslog

#
# Bem, ai os SYSLOG* acima eh o seguinte:
# Caso alguem entre no seu sistema, e tente apagar logs vitais, existira uma
# copia remota, fazendo com que o esforco dele tenha sido em vao. Para que
# isso seja possivel, o "syslogd" deve ser inicializado com a opcao "-r"
# e o servidor do syslog (no caso a maquina mail), deve aceitar pacotes udp
# na porta 514!! Assim como o cliente deve aceitar o envio de pacotes udp
# na mesma porta!! 
# 
# no syslog da maquina cliente deve conter a seguinte linha:
#
# kern.*                        @mail
#
# entao ela enviara as mensagem do kernel para a maquina mail!!
#
# maiores informacoes: man 8 syslogd
#

LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
BROADCAST_ORI="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
PORTASPRIV="0:1023"
PORTASNAOPRIV="1024:65535"

# ----------------------------------------------------------------------------

# as portas do SSH iniciam em 1023 e vao ate a porta 513 para cada conexao 
# adicional!!
PORTAS_SSH="1022:1023"                   # alcance das portas do SSH

# traceroute geralmente usa -S 32769:65535 -D 33434:33523
PORTAS_ORI_TRACEROUTE="32769:65535"
PORTAS_DEST_TRACEROUTE="33434:33523"

# ----------------------------------------------------------------------------
# A regra padrao eh DENY

    # Remove todas as regras existentes 
    ipchains -F

    # Configura a regra padrao do filtro para DENY
    ipchains -P input  DENY
    ipchains -P output REJECT
    ipchains -P forward REJECT

# ----------------------------------------------------------------------------

    # Habilita protecao contra TCP SYN Cookies
    echo 1 >/proc/sys/net/ipv4/tcp_syncookies

    # Habilita protecao contra IP spoofing 
    # verificando o endereco de origem
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 1 > $f
    done

    # Desabilita a aceitacao de redirecionamento ICMP
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 0 > $f
    done

    # Desabilita o envio pacotes sem direcao
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 0 > $f
    done

# ----------------------------------------------------------------------------
# LOOPBACK

    # Trafego ilimitado na interface de loopback
    ipchains -A input  -i $LOOPBACK_INTERFACE -j ACCEPT 
    ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT 

# ----------------------------------------------------------------------------
# Script kiddies
# Barra o acesso deles.

    # /etc/rc.d/rc.firewall.blocked deverah conter uma lista de
    # ipchains -A input  -i $EXTERNAL_INTERFACE -s address -j DENY
    # para bloquear o acesso deles..

    # Recusa qualquer conexao dos enderecos contidos em rc.firewall.blocked
    if [ -f /etc/rc.d/rc.firewall.blocked ]; then
        . /etc/rc.d/rc.firewall.blocked
    fi

# ----------------------------------------------------------------------------
# SPOOFING & ENDERECO INVALIDOS
# Recusa pacotes forjados.
# Ignora a entrada/saida de pacotes de/para enderecos invalidos.

    # Recusa pacotes forjados dizendo ser da interface externa e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $IPADDR -j DENY -l

    # Recusa pacotes para/dizendo ser de uma Classe A privada e loga.
    # -d quer dizer DESTINO !
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_A -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_A -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_A -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_A -j REJECT -l

    # Recusa pacotes para/dizendo ser de uma Classe B privada e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_B -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_B -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_B -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_B -j REJECT -l

    # Recusa pacotes para/dizendo ser de uma Classe C privada e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_C -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_C -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_C -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_C -j REJECT -l

    # Recusa pacotes dizendo ser da interface de loopback e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $LOOPBACK -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $LOOPBACK -j REJECT -l

    # Recusa enderecos de ORIGEM da broadcast 
    ipchains -A input  -i $INTERFACE_EXTERNA -s $BROADCAST_DEST -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $BROADCAST_ORI -j DENY -l

    # Recusa uma classe D de enderecos multicast (in.h) (NET-3-HOWTO)
    # Multicast eh ilegal como endereco de origem.
    # Multicast usa UDP.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_D_MULTICAST -j DENY -l

    # Recusa uma classe E de enderecos reservados
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_E_RESERVED_NET -j DENY -
l

    # recusa enderecos definidos como reservados pela IANA
    # 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
    # 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
    # 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
    ipchains -A input  -i $INTERFACE_EXTERNA -s 1.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 2.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 5.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 7.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 23.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 27.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 31.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 37.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 39.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 41.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 42.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 58.0.0.0/7 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 60.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 65.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 66.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 67.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 68.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 69.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 70.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 71.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 72.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 73.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 74.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 75.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 76.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 77.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 78.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 79.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 80.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 96.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 112.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 113.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 114.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 115.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 116.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 117.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 118.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 119.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 120.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 121.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 122.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 123.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 124.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 125.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 126.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 217.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 218.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 219.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 220.0.0.0/6 -j DENY -l

# ----------------------------------------------------------------------------
# ICMP

    #    Para prevenir ataques "DoS" baseado em ICMP, devemos filtrar
    #    incoming Redirect (5) e outgoing Destination Unreachable (3).
    #    Entretanto, desabilitar o Destination Unreachable (3) nao eh
    #    recomendavel, porque ele eh usado para negociar o tamanho de 
    #    fragmentacao do pacote!!

    # Para ping bi-direcional.
    #     Tipos de mensagens:  Echo_Reply (0),  Echo_Request (8)
    #     Para prevenir ataques, eh necessario limitar os enderecos de origem 
    #     apenas para um certo alcance.
    # 
    # Para a saida de traceroute.
    #     Tipos de mensagens:  INCOMING Dest_Unreachable (3), Time_Exceeded (11
)
    #     UDP base: 33434 ateh base+nhops-1
    # 
    # Para a entrada traceroute.
    #     Tipos de mensagens:  OUTGOING Dest_Unreachable (3), Time_Exceeded (11
)
    #     Para bloquear isso, barre OUTGOING 3 e 11

    #  0: echo-reply (pong)
    #  3: destination-unreachable, port-unreachable, fragmentation-needed, etc.
    #  4: source-quench
    #  5: redirect
    #  8: echo-request (ping)
    # 11: time-exceeded
    # 12: parameter-problem

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 0 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 3 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 4 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 11 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 12 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s 208.164.186.0/24 8 -d $IPADDR -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 0 -d 208.164.186.0/24 -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 3 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 4 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 8 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 12 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 11 -d 208.164.186.0/24 -j ACCEPT 

# ----------------------------------------------------------------------------
    # Entrada UDP para TRACEROUTE
    # traceroute geralmente usa -S 32769:65535 -D 33434:33523

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s 208.164.186.0/24 $PORTAS_ORI_TRACEROUTE \
             -d $IPADDR $PORTAS_DEST_TRACEROUTE -j ACCEPT -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $QUALQUERLUGAR $PORTAS_ORI_TRACEROUTE \
             -d $IPADDR $PORTAS_DEST_TRACEROUTE -j DENY -l

# ----------------------------------------------------------------------------
    # Servidor DNS
    # ------------

    # Redirecionamento DNS, servidor de cache apenas. (53)
    # ----------------------------------------------------

    # servidor para servidor perguntas ou respostas
    # Servidor de cache requer apenas UDP, nada de TCP

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_1 53 \
             -d $IPADDR 53 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR 53 \
             -d $NAMESERVER_1 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_2 53 \
             -d $IPADDR 53 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR 53 \
             -d $NAMESERVER_2 53 -j ACCEPT 

    # cliente DNS (53)
    # ----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_1 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_1 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $NAMESERVER_1 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_1 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_2 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_2 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $NAMESERVER_2 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_2 53 -j ACCEPT 

# ----------------------------------------------------------------------------
    # conexoes TCP aceitas somente nas portas selecionadas!!
    # ------------------------------------------------------
    # ------------------------------------------------------------------

    # servidor SSH (22)
    # -----------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 22 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 22 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTAS_SSH \
             -d $IPADDR 22 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 22 \
             -d $QUALQUERLUGAR $PORTAS_SSH -j ACCEPT 

    # cliente SSH (22)
    # ----------------
#    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
#             -s $QUALQUERLUGAR 22 \
#             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

#    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
#             -s $IPADDR $PORTASNAOPRIV \
#             -d $QUALQUERLUGAR 22 -j ACCEPT

#    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
#             -s $QUALQUERLUGAR 22 \
#             -d $IPADDR $PORTAS_SSH -j ACCEPT

#    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
#             -s $IPADDR $PORTAS_SSH \
#             -d $QUALQUERLUGAR 22 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor HTTP (80)
    # ------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 80 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 80 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # ------------------------------------------------------------------

    # servidor HTTPS (443)
    # --------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 443 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 443 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # ------------------------------------------------------------------

    # servidor SYSLOG (514)
    # ----------------------

#    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
#             -s $SYSLOG_CLIENT \
#             -d $IPADDR 514 -j ACCEPT

    # cliente SYSLOG (514)
    # -----------------

#    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
#             -s $IPADDR 514 \
#             -d $SYSLOG_SERVER 514 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor AUTH (113)
    # -------------------

    # Rejeita, melhor do que barrar negar, conexoes na porta 113. (NET-3-HOWTO)

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR \
             -d $IPADDR 113 -j REJECT 

    # ------------------------------------------------------------------

    # cliente SMTP (25)
    # -----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $SMTP_SERVER 25 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $SMTP_SERVER 25 -j ACCEPT 

    # ------------------------------------------------------------------

    # servidor FTP (20, 21)
    # ---------------------

    # requisicoes externas.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 21 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 21 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # respostas PORT MODE.
    # 
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
            -s $QUALQUERLUGAR $PORTASNAOPRIV \
            -d $IPADDR 20 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
            -s $IPADDR 20 \
            -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # respostas PASSIVE MODE.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # ------------------------------------------------------------------
    # TRACEROUTE DE SAIDA
    # -------------------
    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTAS_ORI_TRACEROUTE \
             -d $QUALQUERLUGAR $PORTAS_DEST_TRACEROUTE -j ACCEPT 

# ----------------------------------------------------------------------------
# Ativa o logging para os pacotes que serao barrados.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -d $IPADDR -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -d $IPADDR $PORTASPRIV -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -d $IPADDR $PORTASNAOPRIV -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 5 -d $IPADDR -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 13:255 -d $IPADDR -j DENY -l

# ----------------------------------------------------------------------------

        ;;
  stop)
        echo -n "Shutting Firewalling Services: "

    # Remove todas as regras pertencentes ao filtro
    ipchains -F

    # Remove todas as regras definidas pelo usuario ao filtro
    ipchains -X

    # Muda a politica padrao para ACCEPT.
    ipchains -P input  ACCEPT
    ipchains -P output ACCEPT
    ipchains -P forward ACCEPT

    # Remove as protecoes TCP SYN Cookie.
    echo 0 >/proc/sys/net/ipv4/tcp_syncookies

    # Remove protecoes a IP spoofing.
    # Liga verificacao de origem dos enderecos
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 0 > $f
    done

    # Ativa a aceitacao de redirecionamentos ICMP.
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 1 > $f
    done

    # Ativa a aceitacao de pacotes da origem roteados.
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 1 > $f
    done
        ;;
  status)
        status firewall
        ;;
  restart|reload)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: firewall {start|stop|status|restart|reload}"
        exit 1
esac

exit 0

Agora, faca mude as permissoes do script:

[root@unsekurity:~]# chmod 700 /etc/rc.d/init.d/firewall
[root@unsekurity:~]# chown 0.0 /etc/rc.d/init.d/firewall

Se usar Redhat, digite os seguintes comandos:

[root@unsekurity:~]# chkconfig --add firewall
[root@unsekurity:~]# chkconfig --level 345 firewall on

Ele vai adicionar o script para inicializar automaticamente (ou use o
ntsysv). Num slackware ou outro linux, adicione-o no rc.local :)


12. CONFIGURACAO DE UM FIREWALL PARA O SERVIDOR DE MAIL.

        Agora vem a configuracao do nosso servidor de mail. Essa configuracao
permite, trafego ilimitado na interface de loopback, ICMP, servidor e cliente 
DNS, servidor SSH, servidor e cliente SMTP, servidor IMAP e saida de TRACEROU
TES por padrao.

        Se voce nao quiser alguns servicos listados no script para o
servidor de mail, basta comenta-los com um # :)

Crie o arquivo de firewall (touch /etc/rc.d/init.d/firewall) no servidor de
mail e adicione:

#!/bin/sh
#
# Adaptado para o tutorial de IPCHAINS por segfault.
# 11/07/2000
# Unsekurity Team.
# 
# ----------------------------------------------------------------------------
# Modified by Gerhard Mourani:  02-01-2000
# ----------------------------------------------------------------------------
# Copyright (C) 1997, 1998, 1999  Robert L. Ziegler
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for educational, research, private and non-profit purposes,
# without fee, and without a written agreement is hereby granted. 
# This software is provided as an example and basis for individual firewall
# development.  This software is provided without warranty.
#
# Any material furnished by Robert L. Ziegler is furnished on an 
# "as is" basis.  He makes no warranties of any kind, either expressed 
# or implied as to any matter including, but not limited to, warranty 
# of fitness for a particular purpose, exclusivity or results obtained
# from use of the material.
# ----------------------------------------------------------------------------
#
# Inicializado em /etc/rc.d/init.d/firewall.
# chkconfig: - 60 95
# descricao: Inicia e para o firewall IPCHAINS.
#             

# Source function library.
. /etc/rc.d/init.d/functions # Usuarios do Slackware: comentem esta linha. 

# Source networking configuration.
. /etc/sysconfig/network     # Usuarios do Slackware: comentem esta linha.

# Check that networking is up.
if [ ${NETWORKING} = "no" ]  # Usuarios do Slackware: comentem esta linha.
then                         # Usuarios do Slackware: comentem esta linha.
        exit 0               # Usuarios do Slackware: comentem esta linha.
fi                           # Usuarios do Slackware: comentem esta linha.

[ -f /sbin/ipchains ] || exit 0 

# See how we were called.
case "$1" in                 # Usuarios do Slackware: comentem esta linha.
  start)                     # Usuarios do Slackware: comentem esta linha.
        echo -n "Iniciando servicos de Firewall: "

# Algumas definicoes para uma manutencao facil.

# ----------------------------------------------------------------------------
#  EDITE AS CONSTANTES ABAIXO DE ACORDO COM O SEU SISTEMA!.

INTERFACE_EXTERNA="eth0"                        # a que liga voce com a INET
LOOPBACK_INTERFACE="lo"
IPADDR="208.164.186.2"                          # o seu IP, no caso eh do MAIL
QUALQUERLUGAR="any/0"
NAMESERVER_1="208.164.186.1"                    # o ip do servidor DNS primario
NAMESERVER_2="208.164.186.2"                    # o ip do servidor DNS secundar
io

SYSLOG_SERVER="mail.unsekurity.org"             # seu servidor syslog interno
SYSLOG_CLIENT="208.164.168.0/24"                # os clientes do syslog

#
# Bem, ai os SYSLOG* acima eh o seguinte:
# Caso alguem entre no seu sistema, e tente apagar logs vitais, existira uma
# copia remota, fazendo com que o esforco dele tenha sido em vao. Para que
# isso seja possivel, o "syslogd" deve ser inicializado com a opcao "-r"
# e o servidor do syslog (no caso a maquina mail), deve aceitar pacotes udp
# na porta 514!! Assim como o cliente deve aceitar o envio de pacotes udp
# na mesma porta!! 
# 
# no syslog da maquina cliente deve conter a seguinte linha:
#
# kern.*                        @mail
#
# entao ela enviara as mensagem do kernel para a maquina mail!!
#
# maiores informacoes: man 8 syslogd
#

LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
BROADCAST_ORI="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
PORTASPRIV="0:1023"
PORTASNAOPRIV="1024:65535"

# ----------------------------------------------------------------------------

# as portas do SSH iniciam em 1023 e vao ate a porta 513 para cada conexao 
# adicional!!
PORTAS_SSH="1022:1023"                   # alcance das portas do SSH

# traceroute geralmente usa -S 32769:65535 -D 33434:33523
PORTAS_ORI_TRACEROUTE="32769:65535"
PORTAS_DEST_TRACEROUTE="33434:33523"

# ----------------------------------------------------------------------------
# A regra padrao eh DENY

    # Remove todas as regras existentes 
    ipchains -F

    # Configura a regra padrao do filtro para DENY
    ipchains -P input  DENY
    ipchains -P output REJECT
    ipchains -P forward REJECT

# ----------------------------------------------------------------------------

    # Habilita protecao contra TCP SYN Cookies
    echo 1 >/proc/sys/net/ipv4/tcp_syncookies

    # Habilita protecao contra IP spoofing 
    # verificando o endereco de origem
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 1 > $f
    done

    # Desabilita a aceitacao de redirecionamento ICMP
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 0 > $f
    done

    # Desabilita o envio pacotes sem direcao
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 0 > $f
    done

# ----------------------------------------------------------------------------
# LOOPBACK

    # Trafego ilimitado na interface de loopback
    ipchains -A input  -i $LOOPBACK_INTERFACE -j ACCEPT 
    ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT 

# ----------------------------------------------------------------------------
# Script kiddies
# Barra o acesso deles.

    # /etc/rc.d/rc.firewall.blocked deverah conter uma lista de
    # ipchains -A input  -i $EXTERNAL_INTERFACE -s address -j DENY
    # para bloquear o acesso deles..

    # Recusa qualquer conexao dos enderecos contidos em rc.firewall.blocked
    if [ -f /etc/rc.d/rc.firewall.blocked ]; then
        . /etc/rc.d/rc.firewall.blocked
    fi

# ----------------------------------------------------------------------------
# SPOOFING & ENDERECO INVALIDOS
# Recusa pacotes forjados.
# Ignora a entrada/saida de pacotes de/para enderecos invalidos.

    # Recusa pacotes forjados dizendo ser da interface externa e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $IPADDR -j DENY -l

    # Recusa pacotes para/dizendo ser de uma Classe A privada e loga.
    # -d quer dizer DESTINO !
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_A -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_A -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_A -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_A -j REJECT -l

    # Recusa pacotes para/dizendo ser de uma Classe B privada e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_B -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_B -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_B -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_B -j REJECT -l

    # Recusa pacotes para/dizendo ser de uma Classe C privada e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_C -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_C -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_C -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_C -j REJECT -l

    # Recusa pacotes dizendo ser da interface de loopback e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $LOOPBACK -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $LOOPBACK -j REJECT -l

    # Recusa enderecos de ORIGEM da broadcast 
    ipchains -A input  -i $INTERFACE_EXTERNA -s $BROADCAST_DEST -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $BROADCAST_ORI -j DENY -l

    # Recusa uma classe D de enderecos multicast (in.h) (NET-3-HOWTO)
    # Multicast eh ilegal como endereco de origem.
    # Multicast usa UDP.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_D_MULTICAST -j DENY -l

    # Recusa uma classe E de enderecos reservados
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_E_RESERVED_NET -j DENY -
l

    # recusa enderecos definidos como reservados pela IANA
    # 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
    # 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
    # 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
    ipchains -A input  -i $INTERFACE_EXTERNA -s 1.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 2.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 5.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 7.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 23.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 27.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 31.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 37.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 39.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 41.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 42.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 58.0.0.0/7 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 60.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 65.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 66.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 67.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 68.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 69.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 70.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 71.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 72.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 73.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 74.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 75.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 76.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 77.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 78.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 79.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 80.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 96.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 112.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 113.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 114.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 115.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 116.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 117.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 118.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 119.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 120.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 121.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 122.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 123.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 124.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 125.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 126.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 217.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 218.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 219.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 220.0.0.0/6 -j DENY -l

# ----------------------------------------------------------------------------
# ICMP

    #    Para prevenir ataques "DoS" baseado em ICMP, devemos filtrar
    #    incoming Redirect (5) e outgoing Destination Unreachable (3).
    #    Entretanto, desabilitar o Destination Unreachable (3) nao eh
    #    recomendavel, porque ele eh usado para negociar o tamanho de 
    #    fragmentacao do pacote!!

    # Para ping bi-direcional.
    #     Tipos de mensagens:  Echo_Reply (0),  Echo_Request (8)
    #     Para prevenir ataques, eh necessario limitar os enderecos de origem 
    #     apenas para um certo alcance.
    # 
    # Para a saida de traceroute.
    #     Tipos de mensagens:  INCOMING Dest_Unreachable (3), Time_Exceeded (11
)
    #     UDP base: 33434 ateh base+nhops-1
    # 
    # Para a entrada traceroute.
    #     Tipos de mensagens:  OUTGOING Dest_Unreachable (3), Time_Exceeded (11
)
    #     Para bloquear isso, barre OUTGOING 3 e 11

    #  0: echo-reply (pong)
    #  3: destination-unreachable, port-unreachable, fragmentation-needed, etc.
    #  4: source-quench
    #  5: redirect
    #  8: echo-request (ping)
    # 11: time-exceeded
    # 12: parameter-problem

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 0 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 3 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 4 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 11 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 12 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s 208.164.186.0/24 8 -d $IPADDR -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 0 -d 208.164.186.0/24 -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 3 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 4 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 8 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 12 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 11 -d 208.164.186.0/24 -j ACCEPT 

# ----------------------------------------------------------------------------
    # Entrada UDP para TRACEROUTE
    # traceroute geralmente usa -S 32769:65535 -D 33434:33523

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s 208.164.186.0/24 $PORTAS_ORI_TRACEROUTE \
             -d $IPADDR $PORTAS_DEST_TRACEROUTE -j ACCEPT -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $QUALQUERLUGAR $PORTAS_ORI_TRACEROUTE \
             -d $IPADDR $PORTAS_DEST_TRACEROUTE -j DENY -l

# ----------------------------------------------------------------------------
    # Servidor DNS
    # ------------

    # DNS: servidor completo. (53)
    # ----------------------------------------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 53 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR 53 \
             -d $NAMESERVER_1 53 -j ACCEPT 

    # cliente DNS (53)
    # ----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_1 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_1 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $NAMESERVER_1 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_1 53 -j ACCEPT 

# ----------------------------------------------------------------------------
    # conexoes TCP aceitas somente nas portas selecionadas!!
    # ------------------------------------------------------
    # ------------------------------------------------------------------

    # servidor SSH (22)
    # -----------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 22 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 22 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTAS_SSH \
             -d $IPADDR 22 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 22 \
             -d $QUALQUERLUGAR $PORTAS_SSH -j ACCEPT 

    # cliente SSH (22)
    # ----------------
#    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
#             -s $QUALQUERLUGAR 22 \
#             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

#    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
#             -s $IPADDR $PORTASNAOPRIV \
#             -d $QUALQUERLUGAR 22 -j ACCEPT

#    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
#             -s $QUALQUERLUGAR 22 \
#             -d $IPADDR $PORTAS_SSH -j ACCEPT

#    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
#             -s $IPADDR $PORTAS_SSH \
#             -d $QUALQUERLUGAR 22 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor SYSLOG (514)
    # ----------------------

#    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
#             -s $SYSLOG_CLIENT \
#             -d $IPADDR 514 -j ACCEPT

    # cliente SYSLOG (514)
    # -----------------

#    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
#             -s $IPADDR 514 \
#             -d $SYSLOG_SERVER 514 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor AUTH (113)
    # -------------------

    # Rejeita, melhor do que barrar negar, conexoes na porta 113. (NET-3-HOWTO)

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR \
             -d $IPADDR 113 -j REJECT 

    # ------------------------------------------------------------------

    # servidor SMTP (25)
    # -----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR -j ACCEPT

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 25 -j ACCEPT
    
     # -----------------------------------------------------------------
    # cliente SMTP (25)
    # -----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 25 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 25 -j ACCEPT 

    # ------------------------------------------------------------------

    # servidor IMAP (143)
    # ---------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 143 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 143 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # ------------------------------------------------------------------
    # TRACEROUTE DE SAIDA
    # -------------------
    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTAS_ORI_TRACEROUTE \
             -d $QUALQUERLUGAR $PORTAS_DEST_TRACEROUTE -j ACCEPT 

# ----------------------------------------------------------------------------
# Ativa o logging para os pacotes que serao barrados.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -d $IPADDR -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -d $IPADDR $PORTASPRIV -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -d $IPADDR $PORTASNAOPRIV -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 5 -d $IPADDR -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 13:255 -d $IPADDR -j DENY -l

# ----------------------------------------------------------------------------

        ;;
  stop)
        echo -n "Shutting Firewalling Services: "

    # Remove todas as regras pertencentes ao filtro
    ipchains -F

    # Remove todas as regras definidas pelo usuario ao filtro
    ipchains -X

    # Muda a politica padrao para ACCEPT.
    ipchains -P input  ACCEPT
    ipchains -P output ACCEPT
    ipchains -P forward ACCEPT

    # Remove as protecoes TCP SYN Cookie.
    echo 0 >/proc/sys/net/ipv4/tcp_syncookies

    # Remove protecoes a IP spoofing.
    # Liga verificacao de origem dos enderecos
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 0 > $f
    done

    # Ativa a aceitacao de redirecionamentos ICMP.
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 1 > $f
    done

    # Ativa a aceitacao de pacotes da origem roteados.
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 1 > $f
    done
        ;;
  status)
        status firewall
        ;;
  restart|reload)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: firewall {start|stop|status|restart|reload}"
        exit 1
esac

exit 0

Agora, faca mude as permissoes do script:

[root@unsekurity:~]# chmod 700 /etc/rc.d/init.d/firewall
[root@unsekurity:~]# chown 0.0 /etc/rc.d/init.d/firewall

Se usar Redhat, digite os seguintes comandos:

[root@unsekurity:~]# chkconfig --add firewall
[root@unsekurity:~]# chkconfig --level 345 firewall on

Ele vai adicionar o script para inicializar automaticamente (ou use o
ntsysv). Num slackware ou outro linux, adicione-o no rc.local :)

Bom, o tutorial ja tah enorme, heheh, mas vamos em frente, ainda falta o
principal, o servidor gateway que fara o servico de masquerading. Essa eh a
parte mais interessante. Ja pensou voce comecar a vender essa ideia, para
uma empresa dizendo: Com apenas um computador e uma conexao de internet,
todos os seus funcionarios podem acessar ela sem ter que pagar nenhum custo
adicional? Humm, certamente eh uma boa ideia e certas pessoas pagam caro por
isso. :)


*12. REDIRECIONAMENTO E "MASCARAMENTO" NO LINUX.

        Ao contrario da parte anterior, configurar um linux para fazer o
servico de mascaramento e recirecionamento geralmente da rede interna que
tem um ip "falso" para a rede externa (internet) requer uma configuracao
especial do seu kernel e do seu script de firewall. Esse tipo de config deve
ser feito apenas se voce quiser esse tipo de servico, pois eh meio longo :).

13. CONSTRUINDO UM KERNEL COM SUPORTE A REDIR. E MASC.

        A primeira coisa que voce deve fazer eh ter certeza que o kernel
estah compilado com suporte ao IPchains. Lembre-se que todas as maquinas da
rede deveriam estar configuradas para barrar portas inutilizadas (sempre
alguem tenta invadir a sua rede, mesmo que voce nao saiba!). No kernel
2.2.16 (outros tambem..hehe), ficaria assim:

[root@unsekurity:~]# cd /usr/src/linux
[root@unsekurity:/usr/src/linux]# make menuconfig

        Vah em "Networking options" e marque:

[*] Network firewalls
[*] IP: firewalling
[*] IP: TCP syncookie support (not enabled per default)
[*] IP: masquerading      
[*] IP: ICMP masquerading       

Depois eh soh recompilar o kernel e rebootar a maquina...

[root@unsekurity:/usr/src/linux]# make dep ; make clean ; make bzImage ;
make modules ; make modules_install

:)

Esse "mascaramento" quer dizer que se um dos seus computadores na sua rede
local (na qual o seu servidor gateway eh o Linux), quiser mandar alguma
coisa pra "fora da rede", entao o seu gateway ira se "mascarar" como aquele
computador que queria enviar algo. Ou seja, ele repassa pacotes locais para
a rede externa (internet) dizendo ter vindo dele mesmo (gateway). 

O Mascaramento IP soh vai funcionar se o redirecionamento de pacotes estiver
habilitado no seu sistema. Ele vem desabilitado por padrao, entao voce pode
habilita-lo com o seguinte comando:

[root@unsekurity:~]# echo "1" > /proc/sys/net/ipv4/ip_forward

Voce deve adicionar o comando acima no seu rc.local se nao estiver usando
RH, pois ele sera executado automaticamente quando o computador for
reiniciado. Caso use Redhat, faca o seguinte:

Edite o seu /etc/sysconfig/network e mude:

FORWARD_IPV4="false" para FORWARD_IPV4="true"

e depois reinicie:

[root@unsekurity:~]# /etc/rc.d/init.d/network restart

Se voce habilitar o Mascaramento de IPS, entao os modulos ip_masq_ftp.o
(para transferencias ftp), ip_masq_irc.o (para irc chats), ip_masq_quake.o
(adivinha :), ip_masq_vdolive.o (para conexoes de video VDOLive),
ip_masq_cuseeme.o (para CU-SeeMe), e ip_masq_raudio.o (para RealAudio) serao
automaticamente compilados. Eles sao necessarios para o funcionamento desses
protocolos. Existem outros tipos de modulos que podem ser facilmente puxados
pela internet, no site da freshmeat e outros. O mascaramento basico (IP:
masquerading, compilado no kernel)controla apenas pacotes TCP ou UDP (e erros 
ICMP para conexoes existentes). O IP:ICMP Masquerading adiciona um suporte
para mascaramento de pacotes ICMP, como o "ping" ou alguns testes usados
pelo "tracer" do Windows.

Apenas para lembrar que como este computador estara conectado na internet,
voce nao devera' rodar mais servicos do que os necessarios, e devera' estar
sempre ligado nos patches para as aplicacoes que voce roda (assine bugtraq). 
SEMPRE SEMPRE SEMPRE. Tente acompanhar o que acontece no mundo "undeground"
e fique ligado em novos exploits. Cuide do seu sistema. Nao seja mais uma
pessoa a ter a pagina que voce administra na attrition.org :)


14. CONFIGURACAO DO SCRIPT DE FIREWALL PARA O SERVIDOR GATEWAY

        Essa configuracao para o gateway permite trafego ilimitado na
interface de loopback, ICMP, servidor e cliente DNS (53), servidor e cliente
SSH (22), servidor e cliente HTTP (80), servidor e cliente HTTPS (443),
cliente POP (110), servidor e cliente SMTP(25), servidor IMAP(143), clientes
IRC(6667), clientes ICQ (4000), clientes FTP(20, 21) e saida de traceroutes
por padrao!

#!/bin/sh
#
# Adaptado para o tutorial de IPCHAINS por segfault.
# 14/08/2000 (DEMOREI HEIN! HEHEHE)
# Unsekurity Team.
# 
# ----------------------------------------------------------------------------
# Modified by Gerhard Mourani:  02-01-2000
# ----------------------------------------------------------------------------
# Copyright (C) 1997, 1998, 1999  Robert L. Ziegler
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for educational, research, private and non-profit purposes,
# without fee, and without a written agreement is hereby granted. 
# This software is provided as an example and basis for individual firewall
# development.  This software is provided without warranty.
#
# Any material furnished by Robert L. Ziegler is furnished on an 
# "as is" basis.  He makes no warranties of any kind, either expressed 
# or implied as to any matter including, but not limited to, warranty 
# of fitness for a particular purpose, exclusivity or results obtained
# from use of the material.
# ----------------------------------------------------------------------------
#
# Inicializado em /etc/rc.d/init.d/firewall.
# chkconfig: - 60 95
# descricao: Inicia e para o firewall IPCHAINS.
#             

# Source function library.
. /etc/rc.d/init.d/functions # Usuarios do Slackware: comentem esta linha. 

# Source networking configuration.
. /etc/sysconfig/network     # Usuarios do Slackware: comentem esta linha.

# Check that networking is up.
if [ ${NETWORKING} = "no" ]  # Usuarios do Slackware: comentem esta linha.
then                         # Usuarios do Slackware: comentem esta linha.
        exit 0               # Usuarios do Slackware: comentem esta linha.
fi                           # Usuarios do Slackware: comentem esta linha.

[ -f /sbin/ipchains ] || exit 0 

# See how we were called.
case "$1" in                 # Usuarios do Slackware: comentem esta linha.
  start)                     # Usuarios do Slackware: comentem esta linha.
        echo -n "Iniciando servicos de Firewall: "

# Algumas definicoes para uma manutencao facil.

# ----------------------------------------------------------------------------
#  EDITE AS CONSTANTES ABAIXO DE ACORDO COM O SEU SISTEMA!.

INTERFACE_EXTERNA="eth0"                        # a que liga voce com a INET
INTERFACE_INTERNA="eth1"                        # a da sua rede interna
LOOPBACK_INTERFACE="lo"
IPADDR="208.164.186.1"                          # o seu IP, no caso eh do servi
dor
LOCALNET="192.168.1.0/24"                       # a faixa de ips locais
QUALQUERLUGAR="any/0"
NAMESERVER_1="208.164.186.1"                    # o ip do servidor DNS primario
NAMESERVER_2="208.164.186.2"                    # o ip do servidor DNS secundar
io

POP_SERVER="pop.algumacoisa.org"                # seu servidor de pop externo
SYSLOG_SERVER="mail.unsekurity.org"             # seu servidor syslog interno

#
# Bem, ai os SYSLOG* acima eh o seguinte:
# Caso alguem entre no seu sistema, e tente apagar logs vitais, existira uma
# copia remota, fazendo com que o esforco dele tenha sido em vao. Para que
# isso seja possivel, o "syslogd" deve ser inicializado com a opcao "-r"
# e o servidor do syslog (no caso a maquina mail), deve aceitar pacotes udp
# na porta 514!! Assim como o cliente deve aceitar o envio de pacotes udp
# na mesma porta!! 
# 
# no syslog da maquina cliente deve conter a seguinte linha:
#
# kern.*                        @mail
#
# entao ela enviara as mensagem do kernel para a maquina mail!!
#
# maiores informacoes: man 8 syslogd
#

LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12"
CLASS_C="192.168.0.0/16"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"
BROADCAST_ORI="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
PORTASPRIV="0:1023"
PORTASNAOPRIV="1024:65535"

# ----------------------------------------------------------------------------

# as portas do SSH iniciam em 1023 e vao ate a porta 513 para cada conexao 
# adicional!!
PORTAS_SSH="1022:1023"                   # alcance das portas do SSH

# traceroute geralmente usa -S 32769:65535 -D 33434:33523
PORTAS_ORI_TRACEROUTE="32769:65535"
PORTAS_DEST_TRACEROUTE="33434:33523"

# ----------------------------------------------------------------------------
# A regra padrao eh DENY

    # Remove todas as regras existentes 
    ipchains -F

    # Configura a regra padrao do filtro para DENY
    ipchains -P input  DENY
    ipchains -P output REJECT
    ipchains -P forward REJECT

    # configura o timeout do mascaramento para 10 horas (conexoes TCP)
    ipchains -M -S 36000 0 0

    # Nao repassa fragmentos. Junta primeiro, depois envia.
    ipchains -A output -f -i $LOCAL_INTERFACE -j DENY

# ----------------------------------------------------------------------------

    # Habilita protecao contra TCP SYN Cookies
    echo 1 >/proc/sys/net/ipv4/tcp_syncookies

    # Habilita protecao contra IP spoofing 
    # verificando o endereco de origem
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 1 > $f
    done

    # Desabilita a aceitacao de redirecionamento ICMP
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 0 > $f
    done

    # Desabilita o envio pacotes sem direcao
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 0 > $f
    done

    # Esses modulos sao necessarios para mascarar as conexoes:
    /sbin/modprobe ip_masq_ftp.o
    /sbin/modprobe ip_mas_raudio.o ports=554,7070,70701,6970,6971
    /sbin/modprobe ip_masq_irc.o
#   /sbin/modprobe ip_masq_vdolive.o
#   /sbin/modprobe ip_masq_cuseeme.o
#   /sbin/modprobe ip_masq_quake.o


# ----------------------------------------------------------------------------
# LOOPBACK

    # Trafego ilimitado na interface de loopback
    ipchains -A input  -i $LOOPBACK_INTERFACE -j ACCEPT 
    ipchains -A output -i $LOOPBACK_INTERFACE -j ACCEPT 

# ----------------------------------------------------------------------------
# Script kiddies
# Barra o acesso deles.

    # /etc/rc.d/rc.firewall.blocked deverah conter uma lista de
    # ipchains -A input  -i $EXTERNAL_INTERFACE -s address -j DENY
    # para bloquear o acesso deles..

    # Recusa qualquer conexao dos enderecos contidos em rc.firewall.blocked
    if [ -f /etc/rc.d/rc.firewall.blocked ]; then
        . /etc/rc.d/rc.firewall.blocked
    fi

# ----------------------------------------------------------------------------
# SPOOFING & ENDERECO INVALIDOS
# Recusa pacotes forjados.
# Ignora a entrada/saida de pacotes de/para enderecos invalidos.

    # Recusa pacotes forjados dizendo ser da interface externa e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $IPADDR -j DENY -l

    # Recusa pacotes para/dizendo ser de uma Classe A privada e loga.
    # -d quer dizer DESTINO !
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_A -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_A -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_A -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_A -j REJECT -l

    # Recusa pacotes para/dizendo ser de uma Classe B privada e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_B -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_B -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_B -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_B -j REJECT -l

    # Recusa pacotes para/dizendo ser de uma Classe C privada e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_C -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $CLASS_C -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $CLASS_C -j REJECT -l
    ipchains -A output -i $INTERFACE_EXTERNA -d $CLASS_C -j REJECT -l

    # Recusa pacotes dizendo ser da interface de loopback e loga.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $LOOPBACK -j DENY -l
    ipchains -A output -i $INTERFACE_EXTERNA -s $LOOPBACK -j REJECT -l

    # Recusa enderecos de ORIGEM da broadcast 
    ipchains -A input  -i $INTERFACE_EXTERNA -s $BROADCAST_DEST -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -d $BROADCAST_ORI -j DENY -l

    # Recusa uma classe D de enderecos multicast (in.h) (NET-3-HOWTO)
    # Multicast eh ilegal como endereco de origem.
    # Multicast usa UDP.
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_D_MULTICAST -j DENY -l

    # Recusa uma classe E de enderecos reservados
    ipchains -A input  -i $INTERFACE_EXTERNA -s $CLASS_E_RESERVED_NET -j DENY -
l

    # recusa enderecos definidos como reservados pela IANA
    # 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
    # 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
    # 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
    ipchains -A input  -i $INTERFACE_EXTERNA -s 1.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 2.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 5.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 7.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 23.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 27.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 31.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 37.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 39.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 41.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 42.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 58.0.0.0/7 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 60.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 65.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 66.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 67.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 68.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 69.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 70.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 71.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 72.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 73.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 74.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 75.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 76.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 77.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 78.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 79.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 80.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 96.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 112.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 113.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 114.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 115.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 116.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 117.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 118.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 119.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 120.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 121.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 122.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 123.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 124.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 125.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 126.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 217.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 218.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 219.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE_EXTERNA -s 220.0.0.0/6 -j DENY -l

# ----------------------------------------------------------------------------
# ICMP

    #    Para prevenir ataques "DoS" baseado em ICMP, devemos filtrar
    #    incoming Redirect (5) e outgoing Destination Unreachable (3).
    #    Entretanto, desabilitar o Destination Unreachable (3) nao eh
    #    recomendavel, porque ele eh usado para negociar o tamanho de 
    #    fragmentacao do pacote!!

    # Para ping bi-direcional.
    #     Tipos de mensagens:  Echo_Reply (0),  Echo_Request (8)
    #     Para prevenir ataques, eh necessario limitar os enderecos de origem 
    #     apenas para um certo alcance.
    # 
    # Para a saida de traceroute.
    #     Tipos de mensagens:  INCOMING Dest_Unreachable (3), Time_Exceeded (11
)
    #     UDP base: 33434 ateh base+nhops-1
    # 
    # Para a entrada traceroute.
    #     Tipos de mensagens:  OUTGOING Dest_Unreachable (3), Time_Exceeded (11
)
    #     Para bloquear isso, barre OUTGOING 3 e 11

    #  0: echo-reply (pong)
    #  3: destination-unreachable, port-unreachable, fragmentation-needed, etc.
    #  4: source-quench
    #  5: redirect
    #  8: echo-request (ping)
    # 11: time-exceeded
    # 12: parameter-problem

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 0 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 3 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 4 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 11 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 12 -d $IPADDR -j ACCEPT 
    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s 208.164.186.0/24 8 -d $IPADDR -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 0 -d 208.164.186.0/24 -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 3 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 4 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 8 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 12 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE_EXTERNA -p icmp \
             -s $IPADDR 11 -d 208.164.186.0/24 -j ACCEPT 

# ----------------------------------------------------------------------------
    # Entrada UDP para TRACEROUTE
    # traceroute geralmente usa -S 32769:65535 -D 33434:33523

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s 208.164.186.0/24 $PORTAS_ORI_TRACEROUTE \
             -d $IPADDR $PORTAS_DEST_TRACEROUTE -j ACCEPT -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $QUALQUERLUGAR $PORTAS_ORI_TRACEROUTE \
             -d $IPADDR $PORTAS_DEST_TRACEROUTE -j DENY -l

# ----------------------------------------------------------------------------
    # Servidor DNS
    # ------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 53 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR 53 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # cliente DNS (53)
    # ----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_1 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_1 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $NAMESERVER_1 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_1 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $NAMESERVER_2 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_2 53 -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $NAMESERVER_2 53 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $NAMESERVER_2 53 -j ACCEPT 

# ----------------------------------------------------------------------------
    # conexoes TCP aceitas somente nas portas selecionadas!!
    # ------------------------------------------------------
    # ------------------------------------------------------------------

    # servidor SSH (22)
    # -----------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR 22 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 22 \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR $PORTAS_SSH \
             -d $IPADDR 22 -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR 22 \
             -d $QUALQUERLUGAR $PORTAS_SSH -j ACCEPT 

    # cliente SSH (22)
    # ----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 22 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 22 -j ACCEPT

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 22 \
             -d $IPADDR $PORTAS_SSH -j ACCEPT

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTAS_SSH \
             -d $QUALQUERLUGAR 22 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor HTTP (80)
    # ------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 80 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 80 -j ACCEPT 

    # ------------------------------------------------------------------

    # cliente HTTPS (443)
    # --------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 443 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 443 -j ACCEPT 

    # ------------------------------------------------------------------

    # cliente POP (110)
    # --------------------

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $POP_SERVER 110 \         
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \  
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 110 -j ACCEPT

    # ------------------------------------------------------------------

    # cliente FINGER (79)
    # --------------------

#    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
#             -s $QUALQUERLUGAR 79 \         
#             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

#    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \  
#             -s $IPADDR $PORTASNAOPRIV \
#             -d $QUALQUERLUGAR 79 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor SYSLOG (514)
    # ----------------------

#    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
#             -s $SYSLOG_CLIENT \
#             -d $IPADDR 514 -j ACCEPT

    # cliente SYSLOG (514)
    # -----------------

#    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
#             -s $IPADDR 514 \
#             -d $SYSLOG_SERVER 514 -j ACCEPT

    # ------------------------------------------------------------------

    # servidor AUTH (113)
    # -------------------

    # Rejeita, melhor do que barrar negar, conexoes na porta 113. (NET-3-HOWTO)

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $QUALQUERLUGAR \
             -d $IPADDR 113 -j REJECT 

    # ------------------------------------------------------------------

    # cliente SMTP (25)
    # -----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 25 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 25 -j ACCEPT 

    # ------------------------------------------------------------------

    # cliente IRC (6667)
    # -----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 6667 \ 
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 6667 -j ACCEPT

    # ------------------------------------------------------------------

    # cliente ICQ (4000) 
    # -----------------
    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -s $QUALQUERLUGAR 4000 \  
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT

    # ------------------------------------------------------------------

    # cliente FTP (20, 21)
    # ---------------------

    # requisicoes externas.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR 21 \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR 21 -j ACCEPT 

    # NORMAL mode .
    # 
    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
            -s $IPADDR 20 \
            -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # resposta do NORMAL mode.
    #
    ipchains -A output  -i $INTERFACE_EXTERNA -p tcp ! -y \  
            -s $IPADDR $PORTASNAOPRIV \  
            -d $QUALQUERLUGAR 20 -j ACCEPT

    # PASSIVE MODE.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -s $IPADDR $PORTASNAOPRIV \
             -d $QUALQUERLUGAR $PORTASNAOPRIV -j ACCEPT 

    # respostas do PASSIVE MODE.

    ipchains -A output -i $INTERFACE_EXTERNA -p tcp ! -y \
             -s $QUALQUERLUGAR $PORTASNAOPRIV \
             -d $IPADDR $PORTASNAOPRIV -j ACCEPT 

    # ------------------------------------------------------------------
    # TRACEROUTE DE SAIDA
    # -------------------
    ipchains -A output -i $INTERFACE_EXTERNA -p udp \
             -s $IPADDR $PORTAS_ORI_TRACEROUTE \
             -d $QUALQUERLUGAR $PORTAS_DEST_TRACEROUTE -j ACCEPT 

# Trafego ilimitado na rede interna.
   # todas as maquinas tem acesso ao servidor de firewall.

    ipchains -A input -i $LOCAL_INTERFACE -s $LOCALNET -j ACCEPT
    ipchains -A output -i $LOCAL_INTERFACE -d $LOCALNET -j ACCEPT

# Faz o mascaramento da rede interna!
    
    ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET -j MASQ

# ----------------------------------------------------------------------------
# Ativa o logging para os pacotes que serao barrados.

    ipchains -A input  -i $INTERFACE_EXTERNA -p tcp \
             -d $IPADDR -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -d $IPADDR $PORTASPRIV -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p udp \
             -d $IPADDR $PORTASNAOPRIV -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 5 -d $IPADDR -j DENY -l

    ipchains -A input  -i $INTERFACE_EXTERNA -p icmp \
             -s $QUALQUERLUGAR 13:255 -d $IPADDR -j DENY -l

# ----------------------------------------------------------------------------

        ;;
  stop)
        echo -n "Shutting Firewalling Services: "

    # Remove todas as regras pertencentes ao filtro
    ipchains -F

    # Remove todas as regras definidas pelo usuario ao filtro
    ipchains -X

    # Muda a politica padrao para ACCEPT.
    ipchains -P input  ACCEPT
    ipchains -P output ACCEPT
    ipchains -P forward ACCEPT

    # Remove as protecoes TCP SYN Cookie.
    echo 0 >/proc/sys/net/ipv4/tcp_syncookies

    # Remove protecoes a IP spoofing.
    # Liga verificacao de origem dos enderecos
    for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
        echo 0 > $f
    done

    # Ativa a aceitacao de redirecionamentos ICMP.
    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 1 > $f
    done

    # Ativa a aceitacao de pacotes da origem roteados.
    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 1 > $f
    done
        ;;
  status)
        status firewall
        ;;
  restart|reload)
        $0 stop
        $0 start
        ;;
  *)
        echo "Usage: firewall {start|stop|status|restart|reload}"
        exit 1
esac

exit 0

Agora, faca mude as permissoes do script:

[root@unsekurity:~]# chmod 700 /etc/rc.d/init.d/firewall
[root@unsekurity:~]# chown 0.0 /etc/rc.d/init.d/firewall

Se usar Redhat, digite os seguintes comandos:

[root@unsekurity:~]# chkconfig --add firewall
[root@unsekurity:~]# chkconfig --level 345 firewall on

Ele vai adicionar o script para inicializar automaticamente (ou use o
ntsysv). Num slackware ou outro linux, adicione-o no rc.local :)


15. ALGUMAS DICAS DO IPCHAINS:

        Esses comandos abaixo sao os mais usados quando administramos uma
maquina que esta rodando ipchains. 

a) para listar regras:

[root@unsekurity:~]# ipchains -L

Ele vai listar as regras numa determinada chain, se nao foi escolhida
nenhuma, entao ele vai listar TODAS.

b) para listar todas as regras de entrada:

[root@unsekurity:~]# ipchains -L input

c) para listar todas as regras de mascaramento:

[root@unsekurity:~]# ipchains -ML


16. SCRIPT PARA CONEXOES DIAL-UP

#!/bin/bash
#
#  firewall.sh: firewall simples.
#  versao: 1.0b
#  feito por segfault/Unsekurity Team.
#

MEUIP=`ifconfig ppp0 | grep inet | awk '{print $2}' | cut -d : -f 2`
REDEINTERNA="192.168.1.0/24"
PORTAS="0:1023"
NPORTAS="1024:65535"
INTERFACE="ppp0"
LOOPBACK="lo"
QUALQUERLUGAR="any/0"
PORTAS_ORI_TRACEROUTE="32769:65535"
PORTAS_DEST_TRACEROUTE="33434:33523"
DNS1="192.168.1.1"
DNS2="200.250.6.1"
PORTAS_SSH="1022:1023"

# Remove todas as regras existentes
    
    ipchains -F

# Configura a regra padrao do filtro para DENY
    
    ipchains -P input  DENY
    ipchains -P output ACCEPT
    ipchains -P forward REJECT


# Recusa pacotes que dizem ser locais.

    ipchains -A input -i $INTERFACE -s $MEUIP -l -j DENY

# Habilita protecao contra TCP SYN Cookies

    echo 1 >/proc/sys/net/ipv4/tcp_syncookies

# Habilita protecao contra IP spoofing
# verificando o endereco de origem

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

# Desabilita a aceitacao de redirecionamento ICMP

    for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
        echo 0 > $f
    done

# Desabilita o envio pacotes sem direcao

    for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
        echo 0 > $f
    done

# Trafego ilimitado na interface de loopback
    ipchains -A input  -i $LOOPBACK -j ACCEPT
    ipchains -A output -i $LOOPBACK -j ACCEPT

# recusa enderecos definidos como reservados pela IANA
# 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
# 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
# 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
    ipchains -A input  -i $INTERFACE -s 1.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 2.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 5.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 7.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 23.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 27.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 31.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 37.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 39.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 41.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 42.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 58.0.0.0/7 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 60.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 65.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 66.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 67.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 68.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 69.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 70.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 71.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 72.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 73.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 74.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 75.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 76.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 77.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 78.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 79.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 80.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 96.0.0.0/4 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 112.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 113.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 114.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 115.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 116.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 117.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 118.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 119.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 120.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 121.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 122.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 123.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 124.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 125.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 126.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 217.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 218.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 219.0.0.0/8 -j DENY -l
    ipchains -A input  -i $INTERFACE -s 220.0.0.0/6 -j DENY -l

# ICMP

#    Para prevenir ataques "DoS" baseado em ICMP, devemos filtrar
#    incoming Redirect (5) e outgoing Destination Unreachable (3).
#    Entretanto, desabilitar o Destination Unreachable (3) nao eh
#    recomendavel, porque ele eh usado para negociar o tamanho de
#    fragmentacao do pacote!!

# Para ping bi-direcional.
#     Tipos de mensagens:  Echo_Reply (0),  Echo_Request (8)
#     Para prevenir ataques, eh necessario limitar os enderecos de origem
#     apenas para um certo alcance.
#
# Para a saida de traceroute.
#     Tipos de mensagens:  INCOMING Dest_Unreachable (3), Time_Exceeded (11
#     UDP base: 33434 ateh base+nhops-1
#
# Para a entrada traceroute.
#     Tipos de mensagens:  OUTGOING Dest_Unreachable (3), Time_Exceeded (11
#     Para bloquear isso, barre OUTGOING 3 e 11

    #  0: echo-reply (pong)
    #  3: destination-unreachable, port-unreachable, fragmentation-needed, etc.
    #  4: source-quench
    #  5: redirect
    #  8: echo-request (ping)
    # 11: time-exceeded
    # 12: parameter-problem

    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 0 -d $MEUIP -j ACCEPT 
    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 3 -d $MEUIP -j ACCEPT 
    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 4 -d $MEUIP -j ACCEPT 
    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 11 -d $MEUIP -j ACCEPT 
    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 12 -d $MEUIP -j ACCEPT 
    ipchains -A input  -i $INTERFACE -p icmp \
             -s 192.168.1.0/24 8 -d $MEUIP -j ACCEPT 
    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 8 -d $MEUIP -j DENY -l

    ipchains -A output -i $INTERFACE -p icmp \
             -s $MEUIP 0 -d 192.168.1.0/24 -j ACCEPT 
    ipchains -A output -i $INTERFACE -p icmp \
             -s $MEUIP 3 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE -p icmp \
             -s $MEUIP 4 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE -p icmp \
             -s $MEUIP 8 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE -p icmp \
             -s $MEUIP 12 -d $QUALQUERLUGAR -j ACCEPT 
    ipchains -A output -i $INTERFACE -p icmp \
             -s $MEUIP 11 -d 192.168.1.0/24 -j ACCEPT 

# Entrada UDP para TRACEROUTE
# traceroute geralmente usa -S 32769:65535 -D 33434:33523

    ipchains -A input  -i $INTERFACE -p udp \
             -s 192.168.1.0/24 $PORTAS_ORI_TRACEROUTE \
             -d $MEUIP $PORTAS_DEST_TRACEROUTE -j ACCEPT -l

    ipchains -A input  -i $INTERFACE -p udp \
             -s $QUALQUERLUGAR $PORTAS_ORI_TRACEROUTE \
             -d $MEUIP $PORTAS_DEST_TRACEROUTE -j DENY -l

# Servidor DNS
# ------------

    ipchains -A input  -i $INTERFACE -p udp \
             -s $DNS1 53 \
             -d $MEUIP 53 -j ACCEPT

    ipchains -A output -i $INTERFACE -p udp \
             -s $MEUIP 53 \
             -d $DNS1 53 -j ACCEPT

    ipchains -A input  -i $INTERFACE -p udp \
             -s $DNS2 53 \
             -d $MEUIP 53 -j ACCEPT

    ipchains -A output -i $INTERFACE -p udp \
             -s $MEUIP 53 \
             -d $DNS2 53 -j ACCEPT
 
    ipchains -A input  -i $INTERFACE -p udp \
             -s $DNS1 53 \
             -d $MEUIP $NPROTAS -j ACCEPT

    ipchains -A output -i $INTERFACE -p udp \
             -s $MEUIP $NPROTAS \
             -d $DNS1 53 -j ACCEPT

    ipchains -A input  -i $INTERFACE -p tcp ! -y \
             -s $DNS1 53 \
             -d $MEUIP $NPROTAS -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp \
             -s $MEUIP $NPROTAS \
             -d $DNS1 53 -j ACCEPT

    ipchains -A input  -i $INTERFACE -p udp \
             -s $DNS2 53 \
             -d $MEUIP $NPROTAS -j ACCEPT

    ipchains -A output -i $INTERFACE -p udp \
             -s $MEUIP $NPROTAS \
             -d $DNS2 53 -j ACCEPT

    ipchains -A input  -i $INTERFACE -p tcp ! -y \
             -s $DNS2 53 \
             -d $MEUIP $NPORTS -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp \
             -s $MEUIP $NPORTAS \
             -d $DNS2 53 -j ACCEPT

# servidor SSH (22)
# -----------------

    ipchains -A input  -i $INTERFACE -p tcp \
             -s $QUALQUERLUGAR $NPORTAS \
             -d $MEUIP 22 -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp ! -y \
             -s $MEUIP 22 \
             -d $QUALQUERLUGAR $NPORTAS -j ACCEPT

    ipchains -A input  -i $INTERFACE -p tcp \
             -s $QUALQUERLUGAR $PORTAS_SSH \
             -d $MEUIP 22 -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp ! -y \
             -s $MEUIP 22 \
             -d $QUALQUERLUGAR $PORTAS_SSH -j ACCEPT

# cliente SSH (22)
# ----------------
    ipchains -A input  -i $INTERFACE -p tcp ! -y \
             -s $QUALQUERLUGAR 22 \
             -d $MEUIP $NPORTAS -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp \
             -s $MEUIP $NPORTAS \
             -d $QUALQUERLUGAR 22 -j ACCEPT

    ipchains -A input  -i $INTERFACE -p tcp ! -y \
             -s $QUALQUERLUGAR 22 \
             -d $MEUIP $PORTAS_SSH -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp \
             -s $MEUIP $PORTAS_SSH \
             -d $QUALQUERLUGAR 22 -j ACCEPT

# servidor HTTP (80)
# ------------------

    ipchains -A input  -i $INTERFACE -p tcp \
             -s $QUALQUERLUGAR $NPORTAS \
             -d $MEUIP 80 -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp ! -y \
             -s $MEUIP 80 \
             -d $QUALQUERLUGAR $NPORTAS -j ACCEPT

# servidor HTTPS (443)
# --------------------

    ipchains -A input  -i $INTERFACE -p tcp \
             -s $QUALQUERLUGAR $NPORTAS \
             -d $MEUIP 443 -j ACCEPT

    ipchains -A output -i $INTERFACE -p tcp ! -y \
             -s $MEUIP 443 \
             -d $QUALQUERLUGAR $NPORTAS -j ACCEPT

# servidor AUTH (113)
# -------------------

    ipchains -A input  -i $INTERFACE -p tcp \
             -s $QUALQUERLUGAR \
             -d $MEUIP 113 -j ACCEPT


# servidor SMTP (25)
# -------------------

    ipchains -A input  -i $INTERFACE -p tcp \
             -s $QUALQUERLUGAR \
             -d $MEUIP 25 -j ACCEPT

# cliente ICQ (4000) 
# -----------------

    ipchains -A input  -i $INTERFACE -p udp \
             -s $QUALQUERLUGAR 4000 \
             -d $MEUIP $NPORTAS -j ACCEPT

# Ativa o logging para os pacotes que serao barrados.

    ipchains -A input  -i $INTERFACE -p tcp \
             -d $MEUIP $NPORTAS -j ACCEPT 

    ipchains -A input  -i $INTERFACE -p tcp \
             -d $MEUIP -j REJECT -l

    ipchains -A input  -i $INTERFACE -p udp \
             -d $MEUIP $PORTAS -j REJECT -l

    ipchains -A input  -i $INTERFACE -p udp \
             -d $MEUIP $NPORTAS -j ACCEPT 

    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 5 -d $MEUIP -j DENY -l

    ipchains -A input  -i $INTERFACE -p icmp \
             -s $QUALQUERLUGAR 13:255 -d $MEUIP -j DENY -l

echo "(unsek) firewall carregado com sucesso." 

17. FINALIZANDO

        Entao, esse foi um tutorialzinho de ipchains que eu passei pra
voces, espero que tenham aprendido alguma coisa com ele, pois eu entendi
MUITA coisa que com certeza vai me ajudar daqui pra frente. Aprender nunca
eh demais, principalmente quando o conhecimento vale muita coisa. Soh
lembrando: nunca se negue a ensinar alguem alguma coisa que voce sabe,
alguma coisa "basica" pois sempre algum dia voce precisara' da ajuda de
alguem e nao conseguira', pense nisso. Ajude, mude, faca a diferenca!


Bibliografia:

man 8 ipchains -> administracao do firewall
man 8 ipchains-restore -> restora chains de stdin
man 8 ipchains-save -> salva as regras para stdout

apostilas.virtualave.net -> procure por firewall
www.tutoriais.com.br -> procure por firewall

Securing and Optimizing Red Hat Linux, Gerhard Mourani, primeira edicao
MAKRON BOOKS


