Modelo simples e funcional de Firewall com iptables
Neste tutorial vou deixar um scrip bem simples para criar seu firewall, a ideia é que ele seja funcional sem precisar ter que está alterando diversas linhas.
Primeiramente precisamos saber quais os serviços (portas) estão rodando em nosso servidor, para que possamos saber o que queremos proteger. Você pode usar o comando nmpa para fazer scanner de portas, instale ele com apt, e utilize ex: nmap localhost.
No meu exemplo vamos suporte que nosso servidor esteja com SSH e o APACHE instalado, logo temos a porta 22, e a porta 80. Agora preciso saber quem irá ter acesso a este servidor, quais IPs qual eu chamo normalmente de “IPs de gerencia”
Agora que sei que vou fechar as portas 22 e 80 e que meus IPs de gerencia são 192.168.254.0/24, 250.250.250.0/28 vamos as alterações do nosso script:
Defina as portas que deseja proteger separada por “;”
1 |
PORTAS="22;80" |
Defina os IPv4s que terão acesso separado por “;”
É válido lembrar do IP de localhost 127.0.0.1, caso contrário alguma aplicações local não ira funcionar ex.: mysql seria uma.
1 |
IP4GERENCIA="127.0.0.1;192.168.254.0/24;250.250.250.0/28" |
Defina os IPv4s que terão acesso. (localhost ::1)
1 |
IP6GERENCIA="::1;2001:db8:bebe:c0ca::/64" |
Crie o arquivo do nosso script /etc/init.d/rr-firewall, irei utilizar o editor vim, mas você pode usar o seu favorito.
1 |
# vim /etc/init.d/rr-firewall |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
#!/bin/bash ### BEGIN INIT INFO # Provides: rr-firewall # Required-Start: $all # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: ### END INIT INFO #Defina as portas que deseja proteger PORTAS="22;80" #Defina os IPv4s que terão acesso a estas portas IP4GERENCIA="127.0.0.1;192.168.254.0/24;250.250.250.0/28" #Defina os IPv4s que terão acesso a estas portas IP6GERENCIA="::1;2001:db8:bebe:c0ca::/64" # Não altere as linhas abaixo VERMELHO='\033[1;31m' VERDE='\033[1;32m' AZUL='\033[1;36m' AMARELO='\033[1;33m' ROSA='\033[1;35m' NC='\033[0m' function startFirewall(){ /sbin/iptables -F /sbin/iptables -X /sbin/iptables -t nat -F /sbin/iptables -X -t nat /sbin/iptables -F -t mangle /sbin/iptables -X -t mangle /sbin/ip6tables -F /sbin/ip6tables -X /sbin/ip6tables -F -t mangle /sbin/ip6tables -X -t mangle /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp /sbin/modprobe ipt_state /sbin/modprobe ipt_limit /sbin/modprobe ipt_MASQUERADE /sbin/modprobe ipt_LOG /sbin/modprobe iptable_nat /sbin/modprobe iptable_filter /sbin/modprobe ip_gre #Protege portas IPv4 echo; echo -e "[${ROSA} Regras IPv4 ${NC}]"; echo portas=$(echo $PORTAS | tr ";" "\n") for porta in $portas do ip4s=$(echo $IP4GERENCIA | tr ";" "\n") for ip4 in $ip4s do /sbin/iptables -A INPUT -s $ip4 -p tcp --dport $porta -j ACCEPT /sbin/iptables -A INPUT -s $ip4 -p udp --dport $porta -j ACCEPT echo -e "[${VERDE} ok ${NC}] Porta ${AMARELO}[$porta]${NC} aberta para ${AZUL}$ip4${NC}" sleep 0.1 done done portas=$(echo $PORTAS | tr ";" "\n") for porta in $portas do /sbin/iptables -A INPUT -p tcp --dport $porta -j DROP echo -e "[${VERDE} ok ${NC}] Porta ${VERMELHO}[$porta]${NC} fechada" sleep 0.1 done #Protege portas IPv6 echo; echo -e "[${ROSA} Regras IPv6 ${NC}]"; echo portas=$(echo $PORTAS | tr ";" "\n") for porta in $portas do ip6s=$(echo $IP6GERENCIA | tr ";" "\n") for ip6 in $ip6s do /sbin/ip6tables -A INPUT -s $ip6 -p tcp --dport $porta -j ACCEPT /sbin/ip6tables -A INPUT -s $ip6 -p udp --dport $porta -j ACCEPT echo -e "[${VERDE} ok ${NC}] Porta ${AMARELO}[$porta]${NC} aberta para ${AZUL}$ip6${NC}" done done portas=$(echo $PORTAS | tr ";" "\n") for porta in $portas do /sbin/ip6tables -A INPUT -p tcp --dport $porta -j DROP echo -e "[${VERDE} ok ${NC}] Porta ${VERMELHO}[$porta]${NC} fechada" sleep 0.1 done } function stopFirewall(){ /sbin/iptables -F /sbin/iptables -X /sbin/iptables -t nat -F /sbin/iptables -X -t nat /sbin/iptables -F -t mangle /sbin/iptables -X -t mangle /sbin/ip6tables -F /sbin/ip6tables -X /sbin/ip6tables -F -t mangle /sbin/ip6tables -X -t mangle /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp /sbin/modprobe ipt_state /sbin/modprobe ipt_limit /sbin/modprobe ipt_MASQUERADE /sbin/modprobe ipt_LOG /sbin/modprobe iptable_nat /sbin/modprobe iptable_filter /sbin/modprobe ip_gre } case "$1" in start ) startFirewall echo; echo -e "[${VERDE} Firewall carregado ${NC}]"; echo "Use: /etc/init.d/rr-firewall status" echo "para verificar as regras" ;; stop ) stopFirewall echo; echo -e "[${VERDE} Regras de firewall removidas ${NC}]"; echo ;; restart ) stopFirewall sleep 1 startFirewall ;; status ) echo; echo -e "[${VERDE} Regras IPv4 ${NC}]"; echo /sbin/iptables -nL echo; echo -e "[${VERDE} Regras IPv6 ${NC}]"; echo /sbin/ip6tables -nL ;; * ) echo "Opção inválida, use rr-firewall start | stop | restart | status" ;; esac |
Por fim aplicamos as permissões necessárias.
1 |
# chmod a+x /etc/init.d/rr-firewall |
Para executa-lo use:
/etc/init.d/rr-firewall start
/etc/init.d/rr-firewall status
/etc/init.d/rr-firewall restart
Nos prints estou fechando a porta 3306 e 80
Pronto! Seu servidor já vai estar protegido 🙂
Como carregar ele na inicialização? Acesse: Como usar o systemd para iniciar seu script/Aplicação no Debian
Dúvidas sugestões deixe seu comentário.
Bom dia.
como façio para liberar a porta 80 só para a internet?
Olá, muito legal seu script!
Fiz um pra mim também, mas não chega nem perto dessa obra de arte…
Uma coisa que eu não consegui criar é liberar um endereço IP (dinâmico) para acessar o servidor usando a nomenclatura nome.ddns.com.br, tem como liberar no iptables?
Exemplo:
#Defina os IPv4s que terão acesso a estas portas
IP4GERENCIA=”127.0.0.1;192.168.254.0/24;250.250.250.0/28;nome.ddns.com.br”
Meu amigo muito bacana seu script parabéns!
Show! Muito bom.