Firewall para o dia a dia

Em ambiente corporativo devemos nos preocupar bastante com a segurança da nossa rede interna e os dados que nela trafegam, não podemos vacilar e nem "dar mole" pra não ser vítima de um ataque e acabar "dando empada pro gato", como se diz aqui no meu trabalho. Bem, vou abordar aqui um firewall simples com diversos bloqueios e redirecionamentos para serviços especiais internos.

[ Hits: 35.979 ]

Por: Eliseu Ribeiro Cherene Viana em 09/08/2007


O firewall (firewall.sh)



#!/bin/bash
# Script de Execução de Firewall Iptables 1.0
# Criado por Eliseu Cherene eliseurcv@hotmail.com www.eliseucherene.com
# Dia 30/07/2007 4:30 AM


echo "Iniciando Firewall..."

# ------------- #
# VARIÁVEIS #
# ------------- #

IF_EXTERNA=eth0
IF_INTERNA=eth1
IF_DMZ=eth2

# ---------------------------------------- #
# PROTEÇÃO CONTRA IP SPOOFING #
# ---------------------------------------- #

echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

# --------------------------------------- #
# DETERMINA A POLÍTICA PADRÃO #
# --------------------------------------- #

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#############
# TABELA FILTER #
#############

# -------------------------------------------- #
# DROPA PACOTES TCP INDESEJÁVEIS #
# -------------------------------------------- #

iptables - A FORWARD -p tcp ! -syn -m state -state NEW -j LOG -log-level 6 -log-prefix "FIREWALL: NEW sem syn:"
iptables - A FORWARD -p tcp ! -syn -m state -state NEW -j DROP

# ---------------------------------------- #
# DROPA PACOTES MAL FORMADOS #
# ---------------------------------------- #

iptables -A INPUT -i $IF_EXTERNA -m unclean -j LOG -log-log-level 6 -log-prefix "FIREWALL: pacote mal formado:"
iptables -A INPUT -i $IF_EXTERNA -m unclean -j DROP

# ------------------------------------------------------------ #
# ACEITA PACOTES QUE REALMENTE DEVEM ENTRAR #
# ------------------------------------------------------------ #

iptables - A INPUT -i ! $IF_EXTERNA -j ACCEPT
iptables - A INPUT -m state - state ESTABILISHED,RELATED -j ACCEPT
iptables - A OUTPUT -m state - state ESTABILISHED,RELATED,NEW -j ACCEPT
iptables - A FORWARD -m state - state ESTABILISHED,RELATED,NEW -j ACCEPT

# ---------------------------------- #
# PROTEÇÃO CONTRA TRINOO #
# ---------------------------------- #

iptables -N TRINOO
iptables -A TRINOO -m limit -limit 15/m -j LOG -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 TROJANS #
# ------------------------------------ #

iptables -N TROJAN
iptables -A TROJAN -m limit -limit 15/m -j LOG -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 6660 -j TROJAN
iptables -A INPUT -p TCP -i $IF_EXTERNA -dport 4000 -j TROJAN
iptables -A INPUT -p TCP -i $IF_EXTERNA -dport 6000 -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 WORMS #
# --------------------------------- #

iptables -A FORWARD -p tcp -dport 135 -i $IFINTERNA -j REJECT

# -------------------------------------- #
# PROTEÇÃO CONTRA SYN-FLOOD #
# -------------------------------------- #

iptables -A FORWARD -p tcp -syn -m limit -limit 2/s -j ACCEPT

# -------------------------------------------- #
# PROTEÇÃO CONTRA PING DA MORTE #
# ------------------------------------------- #

iptables -A FORWARD -p icmp-type echo-request -m limit -limit 1/s -j ACCEPT

# -------------------------------------------- #
# 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

# ---------------------------------------------------------------------------- #
# CRIA LOG DE TENTATIVA 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 tcp -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 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"

# --------------------------------------------------------------- #
# LIBERA ACESSO EXTERNO A DETERMINADAS PORTAS #
# --------------------------------------------------------------- #

iptables -A INPUT -p -dport 22 -i $IF_EXTERNA -j ACCEPT

# ---------------------------------------------------------------------------------- #
# LIBERA ACESSO PARA FORA DA PORTA 9090 para um determinado IP #
# ---------------------------------------------------------------------------------- #

iptables -A FORWARD -p tcp -d ! xxx.xxx.xxx.xxx -dport 9090 -j LOG -log-level 6 -log-prefix "FIREWALL: 9090"
iptables -A FORWARD -p tcp -d ! xxx.xxx.xxx.xxx -dport 9090 -j ACCEPT

# OU

iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx/xx -p tcp --dport 9090 -j MASQUERADE

###########
# TABELA NAT #
###########

# ------------------------------------------- #
# ATIVA O MASCARAMENTO DE SAÍDA #
# ------------------------------------------- #

