Firewall de borda corporativo
Publicado por Rodrigo Garcia (última atualização em 06/05/2013)
[ Hits: 8.712 ]
Homepage: www.unix4life.blogspot.com
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ã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.
#!/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
Script para atualizar o sistema
Atualização automática de data e hora com ntpdate
E-mails através de um servidor remoto
Script de alteração do sources.list
POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - SCRIPT DO IPTABLES
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









