Firewall funcional
Publicado por Esli Silva (última atualização em 02/07/2014)
[ Hits: 5.394 ]
Homepage: https://esli.blog.br
Este é um script de firewall simples, mas funcional, que utilizo sempre como base para iniciar qualquer pequeno projeto com aquelas mesmas configurações de sempre (kk). Eu removi bastante particularidades dele, deixando-o com apenas o essencial para postar aqui e ser útil a qualquer um. Neste exemplo, o link interno vem de um bonding (união das placas eth1 e eth2), o link externo vem de ppp0 com IP dinâmico!!
No mesmo host há o Squid, Apache, Openfire, MySQL, VPN (PPTP)... e dentro da rede alguns webservers...
Correções, melhorias e qualquer outra coisa é bem-vinda!! Este script surgiu juntando vários outros que estão disponíveis na internet e também de necessidades (exemplo, o retorno visual e o sleep era para que o estagiário soubesse que o script "rodou"...).
#!/bin/bash # # ## BEGIN INIT INFO # Provides: Firewall # Required-Start: $all # Required-Stop: # Should-Start: S # Should-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Firewall - Eslih # Description: Script para Firewall # # ## END INIT INFO ############################# # VARIAVEIS # ############################# # bond0 --> união da eth1 e eth2 placa_interna=bond0 placa_externa=ppp0 rede_interna=172.22.0.0/24 rede_externa=0.0.0.0/0.0.0.0 LOG_FLOOD="1/s" IPT=$(which iptables) ROUTE=$(which route) # A variável abaixo é para saber qual meu IP Externo, pois o link ppp0 trata-se de adsl de ip dinâmico ip_externo=$(ifconfig ppp0 | grep -i "inet end.:" | cut -d : -f 2 | grep -i [^Bcast] > /tmp/ifconfig.txt && cat /tmp/ifconfig.txt | cut -d " " -f 2) OK="[ \E[01;32mOK\E[m ]" NO="[ \E[01;31mNO\E[m ]" start () { ######################### # MODULOS # ######################### modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state modprobe ipt_limit modprobe ipt_MASQUERADE modprobe ipt_LOG modprobe iptable_nat modprobe iptable_filter modprobe ip_gre echo -e "Carregando modulos do kernel \t\t\t\t $OK" #sleep 1 ######################### # NEGAR # ######################### $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT $IPT -A INPUT -i lo -j ACCEPT echo -e "Fechando o Firewall \t\t\t\t\t $OK" echo -e "DROP em INPUT e FORWARD \t\t\t\t $OK" #sleep 1 ######################### # LIMPAR # ######################### $IPT -F $IPT -X $IPT -F -t nat $IPT -X -t nat $IPT -F -t mangle $IPT -X -t mangle $IPT -A INPUT -i lo -j ACCEPT echo -e "Eliminado regras existentes \t\t\t\t $OK" echo -e "Limpando Firewall \t\t\t\t\t $OK" #sleep 1 ######################### # PROTEÇAO # ######################### #Barrando Time iptables -A INPUT -p TCP --dport 113 -j DROP #Barrando Auth iptables -A INPUT -p TCP --dport 37 -j DROP #Barrando VNC iptables -A INPUT -p TCP --dport 5901 -j DROP iptables -A INPUT -p TCP --dport 5900 -j DROP #Barrando X11 iptables -A INPUT -p TCP --dport 6000 -j DROP iptables -A INPUT -p TCP --dport 6001 -j DROP #Proteção contra ping da morte iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT #Proteções contra syn-floods iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses #Proteção contra port scanners ocultos iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT #Proteções contra spoofing echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route echo -e "Inserindo camadas de proteção \t\t\t\t $OK" #sleep 1 ######################### # LOGS # ######################### $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -N log $IPT -A log -j LOG --log-prefix [firewall] $IPT -A INPUT -p tcp --dport 1753 -j LOG --log-prefix=" [ACESSO SSH] " $IPT -A INPUT -p tcp --dport 22 -j LOG --log-prefix=" [ACESSO SSH] " $IPT -A INPUT -p tcp --dport 80 -j LOG --log-prefix=" [TENTATIVA ACESSO APACHE] " $IPT -A INPUT -p tcp --dport 53 -j LOG --log-prefix=" [TENTATIVA ACESSO DNS] " $IPT -A INPUT -p tcp --dport 3306 -j LOG --log-prefix=" [TENTATIVA ACESSO MYSQL] " $IPT -A INPUT -p tcp --dport 21 -j LOG --log-prefix=" [TENTATIVA ACESSO FTP] " $IPT -A INPUT -p tcp --dport 3128 -j LOG --log-prefix=" [ACESSO AO SQUID] " $IPT -A INPUT -p tcp --dport 25 -j LOG --log-prefix " [ACESSO AO SMTP] " $IPT -A INPUT -p tcp --dport 143 -j LOG --log-prefix " [ACESSO AO IMAP] " $IPT -A INPUT -p tcp --dport 110 -j LOG --log-prefix " [ACESSO AO POP] " $IPT -A INPUT -p icmp -m limit --limit $LOG_FLOOD -j LOG --log-level info --log-prefix " [ICMP Dropped] " $IPT -A INPUT -p tcp -m limit --limit $LOG_FLOOD -j LOG --log-level info --log-prefix " [TCP Dropped] " $IPT -A INPUT -p udp -m limit --limit $LOG_FLOOD -j LOG --log-level info --log-prefix " [UDP Dropped] " $IPT -A INPUT -f -m limit --limit $LOG_FLOOD -j LOG --log-level warning --log-prefix " [FRAGMENT Dropped] " $IPT -A INPUT -m limit --limit 1/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix " [IPT INPUT packet died:] " $IPT -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix " [IPT INPUT packet died:] " echo -e "Habilitando logs do firewall \t\t\t\t $OK" #sleep 1 ######################### # INPUT # ######################### $IPT -A INPUT -i lo -j ACCEPT $IPT -I INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT # SQUID: $IPT -A INPUT -i $placa_interna -p tcp --dport 3128 -j ACCEPT # MYSQL: $IPT -A INPUT -p tcp --dport 3306 -j ACCEPT # DNS: $IPT -A INPUT -i $placa_interna -p udp --dport 53 -j ACCEPT # SSH: $IPT -A INPUT -p tcp --dport 1753 -j ACCEPT #Openfire - Servidor Jabber XMPP $IPT -A INPUT -p tcp --dport 8080 -j ACCEPT $IPT -A INPUT -p tcp --dport 5222 -j ACCEPT $IPT -A INPUT -i $placa_interna -p tcp --dport 5222 -j ACCEPT #Acessos web - para redirecionamentos a webservers internos da rede $IPT -A INPUT -p tcp --dport 8988 -j ACCEPT $IPT -A INPUT -p tcp --dport 8987 -j ACCEPT $IPT -A INPUT -p tcp --dport 8986 -j ACCEPT # VPN $IPT -A INPUT -p tcp --dport 1723 -j ACCEPT $IPT -A INPUT -i ppp0 -p tcp --dport 1723 -j ACCEPT # Webmin $IPT -A INPUT -s $rede_interna -p tcp --dport 12121 -j ACCEPT #Acesso externo ao webmin $IPT -A INPUT -i $placa_externa -p tcp --dport 12121 -j ACCEPT echo -e "Configurando as opções e conexões de INPUT \t\t $OK" #sleep 1 ######################### # FORWARD # ######################### $IPT -I FORWARD -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT ### Gerencia - IPs fixados no dhcp server ### $IPT -A FORWARD -m iprange --src-range 172.22.0.95-172.22.0.99 -j ACCEPT ### Liberacao de Portas ### # MYSQL: $IPT -A FORWARD -p tcp --dport 3306 -j ACCEPT # ASTERISK - SIP $IPT -A FORWARD -p udp --dport 5060 -j ACCEPT # ASTERISK - SIP $IPT -A FORWARD -p udp --dport 3478 -j ACCEPT # ASTERISK - SIP $IPT -A FORWARD -p udp --dport 3479 -j ACCEPT # ASTERISK - AIX2/IAX $IPT -A FORWARD -p udp --dport 4569 -j ACCEPT $IPT -A FORWARD -p udp --dport 5036 -j ACCEPT # MGCP $IPT -A FORWARD -p udp --dport 2727 -j ACCEPT # DNS $IPT -A FORWARD -p udp --dport 53 -j ACCEPT # HTTP,HTTPS $IPT -A FORWARD -p tcp -m multiport --dport 80,443 -j ACCEPT # e-mail: $IPT -A FORWARD -p tcp -m multiport --dport 25,110,110,995,587 -j ACCEPT # SSH: $IPT -A FORWARD -p tcp -m multiport --dport 1753 -j ACCEPT # Audio VOIP: $IPT -A FORWARD -p udp --dport 10001:20000 -j ACCEPT # FTP: $IPT -A FORWARD -p tcp -m multiport --dport 20,21 -j ACCEPT # Paginas webservers $IPT -A FORWARD -p tcp -m multiport --dport 8989,8988,8987,8986 -j ACCEPT # ACBr $IPT -A FORWARD -p tcp -m multiport --dport 3436 -j ACCEPT # Bradesco obbplus - tcp $IPT -A FORWARD -p tcp --dport 3000 -j ACCEPT # Bradesco obbplus - udp $IPT -A FORWARD -p udp --dport 3000 -j ACCEPT # Terminal Service $IPT -A FORWARD -p tcp --dport 3389 -j ACCEPT # Redirecionamento para Aplicação Interna, clientes externos $IPT -A FORWARD -p tcp -i $placa_externa --destination-port 19234 --destination 172.22.0.207 -j ACCEPT $IPT -t nat -A PREROUTING -p tcp -i $placa_externa --destination-port 19234 -j DNAT --to-destination 172.22.0.207:19234 # TS - RDP p/ Windows $IPT -t nat -A PREROUTING -p tcp --dport 3389 -j DNAT --to 172.22.0.207 $IPT -A FORWARD -p tcp --dport 3389 -j ACCEPT #Servidor OpenVZ $IPT -t nat -A PREROUTING -p tcp --dport 8006 -j DNAT --to 172.22.0.250 $IPT -A FORWARD -p tcp --dport 8006 -j ACCEPT #Servidor SVN - OpenVZ VM $IPT -t nat -A PREROUTING -p tcp --dport 3690 -j DNAT --to 172.22.0.244 $IPT -A FORWARD -p tcp --dport 3690 -j ACCEPT #Servidor SVN - OpenVZ VM $IPT -t nat -A PREROUTING -p tcp --dport 8989 -j DNAT --to 172.22.0.244:80 $IPT -A FORWARD -p tcp --dport 8989 -j ACCEPT #Servidor web243 - OpenVZ VM #$IPT -t nat -A PREROUTING -p tcp --dport 8988 -j DNAT --to 172.22.0.243:80 #$IPT -A FORWARD -p tcp --dport 8988 -j ACCEPT #Servidor LAMP - Eslih $IPT -t nat -A PREROUTING -p tcp --dport 8986 -j DNAT --to 172.22.0.247:80 $IPT -A FORWARD -p tcp --dport 8986 -j ACCEPT #Servidor VOIP - SSH $IPT -t nat -A PREROUTING -p tcp --dport 22100 -j DNAT --to 172.22.0.241:22 $IPT -A FORWARD -p tcp --dport 22100 -j ACCEPT #Webchat - Cliente Jabber XMPP $IPT -A FORWARD -p tcp --dport 8080 -j ACCEPT $IPT -A FORWARD -p tcp -i ppp0 -s 172.22.0.0/24 --dport 21 -j ACCEPT $IPT -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT #MySQL $IPT -A INPUT -p tcp --dport 3306 -j ACCEPT $IPT -t nat -A POSTROUTING -p tcp --dport 3306 -j MASQUERADE $IPT -A INPUT -m multiport -p tcp --dport 20,21 -j ACCEPT $IPT -t nat -A POSTROUTING -m multiport -p tcp --dport 20,21 -j MASQUERADE $IPT -t nat -A POSTROUTING -o ppp0 -j MASQUERADE $IPT -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT $IPT -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT $IPT -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT $IPT -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT echo -e "Configurando regras de FORWARD \t\t\t\t $OK" echo -e "Habilitando portas do firewall \t\t\t\t $OK" #sleep 2 ######################### # NAT # ######################### # Masquerade da conexao de internet echo 1 > /proc/sys/net/ipv4/ip_forward #$IPT -t nat -A POSTROUTING -o $placa_externa -j MASQUERADE $IPT -t nat -A POSTROUTING -o $placa_interna -j MASQUERADE # ACESSO Externo das maquinas em VPN $IPT -A POSTROUTING -s 172.22.0.0/24 -j MASQUERADE # Redirecionamento de requisicoes WWW p/ SQUID $IPT -t nat -A PREROUTING -s $rede_interna -p tcp --dport 80 -j REDIRECT --to-port 3128 echo -e "Acionando NAT e redirecionamento \t\t\t $OK" echo -e "Habilitando Internet \t\t\t\t\t $OK" #sleep 1 } case "$1" in 'start') start echo -e "FIREWALL EXECUTADO \t\t\t\t\t $OK" #sleep 1 ;; 'filter') $IPT -nL | more ;; 'status') $IPT -L -vn | more ;; 'nat') $IPT -t nat -L -nv | more ;; 'mangle') $IPT -t mangle -nL | more ;; *) echo "erro use "$0" {start|filter|nat|mangle}" exit 1 ;; esac exit 0
Usando dialog para adiciona usuários no squid
Script para instalação do java no kurumin 4
zswaplig.sh - Um "Ligador" de ZSWAP, SWAP em RAM para Sabayon Linux
Instalador de novas versões do Java no Debian
Script "go" v.2 - Inicia Sessoes SSH e Terminal Service
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
É cada coisa que me aparece! - não é só 3% (3)
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta