Firewall de borda corporativo

Publicado por Rodrigo Garcia (última atualização em 06/05/2013)

[ Hits: 8.385 ]

Homepage: www.unix4life.blogspot.com

Download 5782.firewall

Download 1367626680.firewall (versão 2)




Olá a todos!!!

Desenvolvi esse script com o intuito de auxiliar na construção de um firewall corporativo completo, de forma simples e prática para qualquer um. O diferencial desse script está na sua estrutura. Ele não apenas contém blocos de comandos que bloqueiam, liberam ou encaminham pacotes, mas sim uma programação que visa tornar a construção de um firewall o mais dinâmico possível. Utilizei muitas variáveis, funções, laços, AWK, etc. Acho que o resultado ficou bem legal e por isso eu quis compartilhá-lo. O script cobre a maior parte das necessidades mais comuns das empresas:

- Filtro de pacotes.
- Encaminhamento de portas.
- Priorização de pacotes (ToS).
- Compartilhamento de internet.

Inseri também as LSB tags, que permitem que o firewall seja instalado como serviço (em distribuições baseadas no Debian), bastando copiá-lo para o diretório /etc/init.d e executar o comando:

# insserv -d firewall

E a partir de então ele iniciará automaticamente com o sistema e pode ser executado com o seguinte comando:

# service firewall {start|stop|restart}

Espero que seja útil!!!

O script está mais detalhado em: http://www.unix4life.blogspot.com

  



Versões atualizadas deste script

Versão 2 - Enviado por Rodrigo Garcia em 03/05/2013

Changelog: - Correção de um erro na chamada da função FN_LOG onde faltava o parâmetro.
- Substituição de algumas linhas de comando na função FN_PING por um laço for para deixar o código mais limpo.
- E também substituição da chamada de subshell `` por $(), também para deixar o código mais limpo.

Download 1367626680.firewall


Esconder código-fonte

#!/bin/bash
#
# ## BEGIN INIT INFO
# Provides : Firewall
# Required - Start : networking
# Required - Stop :
# Should - Start : S
# Should - Stop :
# Default - Start : 2 3 4 5
# Default - Stop :
# Short - Description : Firewall - Rodrigo Garcia
# Description : Firewall - Rodrigo Garcia
#
# ## END INIT INFO
################################################################################################
# 1- VARIAVEIS
################################################################################################
IPT=$(which iptables)
HIPRT="1024:65535"
################################################################################################
# 1.1- EXTERNO - Informe a placa de rede externa em IFEXT="" e o IP externo em IPEXT=""
################################################################################################
IFEXT=""
IPEXT=""
################################################################################################
# 1.2- INTERNO - Informe a placa de rede interna em IFINT="" e o ip interno em IPINT=""
################################################################################################
IFINT=""
IPINT=""
################################################################################################
# 1.3- Redes - Informe o IP da WAN (geralmente 0/0) em IPWAN="" e o IP da rede interna (CIDR) em IPLAN=""
################################################################################################
IPWAN=""
IPLAN=""
################################################################################################
# 1.4- Informe em OPENP="" as portas abertas no firewall no formato "porta:protocolo:origem", ex: 22:tcp:192.168.0.2
# e as portas encaminhadas em FRWDP="" como "porta:protocolo:destino:porta", ex: 80:tcp:192.168.0.3:80
# As portas de saída devem ser informadas em OUTPT="" no formato porta:protocolo:destino, ex: 53:udp:0/0 ou 53:udp:$IPWAN
# As portas que devem ser priorizadas, devem ser informadas em TOSPT="" apenas com o numero ex: TOSPT="22 80 443"
################################################################################################
OPENP=""
FRWDP=""
OUTPT=""
TOSPT=""
################################################################################################
# 2- POLITICA DROP
################################################################################################
FN_DROP()
{
   for CHAIN in INPUT OUTPUT FORWARD
   do
      $IPT -P $CHAIN DROP
   done
}
################################################################################################
# 3- POLITICA ACCEPT
################################################################################################
FN_ACCEPT()
{
   for CHAIN in INPUT OUTPUT FORWARD
   do
      $IPT -P $CHAIN ACCEPT
   done
}
################################################################################################
# 4- LIMPAR FIREWALL
################################################################################################
FN_LIMPA()
{
   for TABLE in filter nat mangle
   do
      $IPT -t $TABLE -X
      $IPT -t $TABLE -F
   done
}
################################################################################################
# 5- LIBERAR LOCALHOST
################################################################################################
FN_LOCAL()
{
   $IPT -I INPUT -i lo -d 127.0.0.1 -j ACCEPT
   $IPT -I OUTPUT -o lo -s 127.0.0.1 -j ACCEPT
}
################################################################################################
# 6- LIBERAR CONEXOES
################################################################################################
FN_CONN()
{
   for CHAIN in INPUT OUTPUT FORWARD
   do
      $IPT -A $CHAIN -m state --state ESTABLISHED,RELATED -j ACCEPT
   done
}
################################################################################################
# 7- ENCAMINHAR REDES
################################################################################################
FN_FRWD()
{
   for FROM in -s -d
   do
      $IPT -A FORWARD $FROM $IPLAN -j ACCEPT
   done
}
################################################################################################
# 8- PING
################################################################################################
FN_PING()
{
   $IPT -A INPUT -i $IFINT -p icmp -s $IPLAN -d $IPINT --icmp-type 0 -j ACCEPT
   $IPT -A INPUT -i $IFINT -p icmp -s $IPLAN -d $IPINT --icmp-type 8 -j ACCEPT
   $IPT -A INPUT -i $IFEXT -p icmp -s $IPWAN -d $IPEXT --icmp-type 0 -j ACCEPT
   $IPT -A OUTPUT -o $IFINT -p icmp -s $IPINT -d $IPLAN --icmp-type 0 -j ACCEPT
   $IPT -A OUTPUT -o $IFINT -p icmp -s $IPINT -d $IPLAN --icmp-type 8 -j ACCEPT
   $IPT -A OUTPUT -o $IFEXT -p icmp -s $IPEXT -d $IPWAN --icmp-type 8 -j ACCEPT
}
################################################################################################
# 9- PORTAS DE SAIDA
################################################################################################
FN_OUTPT()
{
   for PORTA in $OUTPT
   do
      PORT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $1 }'`"
      PROT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $2 }'`"
      DEST="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $3 }'`"
      if [ -z $PROT ]
      then
         PROT="tcp"
      fi
      if [ -z $DEST ]
      then
         DEST="$IPWAN"
      fi
      NET="`echo "$IPLAN" | awk 'BEGIN { FS = "." } ; { print $1 FS $2 FS $3 FS "*"}'`"
      case $DEST in
      $NET)
         IF="`echo $IFINT`"
         IP="`echo $IPINT`"
      ;;
      *)
         IF="`echo $IFEXT`"
         IP="`echo $IPEXT`"
      ;;
      esac
      $IPT -A INPUT -i $IF -p $PROT -s $DEST --sport $PORT -d $IP --dport $HIPRT -j ACCEPT
      $IPT -A OUTPUT -o $IF -p $PROT -s $IP --sport $HIPRT -d $DEST --dport $PORT -j ACCEPT
   done
}
################################################################################################
# 10- ABRIR PORTAS
################################################################################################
FN_OPENP()
{
   for PORTA in $OPENP
   do
      PORT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $1 }'`"
      PROT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $2 }'`"
      FROM="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $3 }'`"
      if [ -z $PROT ]
      then
         PROT="tcp"
      fi
      if [ -z $FROM ]
      then
         FROM="$IPINT"
      fi
      NET="`echo "$IPLAN" | awk 'BEGIN { FS = "." } ; { print $1 FS $2 FS $3 FS "*"}'`"
      case $FROM in
      $NET)
         IF="`echo $IFINT`"
         IP="`echo $IPINT`"
      ;;
      *)
         IF="`echo $IFEXT`"
         IP="`echo $IPEXT`"
      ;;
      esac
      $IPT -A INPUT -i $IF -p $PROT -s $FROM --sport $HIPRT -d $IP --dport $PORT -j ACCEPT
      $IPT -A OUTPUT -o $IF -p $PROT -s $IP --sport $PORT -d $FROM --dport $HIPRT -j ACCEPT
   done
}
################################################################################################
# 11- ENCAMINHAR PORTAS
################################################################################################
FN_FWDP()
{
   for PORTA in $FRWDP
   do
      PORT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $1 }'`"
      PROT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $2 }'`"
      FWSV="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $3 }'`"
      FWPT="`echo $PORTA | awk 'BEGIN { FS = ":" } ; { print $4 }'`"
      if [ -z $PROT ]
      then
         PROT="tcp"
      fi
      if [ -z $FWPT ]
      then
         FWPT="`echo $PORT`"
      fi
      $IPT -t nat -A PREROUTING -i $IFEXT -p $PROT -s $IPWAN --sport $HIPRT -d $IPEXT --dport $PORT -j DNAT --to $FWSV:$FWPT
   done
}
################################################################################################
# 12- TOS - PRIORIZACAO DE PACOTES
################################################################################################
FN_TOS()
{
   for PORTA in $TOSPT
   do
      $IPT -t mangle -A PREROUTING -i $IFEXT -p tcp -s $IPWAN -d $IPEXT --sport $PORTA -j TOS --set-tos 16
      $IPT -t mangle -A OUTPUT -o $IFEXT -p tcp -s $IPEXT -d $IPWAN --dport $PORTA -j TOS --set-tos 16
   done
}
################################################################################################
# 13- COMPARTILHAR INTERNET
################################################################################################
FN_SNAT()
{
   $IPT -t nat -A POSTROUTING -o $IFEXT -s $IPLAN -j SNAT --to $IPEXT
}
################################################################################################
# 14- LOG
################################################################################################
FN_LOG()
{
   echo "$0 $1 Executado em $(date +%d-%m-%Y-%H:%M:%S)" 2>&1 >> /var/log/firewall.log
}
################################################################################################
# 15- EXECUCAO DO FIREWALL
################################################################################################
case $1 in
start)
   FN_DROP
   FN_LIMPA
   FN_LOCAL
   FN_CONN
   FN_FRWD
   FN_PING
   FN_OUTPT
   FN_OPENP
   FN_FWDP
   FN_TOS
   FN_SNAT
   FN_LOG
   echo "Starting IPTables Firewall Rules: firewall."
;;
stop)
   FN_ACCEPT
   FN_LIMPA
   FN_LOG
   echo "Stopping IPTables Firewall Rules: firewall."
;;
restart)
   $0 stop
   $0 start
;;
*)
   echo "Use $0 {start|stop|restart}"
;;
esac

Scripts recomendados

Testa se há conexão com a internet (Funciona)

Script - monitorando servidor

Monitorando processo do Squid em diferentes redes

Gerando lista de arquivos mp3 do disco em arquivo de formato HTML

Intalação do Thunderbird - Debian


  

Comentários
[1] Comentário enviado por porongo51 em 15/05/2014 - 14:31h

Muito bom hein! Belo trabalho!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts