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.