Servidor Debian 9 – Iptables – Firewall (parte 4)

Iptables é uma ferramenta netfilter onde podemos controlar o fluxo de pacotes em nossa rede linux permitindo ou negando solicitações, neste tutorial vamos subir um firewall simples colocando uma regra negando todos os serviços e acima desta regra vamos colocar algumas especificas para liberar apenas os serviços ssh, http e mysql. Básico.

Iptables é um firewall muito simples e fácil manuseio não vou entrar muito em detalhes sobre o conceito de firewall pois para isso devemos ter uma base solida em redes (tcp,udp,syn,fyn) sugiro ler sobre o modelo OSI pois é pré-requisito para querer entender a questão de firewall.

 

Abaixo algumas anotações de estudo que fiz para aprender a fundo sobre firewall:

Para montar nossa regra devemos saber sobre os comandos e parâmetros o seguinte:

COMANDOS PARA IPTABLES

iptables -L (lista as regras)
iptables -I (adciona a regra no inicio da lista)
iptables -i 3 (adciona a regra na posição 3 da lista)
iptables -A (adciona regra no final da lista)
iptables -D (apaga uma regra do firewall)
iptables -F (apaga todas as regras do firewall)

Alguns Parâmetros

-p (especifica o protocolo)
-s (especifica a origem)
-d (especifica o destino)
-i (especificar a interface de entrada)
-o (especifica a interface de saida)
–sport (especifica a porta de origem)
–dport (especifica a porta de destino)
-j (especifica a ação ACCEPT – DROP – REJECT)

Vamos fazer uma regra de exemplo para voce conseguir entender a mágica do negocio:

Regra para negar ping em seu servidor

iptables -I INPUT -p ICMP -j DROP

ICMP – é o protocolo do pacote de ping, essa regra vai descartar a requisição de um computador remoto. O DROP descarta a requisição sem dar resposta para a maquina que pediu, ou seja, o servidor é meio “ignorante”, se caso eu coloca-se REJECT o resultado seria o mesmo (negar), mas porem teríamos uma resposta ao cliente remoto, o servidor faria a gentileza de te avisar que está negando esse serviço, mas eu acho um pouco inviável usar o reject devido ao trafego que iria gerar na rede caso vários cliente fizessem requisições gastando processamento de seu servidor.

iptables -I INPUT -p ICMP -j REJECT

Para visualizar a regra que acabamos de fazer usamos o comando:

iptables -L      ——> Ele lista todas as regras do seu firewall

Devemos notar que quando reiniciamos nosso servidor as regras desaparecem, pois foram feitas no terminal injetadas na memoria, vamos agora aprender a montar um script e colocar todas as regras que precisamos e depois fazer esse script iniciar junto com o servidor utilizando o systemd.

Primeiro devemos preparar nosso script shell no diretório /usr/local/bin/

Usaremos o nano para escreve-lo.

# nano firewall.sh

——————————————————————————–

#!/bin/bash
# Limpar todas as regras pré existentes
iptables -F
iptables -t nat -F
iptables -t mangle -F
# A linha abaixo ativa o modulo do netfilter que evita ataques DoS
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Liberar portas dos serviços necessarios
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
iptables -A INPUT -p tcp –dport 443 -j ACCEPT
iptables -A INPUT -p tcp –dport 3306 -j ACCEPT
# A linha abaixo faz o bloqueio de conexão nas demais portas
iptables -A INPUT -p tcp –syn -j DROP

——————————————————————————-

O script acima está todo detalhado  a lógica é sempre a mesma, no começo do firewall eu simplesmente limpei todas as regras existentes com o comando iptables -F, depois limpei as tabelas nat e mangle com iptables -t nat -F e iptables -t mangle -F. Na segunda parte do firewall eu usei uma linha para colocar 1 (bin=1-0) no tcp_syncookies afim de evitar ataques de DoS. A terceira parte do firewall fiz as regras de entrada no servidor para os clientes alcançarem os serviços que eu disponibilizei (ssh, http, https, mysql) todas como ACCEPT. No fim eu coloquei uma regra para negar todos os serviços. Lembre-se que o firewall funciona por linha do topo para baixo.

Depois disso o script está pronto para aciona-lo é só dar um  # sh firewall.sh no terminal, mas o que eu quero mesmo é que esse script inicie quando eu ligar o servidor para automatizar o serviço de firewall. Vamos usar o systemd (leia o post anterior desta saga) :

Faremos o serviço que inicia o firewall também em shell script, vamos colocar no diretório dos serviços do systemd que fica em /etc/systemd/system/ lá criaremos o arquivo firewall.service:

# nano firewall.service

——————————————————————

[Unit]
Description=Firewall

[Service]
ExecStart=/usr/local/bin/firewall.sh start
ExecStop=/usr/local/bin/firewall.sh stop
ExecReload=/usr/local/bin/firewall.sh restart

[Install]
WantedBy=multi-user.target

———————————————————————

Use agora os comandos do systemd para gerenciar esse serviço:

# systemdctl daemon-reload   – Atualizar o systemd
# systemctl enable firewall –  Habilitar o firewall para iniciar junto ao servidor Debian

Agora seu firewall está funcional no servidor, basta dar um iptables -L para verificar o status de suas regras.

Aqui estão alguns comandos extras:

# systemctl restart firewall  – Reinicia o serviço de firewall

# iptables -L –line-numbers – Lista as regras de acordo com as respectivas linhas

Ufa! Esse foi o post mais difícil de explicar sem dar muitos conceitos, pois firewall é um assunto de dentro de outro assunto (REDES). Caso tenha mais alguma ideia eu atualizo esse post com o tempo. Até o próximo episódio galera!

Veja toda Saga Servidor Debian 9:

Servidor Debian 9 – Comandos SYSTEMD (parte 3)

Servidor Debian 9 – Configurando a rede (parte 2)

Servidor Debian 9 – Instalação passo a passo (parte1)

Deixe um comentário