Firewall de borda corporativo
Publicado por Rodrigo Garcia (última atualização em 06/05/2013)
[ Hits: 8.459 ]
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
ADMINISTRANDO USUARIOS COM XDIALOG
Serviço de conexão 3G - Debian
Descompactar vários arquivos ao mesmo tempo de um diretório específico
Script de backup para fita DAT
Dialog - Menu semi-gráfico para adicionar, excluir, alterar usuários no Samba
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Jogando com Proton no LInux (0)
Ingress NGINX Controller CVSS base score of 9.8 (4)
Impossível corrigir problemas, você manteve (hold) pacotes quebrados. (2)