Autor Tópico: Script para Firewall de Borda Corporativo  (Lida 2138 vezes)

Offline digogarcia

  • Usuário Ubuntu
  • *
  • Mensagens: 7
    • Ver perfil
    • ::Unix for Life::
Script para Firewall de Borda Corporativo
« Online: 05 de Maio de 2013, 15:09 »
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.

Código: [Selecionar]
#!/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