iptables -A POSTROUTING -t nat -o $IF_EXTERNA -j MASQUERADE

# --------------------------------------------------------------------------------- #
# ATIVA O MASCARAMENTO DE SAÍDA COM VÁRIAS PORTAS AO MESMO #TEMPO
# --------------------------------------------------------------------------------- #

iptables -t nat -A POSTROUTING -p tcp -o $IF_EXTERNA -m multiport --dport xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx,xxx -j MASQUERADE

# --------------------------- #
# PROXY TRANSPARENTE #
# --------------------------- #

#iptables -t nat -A PREROUTING -i $IF_INTERNA -p TCP -DPORT 80 -j REDIRECT -to-port 3128
#iptables -t nat -A PREROUTING -i $IF_INTERNA -p TCP -DPORT 8080 -j REDIRECT -to-port 3128

# -------------------------------------------------- #
# REDIRECIONA PORTAS PARA OUTROS PCS #
# -------------------------------------------------- #

iptables -t nat -A PREROUTING -d xxx.xxx.xxx.xxx -p tcp -dport 22 -j DNAT -to-destination xxx.xxx.xxx.xxx

# ------------------------------------------------------------------------------ #
# REDIRECIONA PORTAS PARA OUTROS PCS VIDAS DO IP EXTERNO #
# ------------------------------------------------------------------------------ #

iptables -A PREROUTING -t nat -p tcp -i $IF_INTERNA -d $IF_INTERNA --dport xxxx -j DNAT --to xxx.xxx.xxx.xxx:xxxx
iptables -A FORWARD -p tcp -i $IF_INTERNA -d xxx.xxx.xxx.xxx --dport xxxx -j ACCEPT

# -------------------------------------------- #
# LIBERA O MSN APENAS PARA ESTE IP #
# -------------------------------------------- #

iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx -p tcp --dport 1863 -j MASQUERADE

Obrigado a todos.

Página anterior    

Páginas do artigo
   1. Introdução
   2. O firewall (firewall.sh)
Outros artigos deste autor

Implementando um servidor DHCP

Samba standalone server com antivírus

Samba como controlador de domínio no Ubuntu

Slackware como controlador de domínio

Leitura recomendada

Squid + iptables (método ninja)

Estrutura do IPTables 2: a tabela nat

Iptables detalhado

Conexões de entrada e saída com 2 links em um servidor

Criando firewalls dinâmicos com Iptables Recent

  
Comentários
[1] Comentário enviado por y2h4ck em 09/08/2007 - 09:47h

Entro no mérito de "Artigo/Dica" ?

Não ... :P

[]s

[2] Comentário enviado por dtux em 09/08/2007 - 13:01h

Tem q arrumar algumas regras do ultimo scritp, pois estão com argumento repetido e falatando parametro
ex
iptables -A TRINOO -m limit -limit 15/m -j LOG -log-log-level 6 -log-prefix "FIREWALL: trinoo:"

Possui dois erros -j LOG -log-log-level, parametro log repetido duas vezes
e limit -limit 15/m , tem q ser limit --limit 15/m

[3] Comentário enviado por elgio em 09/08/2007 - 14:42h

Pois é.
Eu acho muito complicado escrever um script de firewall genérico para o dia a dia... Os usuários instalam ele e nem sabem o que estão fazendo!
Ou se aprende a construir o seu, realmente personalizado para tuas necessidades ou se usa uma interface gráfica.

Por exemplo: para que tanta regra se o que eu tenho é um desktop? Nada do FORWARD tem sentido! Pra que aceitar SYN se o meu desktop não é servidor de nada? Ou mais, ele é servidor de HTTP, então para que aceitar SYN em outros serviços como SSH?

Eu sou contra scripts genéricos de firewall, mas cada um cada um :-D
Veja, por exemplo, estes tópicos de discussão:
http://www.vivaolinux.com.br/comunidades/verTopico.php?codigo=40&codtopico=5402

[4] Comentário enviado por srf em 09/08/2007 - 15:18h

Meus parabens muito bom seu artigo...

[5] Comentário enviado por maniac em 10/08/2007 - 11:22h

Muito bom

[6] Comentário enviado por DondaJr em 10/08/2007 - 19:16h

Acho que esse firewall vale mais para aprendizado do que para uso em si.!

Porém, tem que se observar bastante,já que há erros de parametros

[7] Comentário enviado por jgama em 11/08/2007 - 19:08h

sem dizer que a regra unclean não é mais aceita no kernel 2.6

Abraço

[8] Comentário enviado por fmpfmp em 13/08/2007 - 15:36h

Nada demais, existem milhares de scripts de iptables na net.

[9] Comentário enviado por removido em 17/10/2009 - 11:27h

Bem Explicado seu Script. Parabens

[10] Comentário enviado por removido em 17/10/2009 - 22:40h

Firewall para o Dia a Dia Certamente, Otimo.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts