Script de firewall completíssimo

Este script possui diversas características como: mascaramento da rede interna e a rede externa, bloquear acesso de sites, rádio UOL mesmo com proxy transparente, liberar as portas principais, bloqueio de ataques como ping da morte, SYN-FLOOD, ssh de força bruta, anti-spoofings e entre outros. Faltou dizer a importante amarração do ip ao mac.

[ Hits: 333.968 ]

Por: marcelo espindola de melo em 18/11/2007 | Blog: https://marceloespindolaweb.blogspot.com.br/


O script básico, completo, puro



Para baixá-lo é só clicar neste link:
Veja o conteúdo dele:

#!/bin/sh
#Configuração do Firewall através do iptables
#Autoria do Script
#"| Script de Firewall - IPTABLES"
#"| Criado por: Marcelo Magno"
#"| Contribuindo por: Josemar, Marcelo, Urubatan Neto e todos os"
#"| membros da comunidade viva o linux"
#"| Técnico em Informática"
#"| [email protected]"
#"| Uso: firewall start|stop|restart"

#Declaração de variáveis
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IPTABLES="/sbin/iptables"
MACLIST="/etc/configuracao_personalizada/macsliberadosfirewall"
PROGRAMA="/etc/init.d/firewall"

#portas liberadas e bloqueadas
PORTSLIB="/etc/configuracao_personalizada/portslib"
PORTSBLO="/etc/configuracao_personalizada/portsblo"

#Interfaces de Rede
LAN=eth1
WAN=eth0
REDE="192.168.253.0/24"

SITESNEGADOS=/etc/configuracao_personalizada/sitesnegados

# Os diversos módulos do iptables são chamados através do modprobe
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
modprobe ipt_state
modprobe ipt_multiport
modprobe iptable_mangle
modprobe ipt_tos
modprobe ipt_limit
modprobe ipt_mark
modprobe ipt_MARK


case "$1" in
start)

#mensagem de inicialização
echo "| Script de Firewall - IPTABLES"
echo "| Criado por: Marcelo Magno"
echo "| Contribuindo por: Josemar, Marcelo, Urubatan Neto e todos os"
echo "| membros da comunidade viva o linux"
echo "| Técnico em Informática"
echo "| [email protected]"
echo "| Uso: firewall start|stop|restart"
echo
echo "============================================= |"
echo "|:INICIANDO A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS :|"
echo "|: DO IPTABLES :|"
echo "============================================= |"

$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES -X

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP


# ativar o redirecionamento no arquivo ip_forward
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "ativado o redirecionamento no arquivo ip_forward"
echo "ON ...................................................... [ OK ]"


#habilitando o fluxo interno entre os processos
$IPTABLES -I INPUT -i lo -j ACCEPT
$IPTABLES -I OUTPUT -o lo -j ACCEPT
echo "ativado o fluxo interno entre os processos"
echo "ON ...................................................... [ OK ]"

#liberar as portas principais do servidor
for i in `cat $PORTSLIB`; do
$IPTABLES -A INPUT -p tcp --dport $i -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport $i -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $i -j ACCEPT
done
$IPTABLES -I INPUT -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -I INPUT -m state --state RELATED -j ACCEPT
$IPTABLES -I OUTPUT -p icmp -o $WAN -j ACCEPT
$IPTABLES -I INPUT -p icmp -j ACCEPT
echo "ativado as portas abertas para estabelecer conexões"
echo "ativado a liberação das portas principais do servidor $HOSTNAME"
echo "ON ...................................................... [ OK ]"

#ATIVAR O REDIRECIONAMENTO (para ambiente flexível)
#LIBERAR RADIO UOL (para ambiente flexível)

#bloquear acesso de sites negados a rede interna
for i in `cat $SITESNEGADOS`; do
$IPTABLES -t filter -A FORWARD -s $REDE -d $i -j DROP
$IPTABLES -t filter -A FORWARD -s $i -d $REDE -j DROP
$IPTABLES -t filter -A INPUT -s $i -j DROP
$IPTABLES -t filter -A OUTPUT -d $i -j DROP
done
echo "ativado o bloqueio de envio de pacotes com origem aos sites negados"
echo "ON ...................................................... [ OK ]"


#Bloqueio ping da morte
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all
$IPTABLES -N PING-MORTE
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j PING-MORTE
$IPTABLES -A PING-MORTE -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A PING-MORTE -j DROP
echo "ativado o bloqueio a tentativa de ataque do tipo ping da morte"
echo "ON ...................................................... [ OK ]"


#bloquear ataque do tipo SYN-FLOOD
echo "0" > /proc/sys/net/ipv4/tcp_syncookies
$IPTABLES -N syn-flood
$IPTABLES -A INPUT -i $WAN -p tcp --syn -j syn-flood
$IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A syn-flood -j DROP
echo "ativado o bloqueio a tentativa de ataque do tipo SYN-FLOOD"
echo "ON ...................................................... [ OK ]"

#Bloqueio de ataque ssh de força bruta
$IPTABLES -N SSH-BRUT-FORCE
$IPTABLES -A INPUT -i $WAN -p tcp --dport 22 -j SSH-BRUT-FORCE
$IPTABLES -A SSH-BRUT-FORCE -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPTABLES -A SSH-BRUT-FORCE -j DROP
echo "ativado o bloqueio a tentativa de ataque do tipo SSH-BRUT-FORCE"
echo "ON ...................................................... [ OK ]"

#Bloqueio de portas
for i in `cat $PORTSBLO`; do
$IPTABLES -A INPUT -p tcp -i $WAN --dport $i -j DROP
$IPTABLES -A INPUT -p udp -i $WAN --dport $i -j DROP
$IPTABLES -A FORWARD -p tcp --dport $i -j DROP
done

#bloqueio Anti-Spoofings
$IPTABLES -A INPUT -s 10.0.0.0/8 -i $WAN -j DROP
$IPTABLES -A INPUT -s 127.0.0.0/8 -i $WAN -j DROP
$IPTABLES -A INPUT -s 172.16.0.0/12 -i $WAN -j DROP
$IPTABLES -A INPUT -s 192.168.1.0/16 -i $WAN -j DROP
echo "ativado o bloqueio de tentativa de ataque do tipo Anti-spoofings"
echo "ON ...................................................... [ OK ]"


#Bloqueio de scanners ocultos (Shealt Scan)
$IPTABLES -A FORWARD -p tcp --tcp-flags SYN,ACK, FIN, -m limit --limit 1/s -j ACCEPT
echo "bloqueado scanners ocultos"
echo "ON ...................................................... [ OK ]"

#amarrar ip ao mac
for i in `cat $MACLIST`; do
#aqui cada linha do maclist é atribuída de cada vez

STATUS=`echo $i | cut -d ';' -f 1`
#o comando echo exibe o conteúdo da variável e o pipe "|" repassa a saída para outro comando, o cut por sua vez reparte cada linha em pedaços onde o delimitador (-d) é o ';' no parâmetro -f imprime na tela conteúdo da 1º coluna (status), a saída deste é enviada para STATUS;

IPSOURCE=`echo $i | cut -d ';' -f 2`
MACSOURCE=`echo $i | cut -d ';' f 3`
MARK=`echo $IPSOURCE | cut -d '.' -f 4`

# neste caso o IPSOURCE e o MACSOURCE recebem as outras colunas da mesma linha, faço uma ressalva para o nome do computador que eu coloquei apenas para a organização do maclist, pois neste do script contará até a 3º coluna.

#aqui neste caso o comando if está dentro do laço for
#Se status = a então iptables libera a conexão através destes comandos construídos na tabela filter

if [ $STATUS = "a" ]; then
$IPTABLES -t filter -A FORWARD -d 0/0 -s $IPSOURCE -m mac --mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A FORWARD -d $IPSOURCE -s 0/0 -j ACCEPT
$IPTABLES -t filter -A INPUT -s $IPSOURCE -d 0/0 -m mac --mac-source $MACSOURCE -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s $IPSOURCE -d 0/0 -j ACCEPT
$IPTABLES -t mangle -A PREROUTING -s $IPSOURCE -j MARK --set-mark $MARK

# Se for = b então bloqueia o MAC, ele só executa este comandos se STATUS não for igual a "a".

else #se não
$IPTABLES -t filter -A FORWARD -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A INPUT -m mac --mac-source $MACSOURCE -j DROP
$IPTABLES -t filter -A OUTPUT -m mac --mac-source $MACSOURCE -j DROP
fi # fim do se
done # fim do comando laço for
echo "Ativado a amarração do ip ao mac"
echo "ON ........................................................ [ OK ]"


#proxy transparente
$IPTABLES -t nat -A PREROUTING -i $LAN -p tcp --dport 80 -j REDIRECT --to-port 3128
echo "Proxy Transparente ativado"
echo "ON ........................................................ [ OK ]"


# ativar o mascaramento
$IPTABLES -t nat -A POSTROUTING -o $WAN -j MASQUERADE

# Carrega controlador de banda
/etc/init.d/cbq start #Para Debian
#/etc/rc.d/init.d/cbq start #Para Slackware
echo
echo "============================================= |"
echo "::TERMINADA A CONFIGURAÇÃO DO FIREWALL NETFILTER ATRAVÉS::|"
echo ":: DO IPTABLES :: |"
echo "============================================= |"
echo "FIREWALL ATIVADO - SISTEMA PREPARADO"
echo "SCRIPT DE FIREWALL CRIADO POR :-) MARCELO MAGNO :-)"
;;

stop)
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -t mangle -F
$IPTABLES -t nat -F
$IPTABLES -X
$IPTABLES -Z

$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

/etc/init.d/cbq stop #Para Debian
#/etc/rc.d/init.d/cbq stop #Para Slackware
echo "FIREWALL DESCARREGADO - SISTEMA LIBERADO"
;;

restart)
$PROGRAMA stop
$PROGRAMA start
;;
*)
echo "Use: $N {start|stop|restart}" >&2
echo -e "{TEXTO}33[01;31mATENÇÃO"; tput sgr0
echo "Você não colocou nenhum argumento ou algum conhecido, então Por Padrão será dado em 5 segundos um restart no firewall"
sleep 5
$PROGRAMA restart
exit 1
esac
exit 0



Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Construindo o Firewall - O básico
   3. Construindo o Firewall - Corpo principal do script/start - parte I
   4. Construindo o Firewall - Corpo principal do script/start - parte II
   5. Construindo o Firewall - Corpo principal do script - FINAL
   6. Exemplos dos arquivos de configuração personalizada
   7. Dicas para um ambiente fechado como empresas com políticas rígidas de acesso
   8. Black List - Lista negra - Sites pornográficos
   9. Para um ambiente mais flexível
   10. Como fazê-lo funcionar no boot
   11. O script básico, completo, puro
   12. Facilidades para quem usa webmin
   13. Conclusão e as considerações finais
   14. Downloads
   15. Referências
   16. Contato & dúvidas
Outros artigos deste autor

Personalize seu shell na entrada de seu logon

Leitura recomendada

Blacklist - O que é? Como consultar o IP? Como automatizar?

Criando Autoridades Certificadores e Certificados de Testes no Linux

Backup automatizado com HD externo

Relatório de sistema via browser (shell script + CGI)

Simples sistema de backup com acesso remoto

  
Comentários
[1] Comentário enviado por elgio em 18/11/2007 - 11:08h

Oi.

Só uma contribuição:

"
#bloquear ataque do tipo SYN-FLOOD
echo "0" > /proc/sys/net/ipv4/tcp_syncookies
$IPTABLES -A INPUT -i $WAN -p tcp --syn -j syn-flood
(...)
$IPTABLES -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
"

Como descrevi em meu outro artigo "Iptables Protege contra Syn-Food?" esta técnica baseada em limit é FURADA (veja o artigo e meus argumentos em http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=7070).

Mas porque o "0" no tcp_syncookies??

Colocar "1" nele (LIGAR) por si só já é técnica suficiente para bloquear o Syn food. Claro que isto deve ser feito em TODOS os servidores. Tentar evitar a negação de serviço no firewall usando limit é FURADA!

[]'s

[2] Comentário enviado por elgio em 18/11/2007 - 11:30h

Outra coisa é sobre, também, a proteção contra SSH brute force.

Eu usava esta de por um limit (tu colocaste 1s), mas tive que ABANDONAR pelos mesmos motivos do Syn food. Acontece que o mundo tentava tanto entrar no meu SSH que meus usuários legítimos acabavam sendo o +1 no mesmo segundo e não conseguiam. Furada denovo! Resolvi isto com o uso do RECENT do iptables (onde me lembro do IP que fez SSH e o nego se ele fizer muitos em pouco tempo. DIFERENTE do limit que apenas conta quantos sem diferenciar quem, qual IP de origem).

Ah, em tempo, como eu resolvi o problema de brute force SSH eu respondi como COMENTARIO neste artigo (o cara descreveu muito bem o modulo Recent e foi lá que eu soube da existência deste ótimo módulo do iptables):
http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=5551

[3] Comentário enviado por suportemega em 19/11/2007 - 17:01h

Marcelo;

Neste artigo como você trata as coneccoes na porta 3389 (terminal service)?
tenho um servidor Linux (proxy e firewall) tenho um TS interno que já acesso de uma rede externa. Mas não consigo fazer com que minha rede interna casse um Terminal Service Externo!

[4] Comentário enviado por thaleseduardo em 19/11/2007 - 19:09h

Parabens, um excelente artigo e será de muita valia. Mas gostaria de tirar uma duvida, sobre servidor wireless. Qual regra de iptables serveria para bloquear o acesso entre os computadores, fazendo com que eles não se enxergue.

[5] Comentário enviado por Gabrihell em 20/11/2007 - 23:59h

Ótimo artigo amigo, parabéns! :-)

[6] Comentário enviado por luiscarlos em 22/11/2007 - 01:43h

$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $i -j ACCEPT
$IPTABLES -I OUTPUT -p icmp -o $WAN -j ACCEPT

isso não é redundante?

uma vez que a politica de saida é SEMPRE permitir, por que criar um regra de saida?
ótimo artigo e excelente firewall, muito bem planejado na minha opinião, parabéns.

[7] Comentário enviado por agk em 24/11/2007 - 13:24h

Gostei da organização do script em arquivos menores e também do uso do Shell para organizar melhor as coisas sem precisar ficar mudando o script de configuração principal.
Não entendi porque foi carregado o modulo ipt_log, pois não é usando em nenhum lugar, recomendo logar os serviços básicos, com a idéia do webmin acho que ficaria bem legal fazer um script Shell para tratar os logs e fazer com que apareçam em html (sei que já tem programa que faz isso, não recordo o nome).
A tabela mangle é muito útil quando se faz controle de banda com HTB, daí é possível tratar os pacotes com o classify, mas isso talvez já esteja um pouco fora do escopo do artigo.

No mais, parabéns pelo artigo, continue assim.

[8] Comentário enviado por maickelpc em 26/11/2007 - 17:41h

mto bom

[9] Comentário enviado por tiagonetwork em 29/11/2007 - 13:24h

bom mesmoooo...

[10] Comentário enviado por alaorjunior em 21/05/2008 - 00:40h

Como fazer para que as estacoes sejam obrigadas a passar pelo squid, ou melhor, seja obrigado a configuracao do proxy

[11] Comentário enviado por k4mus em 06/10/2008 - 23:25h

Amigo, uma duvida. Eh obrigatorio a chamad dos modulos no inicio .modproble .. etc. Estes modulos ja nao sao levantados automaticos na hora do comando nao?


Grato

[12] Comentário enviado por fenix_chikinho em 29/11/2008 - 13:08h

Muito bom seu artigo, fiz alguma modificações adaptando as minhas necessidades.
só contribuição
para que quiser obrigar que todas maquinas a passar pelo proxy squid
use

$IPTABLES -t nat -A PREROUTING -i $IPSOURCE -p tcp -m multiport --dport 80,443 -j REDIRECT --to-ports 3128

e para utilizar o sistema em conjunto com squid 2.6 ou superior com chache full

use essa regra logo após o redirecionamento

$IPTABLES -t mangle -A OUTPUT -p tcp -m connmark --mark 0 -m string --string "X-Cache: HIT" --algo kmp -j CONNMARK --set-mark 6
$IPTABLES -t mangle -A OUTPUT -p tcp -j CONNMARK --restore-mark
$IPTABLES -t mangle -A OUTPUT -p tcp -m mark --mark 6 -j CLASSIFY --set-class 1:9
echo "Pacotes o HTB Cache-Full ativado"
echo "ON .................................................[ OK ]"


depois crie a classe 1:9 (esta com velocodade superior as demais) voce pode utiliza o HTB ou CBQ, nao iporta pois o sistema funciona perfeitamente em ambos os controladores de banda


[13] Comentário enviado por andriopj em 08/03/2009 - 13:40h

referente a parte de liberar apenas para os mac+ips cadastrados.
tentei implementar esse script aqui, mas nao funcionou...

aqui eu uso fedora 10, rodando:
squid (Version 3.0.stable13) como proxy/webcache
dhcp (MACxIP)

tenho o seguinte cenario, uma rede onde nao posso barrar nada (skype, msn, hotmail, acesso a web, etc).
mas tenho que encontrar um meio de aumentar a seguranca do servidor ou/e ate mesmo dos usuarios (ataques)
e controlar quem acessa e quem nao acessa seria uma boa.

tem algum outro script parecido com esse, que apenas verifica se o mac e o ip coincidem, entao libera acessa a internet
caso nao coincida ou nao exista cadastrado, ele nega o acesso externo???

e onde eh o melhor local para coloca-lo?

[14] Comentário enviado por wolrk em 29/04/2009 - 09:51h

Bom dia galera gostaria de uma ajuda de vcs meu Script Firewall.
Gostaria que a galera desse uma opinião sobre ele.
########################## ScriptFirewall############################

#############################################################################

# Compartilhamento da internet

modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptable -t nat -A POSTROUTING -O eth1 -j MASQUERADE

######################################################################################

# Proxy transparente

iptables -t nat -A POSTROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --TO-PORT 5050

######################################################################################

# Regras de segurança

iptables -A INPUT -p icmp -- cmp-type echo-request -m limit --limit 1/s -j ACCEPT
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
iptables -A INPUT -m --state --state INVALID -j DROP

#######################################################################################

# Abre para interface de loopback

iptables -A INPUT -p tcp -i lo -j ACCEPT

#######################################################################################

# Abre a porta 22 (ssh) para internet:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#######################################################################################

# Dns

iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT

#######################################################################################

# HTTP,HTTPS, MSN, LIME WIREWIN E PROXY :

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 1863 -j ACCEPT
iptables -A INPUT -p tcp --dport 5050 -j ACCEPT
iptables -A INPUT -p tcp --dport 17417 -j ACCEPT
iptables -A INPUT -p tcp --dport 6346 -j ACCEPT

#######################################################################################

# Bloquear conexoes nas demais portas:

iptables -A INPUT -p tcp --syn -j DROP

iptables -A INPUT -m state --state ESTABLISHED ,RELATED -j ACCEPT

#######################################################################################

# Bloqueia as portas UDP de 0 a 1023

iptables -A INPUT -p tcp --dport 0:1023 -j DROP

#######################################################################################


[15] Comentário enviado por removido em 01/08/2009 - 22:19h

Cara oq significa o $1 em $IPTABLES -A INPUT -p tcp --dport $i -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport $i -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --sport $i -j ACCEPT

[16] Comentário enviado por carlosparisotto em 24/05/2010 - 16:44h

Cara, muito show o script. Meus parabéns, ajudou bastante a melhorar
o meu script de firewall.
Abraço!!

[17] Comentário enviado por paulo.perina em 24/05/2010 - 19:25h

e ai galera td bem? esse script do marcelo parece ser muito bom show ms mas to com um problema aq tenho um servidor ubuntu rodando samba dhcp bind squid como proxy trasnparent e toda vez q rodo esse script de firewall minha rede e minha net para até o servidor fica sem net fiz td igual ao tutorial acima mas msm assim nun funcionou sera q alguem pode me ajudar???vlw

[18] Comentário enviado por paulo.perina em 27/05/2010 - 09:03h

e ai galera td blz? consegui fazer o script funcionar mas agora ta aparecendo uma mensagem assim not found.4.4: host/network e é sempre nos sites bloqueados será q alguem pode me ajudar??? vlw

[19] Comentário enviado por GustavinhoO em 02/05/2011 - 11:09h

estou com um problema!

usando esse script de firewall, não estou conseguindo compartilhar conexão.
quando compartilho normal funciona.

outra coisa, quando coloco regra no firewall liberando as portas 80,22,443,53,1433

depois fecho o resto das portas.

ai é que ta, se fecho o resto das portas fico sem conexão.

oque pode ser?

[20] Comentário enviado por marcelinoti em 17/07/2012 - 18:01h

Fala galera!

Entao, fiz tudo tudo que explicou porem só nao estou conseguindo é acessa meu servidor de fora (SERVER 2008), coloquei a porta 3389, em, Exemplo do arquivo "/etc/configuracao_personalizada/listaderedirecionamento". Alguem pode me ajudar?


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts