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
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
#!/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
            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
            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 +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...

5 Resultados

  1. 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 uma resposta

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