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 stop

/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.

Rudimar Remontti

Trabalho atualmente como Gerente de Redes em um Provedor de Internet no Rio Grande do Sul.

Você pode gostar...

9 Resultados

  1. Excellent article. I am going through some of these issues as well..

  2. Luiz Barcelos disse:

    Bom dia.
    como façio para liberar a porta 80 só para a internet?

  3. Marcello disse:

    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”

  4. Pedro disse:

    Meu amigo muito bacana seu script parabéns!

  5. Alex disse:

    Show! Muito bom.

  1. 10 de maio de 2018

    […] Vou pegar como base o script de firewall que publiquei (Modelo simples e funcional de Firewall com iptables) […]

  2. 12 de maio de 2018

    […] Ou utilizando um firewall para proteger a porta 19999 permitindo apenas o acesso dos IP/Classes de sua confiança. Você pode utilizar o: Modelo simples e funcional de Firewall com iptables. […]

  3. 12 de setembro de 2018

    […] Recomendado ter um firewall nesta porta para deixar apenas IPs de seus roteadores ter acesso. Neste link tenho um modelo simples e funcional de Firewall com iptables […]

  4. 17 de setembro de 2018

    […] simples de firewall no iptables (EXEMPLO MUITO BOM!) https://blog.remontti.com.br/2435 Fazendo o firewall iniciar automaticamente usando systemctl (EXEMPLO MUITO BOM!) […]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *