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 “;”
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.
IP4GERENCIA="127.0.0.1;192.168.254.0/24;250.250.250.0/28"
Defina os IPv4s que terão acesso. (localhost ::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.
# vim /etc/init.d/rr-firewall
#!/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='3[1;31m' VERDE='3[1;32m' AZUL='3[1;36m' AMARELO='3[1;33m' ROSA='3[1;35m' NC='3[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.
# 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.
Excellent article. I am going through some of these issues as well..
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.