UFW: firewall na VPS Ubuntu

UFW é a interface simplificada do iptables que vem com o Ubuntu, fácil de usar, eficaz e indispensável para qualquer VPS exposta à internet. Sem um firewall configurado, todas as portas abertas pelos seus serviços ficam acessíveis a qualquer IP do mundo, incluindo scanners automáticos que varrem a internet em busca de vulnerabilidades.

Configuração inicial do UFW

Primeiros passos para ativar o firewall sem perder acesso SSH:

bash
# ATENÇÃO: execute esses comandos na ordem exata
# para não se trancafiar fora da VPS

# 1. Verificar status atual
sudo ufw status verbose

# 2. Definir política padrão: bloquear tudo, depois abrir o necessário
sudo ufw default deny incoming
sudo ufw default allow outgoing

# 3. Liberar SSH ANTES de ativar (obrigatório)
sudo ufw allow ssh           # porta 22 (ou use a porta customizada)
# sudo ufw allow 2222/tcp    # se você mudou a porta do SSH

# 4. Ativar o firewall
sudo ufw enable

# 5. Verificar regras ativas
sudo ufw status numbered

# Liberar portas adicionais:
sudo ufw allow 80/tcp        # HTTP
sudo ufw allow 443/tcp       # HTTPS
sudo ufw allow 5432/tcp      # PostgreSQL (somente se necessário externamente)

# Liberar apenas de IP específico:
sudo ufw allow from 177.10.0.1 to any port 5432

Regras avançadas por IP e subrede

Restringir acesso a serviços internos por endereço IP:

bash
# Permitir acesso ao PostgreSQL apenas de IP específico:
sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp

# Permitir subrede inteira (ex: rede privada do provedor):
sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp

# Bloquear IP específico (ex: IP atacante):
sudo ufw deny from 185.220.101.0/24

# Limitar tentativas de SSH (bloqueia após 6 tentativas em 30s):
sudo ufw limit ssh

# Regra com interface de rede específica:
sudo ufw allow in on eth0 to any port 443 proto tcp

# Ver regras com números:
sudo ufw status numbered

# Remover regra pelo número:
sudo ufw delete 3

# Ou remover pela descrição:
sudo ufw delete allow 8080/tcp

Proteger serviços Docker com UFW

Por padrão, o Docker bypassa o UFW, correção necessária:

bash
# Problema: Docker adiciona regras diretamente no iptables,
# ignorando completamente o UFW

# Solução: fazer o Docker publicar apenas no localhost
# Em vez de:  ports: - "8080:8080"
# Use:        ports: - "127.0.0.1:8080:8080"

# Isso garante que apenas o Nginx (no host) acessa o container,
# e o UFW controla quem acessa o Nginx

# Para aplicar globalmente sem mudar cada compose:
# /etc/docker/daemon.json
{
  "iptables": false
}
# CUIDADO: isso quebra o networking do Docker
# A abordagem 127.0.0.1 no ports é a mais segura e simples

# Verificar quais portas o Docker está expondo:
sudo ss -tlnp | grep docker
sudo iptables -L DOCKER --line-numbers

# Verificar portas abertas após configuração:
sudo ss -tlnp
nmap -sV localhost

Monitorar tráfego bloqueado pelo UFW

Analisar o que o firewall está bloqueando:

bash
# Habilitar logging do UFW:
sudo ufw logging on        # nível medium (padrão)
sudo ufw logging high      # log de tudo (verboso)

# Logs ficam em /var/log/ufw.log:
sudo tail -f /var/log/ufw.log

# Filtrar apenas conexões bloqueadas:
sudo grep "BLOCK" /var/log/ufw.log | tail -20

# IPs que mais tentaram conexão bloqueada:
sudo grep "BLOCK" /var/log/ufw.log \
  | grep -oP 'SRC=\K[0-9.]+' \
  | sort | uniq -c | sort -rn | head -20

# Portas mais atacadas:
sudo grep "BLOCK" /var/log/ufw.log \
  | grep -oP 'DPT=\K[0-9]+' \
  | sort | uniq -c | sort -rn | head -10

# Rotação de logs (já configurada pelo logrotate no Ubuntu):
cat /etc/logrotate.d/ufw

Script de auditoria do UFW

Verificar e documentar o estado atual do firewall:

bash
#!/bin/bash
# /opt/scripts/auditoria-ufw.sh

echo "=== Auditoria UFW — $(date) ==="
echo ""

echo "--- Status e regras ativas ---"
sudo ufw status verbose

echo ""
echo "--- Portas abertas no sistema ---"
sudo ss -tlnp

echo ""
echo "--- Regras iptables (Docker) ---"
sudo iptables -L DOCKER --line-numbers 2>/dev/null | head -20

echo ""
echo "--- Top 10 IPs bloqueados hoje ---"
sudo grep "BLOCK" /var/log/ufw.log \
  | grep "$(date +%b %e)" \
  | grep -oP 'SRC=\K[0-9.]+' \
  | sort | uniq -c | sort -rn | head -10

echo ""
echo "--- Pacotes bloqueados hoje: ---"
sudo grep "BLOCK" /var/log/ufw.log | grep "$(date +%b %e)" | wc -l

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Para a maioria dos casos: UFW. É uma abstração sobre iptables com sintaxe muito mais simples, persistência automática de regras após reboot e comportamento previsível. iptables diretamente faz sentido quando você precisa de regras muito específicas (NAT, MANGLE, múltiplas tabelas) que o UFW não suporta. Para VPS com serviços web: UFW é suficiente e mais seguro de gerenciar.

Sim, Docker adiciona regras diretamente ao iptables que contornam o UFW. A solução recomendada: sempre publicar portas de containers no localhost (127.0.0.1:PORTA:PORTA) e usar Nginx como único ponto de entrada. Assim o UFW controla o Nginx e o Docker fica isolado do tráfego externo.

sudo ufw allow 8000:8100/tcp libera todas as portas de 8000 a 8100 no protocolo TCP. Para UDP: sudo ufw allow 8000:8100/udp. Para liberar todas as portas de um protocolo específico em vez de range: sudo ufw allow proto tcp from 10.0.0.0/24.

Sim, quando você executa sudo ufw enable, ele configura automaticamente o systemd (ou init.d) para iniciar o UFW no boot. As regras são persistidas em /etc/ufw/. Para verificar: sudo systemctl status ufw. Para desativar permanentemente: sudo ufw disable.

sudo ufw reset apaga todas as regras e desativa o UFW. Útil quando as regras estão bagunçadas. Após o reset: reconfigurar desde o início (default deny incoming, allow ssh, allow 80, allow 443, enable). O reset faz backup das regras anteriores em /etc/ufw/*.rules.bak.