Script para Firewall de Borda Corporativo

Iniciado por digogarcia, 05 de Maio de 2013, 15:09

tópico anterior - próximo tópico

digogarcia

Olá,

Criei esse script para facilitar a construção de um firewall de borda. Tudo o que ele precisa é que as variáveis sejam preenchidas corretamente (no próprio script tem explicações). Optei por não criar apenas blocos de comandos, mas sim através de funções, laços, etc, para tornar o código mais limpo e dinâmico.


#!/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()
{
  for TYPE in "0" "8"
  do
  $IPT -A INPUT -i $IFINT -p icmp -s $IPLAN -d $IPINT --icmp-type $TYPE -j ACCEPT
  $IPT -A OUTPUT -o $IFINT -p icmp -s $IPINT -d $IPLAN --icmp-type $TYPE -j ACCEPT
  done
  $IPT -A INPUT -i $IFEXT -p icmp -s $IPWAN -d $IPEXT --icmp-type 0 -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 "start"
  echo "Starting IPTables Firewall Rules: firewall."
;;
stop)
  FN_ACCEPT
  FN_LIMPA
  FN_LOG "stop"
  echo "Stopping IPTables Firewall Rules: firewall."
;;
restart)
  $0 stop
  $0 start
;;
*)
  echo "Use $0 {start|stop|restart}"
;;
esac