terça-feira, 14 de setembro de 2010

Firewall com Ubuntu Server 10.04 (pt 4) - IPTables

Se você está chegando agora a essa sequencia de posts, pode encontrar aqui o que procura:
Parte 01 - GUI, VNC e FTP
Parte 02 - Compartilhando a conexão
Parte 03 - Squid, proxy transparente

Dando continuidade, o Iptables é um firewall, instalado por padrão tanto no Ubuntu Server quanto em outras distribuições, como Debian, por exemplo.
Numa instalação normal do Ubuntu, o iptables é instalado mas todo tráfego é permitido por default.


INICIANDO SUAS REGRAS COM O SISTEMA

Existem diversas formas, descritas em vários sites, para inicializar suas configurações personalizadas com o sistema.
Algumas delas eu testei e deram certo, outras eu não consegui fazer funcionar.

Note que existem N formas de se trabalhar com o iptables.
Abaixo vou citar as mais comuns e, ao final, vou dizer qual foi a maneira que melhor funcionou para mim:

Opções:
1) Criar um script que invoca o seu arquivo de configurações do iptables
2) Utilizar algum arquivo do sistema que invoque seu arquivo de configurações do iptables

Forma escolhida:
3) Colocar suas configurações dentro de algum arquivo de sistema que já é automaticamente iniciado no boot.

Opção 01:
Criando um script que invoca o arquivo de configurações


Para se criar um script que seja inicializado com o sistema, basta criá-lo dentro do diretório /etc/init.d

Veja um exemplo para criação de um script simples:
sudo gedit /etc/init.d/meu_script

Insira o conteúdo abaixo no novo arquivo e clique em salvar:
#!/bin/bash
echo "Olá mundo" 

Agora é só dar a permissão de execução à esse arquivo:
sudo chmod 755 /etc/init.d/meu_script

Quase pronto, agora é só colocar para inicializar junto com o sistema:
sudo update-rc.d meu_script defaults


Para minimizar um pouco o trabalho, através do repositório, eu encontrei um pacote chamado: iptables-persistence
Fiz a instalação e ele criou automaticamente em init.d um script de mesmo nome (iptables-persistence) que invoca o arquivo: /etc/iptables/rules

O script criado tem essa cara:
#!/bin/sh
 ### BEGIN INIT INFO
 # Provides:          iptables
 # Required-Start:    mountkernfs $local_fs
 # Required-Stop:     $local_fs
 # Default-Start:     S
 # Default-Stop:      
 # Short-Description: Set up iptables rules
 ### END INIT INFO
 
 case "$1" in
 start)
     if [ -f /etc/iptables/rules ]; then
         iptables-restore </etc/iptables/rules
     fi
     ;;
 stop|force-stop|restart|force-reload|status)
     ;;
 *)
     echo "Usage: $0 {start|stop|force-stop|restart|force-reload|status}" >&2
     exit 1
     ;;
 esac
 
 exit 0

Portanto, o arquivo que você deverá trabalhar as regras do iptables é, nesse caso, o /etc/iptables/rules.


Opção 02:
Invocando o arquivo de configurações por um arquivo do sistema


Seu arquivo de configuração pode ser inicializado através do seguinte código no arquivo interfaces:
pre-up iptables-restore < /etc/iptables/iptables.up.rules 
[após as configurações do adaptador de internet (eth0 nesse caso)]
Note que o arquivo com as configurações é o iptables.up.rules


Opção 03:
Iniciando as configurações por um arquivo do sistema


Após várias tentativas de rodar meus comandos através de scripts e arquivos invocados por scripts, eu decidi ser mais prático e menos "profissional".
Essa solução atende perfeitamente minhas necessidades e funcionou de uma forma incrivelmente simples.

Todas as suas configurações de iptables podem ser colocadas dentro do arquivo /etc/rc.local antes do comando "exit 0".
sudo gedit /etc/rc.local


CONFIGURAÇÕES DO IPTABLES (Arquivo rc.local)

Abaixo segue meu arquivo rc.local, com todas as configurações do iptables. Incluindo algumas que ainda não testei e as regras já citadas anteriormente.

Considere que não sou nenhum expert em redes e segurança, portanto a maioria dessas regras que serão citadas foram "catadas" da internet, então são regras muito batidas.

Se você for utilizar esse método, seu arquivo deve ficar com a seguinte cara:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# -------------------------------------------------------------------
# IPTABLES - Configuracao personalizada || INICIO
# -------------------------------------------------------------------

# Configuracoes das variáveis
# -------------------------------------------------------
IF_EXTERNA=eth0
IF_INTERNA=eth2
IP_SERVER=10.10.16.242
IP_EXTERNO=X.X.X.119  # Esse é meu ip estático de internet

# Adicionar módulos no kernel
# -------------------------------------------------------

# Os modulos a seguir, de forma geral, compartilham a internet, 
# resolvem problemas de ftp e sao responsaveis pelos logs.
modprobe ip_tables
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_REJECT
modprobe ipt_MASQUERADE

# Flush - Limpar regras
# -------------------------------------------------------------------

# Zerar regras default
iptables -F
iptables -F -t nat
iptables -F -t mangle
# Zerar regras personalizadas
iptables -X
iptables -X -t nat
iptables -X -t mangle

# Compartilhamento da internet
# -------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Politica padrão
# -------------------------------------------------------
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP 

# Tabela filter
#iptables -t filter -P INPUT DROP
#iptables -t filter -P OUTPUT ACCEPT
#iptables -t filter -P FORWARD DROP
# Tabela nat
#iptables -t nat -P PREROUTING ACCEPT
#iptables -t nat -P OUTPUT ACCEPT
#iptables -t nat -P POSTROUTING DROP
# Tabela mangle
#iptables -t mangle -P PREROUTING ACCEPT
#iptables -t mangle -P OUTPUT ACCEPT

# Accept - Regras de liberaçao
# -------------------------------------------------------

# Interface de loopback
iptables -A INPUT -p tcp --syn -s 127.0.0.1/255.0.0.0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

# Abre para uma faixa de endereços da rede local
iptables -A INPUT -p tcp --syn -s $IP_SERVER -j ACCEPT

# Libera os pacotes de retorno da internet
iptables -A INPUT -i ! $IF_EXTERNA -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

# Libera o acesso ao ftp
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# Redirecionamentos
# -------------------------------------------------------------------

# SQUID (para um proxy transparente)
iptables -t nat -A PREROUTING -i $IF_EXTERNA -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 0/0 -p tcp --dport 80 -j REDIRECT --to-port 3128 # testar
iptables -t nat -A PREROUTING -s 0/0 -p udp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A POSTROUTING -s 0/0 -o $IF_INTERNA -j MASQUERADE # testar

# VPN
iptables -A INPUT -p tcp -i $IF_EXTERNA --dport 1723 -j ACCEPT
iptables -A INPUT -p 47 -i $IF_EXTERNA -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i $IF_EXTERNA --dport 1723 -j DNAT --to $IP_SERVER:1723
iptables -t nat -A PREROUTING -p 47 -i $IF_EXTERNA -j DNAT --to $IP_SERVER

# Remote Desktop Connection - Server
# Redirecionamento direto ao nosso servidor, no caso de uma chamada de RDC.
iptables -t nat -A PREROUTING -p tcp -i $IF_EXTERNA -d $IP_EXTERNO --dport 3389 -j DNAT --to-destination $IP_SERVER:3389


# Filtros
# -------------------------------------------------------

# Proteção contra alguns worms
iptables -A FORWARD -p tcp --dport 135 -i $IF_INTERNA -j REJECT

# Forçar checagem de pacotes fragmentados
iptables -A INPUT -f -j DROP

# Dropar pacotes nulos e malformados
iptables -A INPUT -i $IF_EXTERNA -m unclean -j LOG --log-level 6 --log-prefix "FIREWALL: pacote mal formado: "
iptables -A INPUT -i $IF_EXTERNA -m unclean -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Syn packets check (dropar o que nao for um pacote SYN)
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-level 6 --log-prefix "FIREWALL: Non SYN packet: "
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# Proteção contra syn-flood
iptables -A FORWARD -p tcp --syn -m limit --limit 2/s -j LOG --log-level 6 --log-prefix "FIREWALL: SYN flood: "
iptables -A FORWARD -p tcp --syn -m limit --limit 2/s -j ACCEPT

# Protecao contra trace-routes
iptables -A FORWARD -p udp -s 0/0 -i eth0 --dport 33435:33525 -j LOG --log-level 6 --log-prefix "FIREWALL: Trace Route: "
iptables -A FORWARD -p udp -s 0/0 -i eth0 --dport 33435:33525 -j DROP

# Proteção contra trojans
iptables -N TROJAN
iptables -A TROJAN -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "FIREWALL: Trojan: "
iptables -A TROJAN -j DROP
iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 666 -j TROJAN
iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 666 -j TROJAN
iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 6666 -j TROJAN
iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 6006 -j TROJAN
iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 16660 -j TROJAN

# Proteção contra trinoo
# -------------------------------------------------------
#iptables -N TRINOO
#iptables -A TRINOO -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "FIREWALL: trinoo: "
#iptables -A TRINOO -j DROP
#iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 27444 -j TRINOO
#iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 27665 -j TRINOO
#iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 31335 -j TRINOO
#iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 34555 -j TRINOO
#iptables -A INPUT -p TCP -i $IF_EXTERNA --dport 35555 -j TRINOO

# Proteção contra port scanners
iptables -N SCANNER
iptables -A SCANNER -m limit --limit 15/m -j LOG --log-level 6 --log-prefix "FIREWALL: Port scanner: "
iptables -A SCANNER -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -i $IF_EXTERNA -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL NONE -i $IF_EXTERNA -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL ALL -i $IF_EXTERNA -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL FIN,SYN -i $IF_EXTERNA -j SCANNER
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -i $IF_EXTERNA -j SCANNER
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -i $IF_EXTERNA -j SCANNER
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -i $IF_EXTERNA -j SCANNER 

# Proteção contra ping da morte
# iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

# Recusa de pings
# iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP

# Programas P2P
# -------------------------------------------------------

# Audiogalaxy
iptables -A FORWARD -d 64.245.58.0/23 -j DROP

# BearShare
iptables -A FORWARD -p TCP --dport 6346 -j DROP

# iMesh
iptables -A FORWARD -d 216.35.208.0/24 -j DROP

# KaZaa
iptables -A FORWARD -d 213.248.112.0/24 -j DROP
iptables -A FORWARD -p TCP --dport 1214 -j DROP 

# Limewire
iptables -A FORWARD -p TCP --dport 6346 -j DROP

# Morpheus
iptables -A FORWARD -d 206.142.53.0/24 -j DROP
iptables -A FORWARD -p TCP --dport 1214 -j DROP

# Napigator
iptables -A FORWARD -d 209.25.178.0/24 -j DROP

# Napster
iptables -A OUTPUT -p TCP --dport 6699 -j DROP
iptables -A FORWARD -p TCP --dport 6699 -j DROP
iptables -A OUTPUT -p UDP --dport 6699 -j DROP
iptables -A FORWARD -p UDP --dport 6699 -j DROP

# ToadNode
iptables -A FORWARD -p TCP --dport 6346 -j DROP

# WinMX
iptables -A FORWARD -d 209.61.186.0/24 -j DROP
iptables -A FORWARD -d 64.49.201.0/24-j DROP

# Ativa mascaramento de saída
# -------------------------------------------------------
iptables -A POSTROUTING -t nat -o $IF_EXTERNA -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF_EXTERNA -j MASQUERADE

# Logs - tentativas de acesso a determinadas portas
# -------------------------------------------------------
iptables -A INPUT -p tcp --dport 21 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: ftp: "
iptables -A INPUT -p tcp --dport 23 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: telnet: "
iptables -A INPUT -p tcp --dport 25 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: smtp: "
iptables -A INPUT -p tcp --dport 80 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: http: "
iptables -A INPUT -p tcp --dport 110 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: pop3: "
iptables -A INPUT -p udp --dport 111 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: rpc: "
iptables -A INPUT -p tcp --dport 113 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: identd: "
iptables -A INPUT -p tcp --dport 137:139 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: samba: "
iptables -A INPUT -p udp --dport 137:139 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: samba: "
iptables -A INPUT -p tcp --dport 161:162 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: snmp: "
iptables -A INPUT -p tcp --dport 6667:6668 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: irc: "
iptables -A INPUT -p tcp --dport 3128 -i $IF_EXTERNA -j LOG --log-level 6 --log-prefix "FIREWALL: squid: "

# Logs - outras recusas
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "FIREWALL: iptables denied: " --log-level 7

# -------------------------------------------------------------------
# IPTABLES - Configuracao personalizada || FIM
# -------------------------------------------------------------------

exit 0

* Note que não tive tempo útil para testar todas essas regras e, com o tempo, pretendo ir incrementando meu firewall. Vou manter esse post atualizado com o que realmente funciona.

Aqui seguem mais algumas regras de bloqueio, que não estou utilizando pelo fato de que estou deixando o Squid cuidando dos acessos à websites, mas que podem ser de alguma utilidade para quem está pensando em reforçar o iptables:

# Bloqueio de MSN - Fonte: www.vivaolinux.com.br/artigo/Bloqueando-MSN-orkut-trojans-e-mais/
# -------------------------------------------------------
iptables -A FORWARD -d gateway.messenger.hotmail.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d login.live.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d contacts.msn.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d storage.msn.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d c.msn.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d messenger.msn.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d g.msn.com -p tcp --dport 80 -j REJECT
iptables -A FORWARD -d messenger.hotmail.com -p tcp --dport 1863 -j REJECT
iptables -A FORWARD -d edge.messenger.live.com -p TCP --dport 80 -j REJECT
iptables -A FORWARD -p TCP --dport 443 -j REJECT
iptables -A FORWARD -p TCP --dport 1863 -j REJECT
iptables -A FORWARD -d 64.4.13.0./24 -j REJECT 


# Bloqueio do Orkut - Fonte: www.vivaolinux.com.br/artigo/Bloqueando-MSN-orkut-trojans-e-mais/
# -------------------------------------------------------
iptables -A FORWARD -d orkut.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.orkut.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP


# Bloqueio de alguns web-messengers
# -------------------------------------------------------
iptables -A FORWARD -d www7.messengerfx.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.iloveim.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.ebuddy.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.meebo.com.br -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.koolim.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.kkurok.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.imunitive.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.radiusim.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d imo.im -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.communicationtube.net -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d vcontent.e-messenger.net -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.myemessenger.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d messengerskinner.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.messengerskinner.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d rad.msn.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.messengertools.net -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d messenger.zango.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.zangomessenger.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP


# Bloqueio de alguns proxies
# -------------------------------------------------------
iptables -A FORWARD -d www.nproxy.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.snoopblocker.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.pproxy.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.nopath.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d anonymouse.ws/anonwww.html -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.megaproxy.com/freesurf/ -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www8.tok2.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.fireprox.com/ -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.vtunnel.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.spynot.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.fsurf.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.onlinemessenger.nl -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.3proxy.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.euproxy.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.torperkut.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.orkutando.net -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.theorkut.rg3.net -s 192.168.0.0/24 -p tcp --dport 80 -j DROP
iptables -A FORWARD -d www.proxy3.com -s 192.168.0.0/24 -p tcp --dport 80 -j DROP

REFERÊNCIAS
Depois desse enorme trabalho, nada mais justo do que citar e agradecer às minhas principais referências ;)

http://www.gdhpress.com.br/servidores/leia/index.php?p=cap2-3
http://www.vivaolinux.com.br/artigo/Firewall-rapido-e-seguro-com-iptables/
http://www.vivaolinux.com.br/artigo/Criando-um-firewall-simples-e-compartilhando-a-conexao-usando-o-IPtables/?pagina=2
http://www.guiaubuntupt.org/wiki/index.php?title=Iptables#Configurar_no_Startup
http://www.vivaolinux.com.br/etc/firewall-mitre
http://www.guiadohardware.net/artigos/firewall-iptables/
http://alexsandropedrollo.com/2010/08/11/compartilhar-rede-no-ubuntu/
http://softwarelivre.org/andre-ferraro/blog/linux-compartilhando-a-conexao-de-internet
http://174.123.53.162/artigo/Configurar-servidor-proxy-Squid-%28Ubuntu%29?pagina=2
http://graveheart.me/geek-life/instalando-e-configurando-um-servidor-proxy-com-o-ubuntu-server-em-menos-de-duas-horas/
http://www.vivaolinux.com.br/etc/squid.conf-alencar
http://www.gdhpress.com.br/redeseservidores/leia/index.php?p=cap5-12
http://www.guiadohardware.net/tutoriais/servidor-rede-local-ubuntu/pagina6.html
http://www.zago.eti.br/squid/dicas-e-truques.html#toc2

Tenham um bom proveito!
;)

5 comentários:

Anônimo disse...

Parabens muito bom obrigado,
cássio.

Daniel Manenti disse...

Muito bom!!! vou implementar aqui pra ver!! demais!!
e obrigado por compartilhar!!

Felipe Sartor disse...

Que bom que foi de alguma utilidade para mais alguém, pq foi um belo trampo.
E vou falar que até agora não tive nenhum problema com ele.

Clay Costa disse...

Muito bom, vou implementar em minha empresa e homologar, breve post maiores detalhes. Parabéns pelo post.

Henrique disse...

Parabéns! Muito bom! Agradeço por sua generosidade em compartilhar se conhecimento com todos! Posso lhe convidar via msn/facebook? Um forte abraço!

BuscaPé, líder em comparação de preços na América Latina
 
BlogBlogs.Com.Br