Configurar firewall na VPS com UFW

UFW é a interface simplificada para iptables no Ubuntu/Debian, permite configurar um firewall completo com comandos diretos em inglês, sem precisar entender a sintaxe complexa do iptables. A regra básica é negar tudo e liberar apenas o que for necessário: SSH, HTTP, HTTPS e as portas dos seus apps.

Instalação e configuração inicial

UFW vem pré-instalado no Ubuntu. Antes de habilitar, libere o SSH para não se trancar para fora:

bash
# Verificar se o UFW está instalado
which ufw || apt install -y ufw

# Ver status atual
sudo ufw status

# PASSO CRÍTICO: liberar SSH antes de habilitar
sudo ufw allow OpenSSH    # porta 22
# Se mudou a porta: sudo ufw allow 2222/tcp

# Definir política padrão: negar entrada, permitir saída
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Habilitar o firewall
sudo ufw enable

# Confirmar regras ativas
sudo ufw status verbose

Regras mais comuns para apps

Libere apenas as portas que os seus serviços precisam, cada porta aberta desnecessariamente é um vetor de ataque:

bash
# Web (HTTP + HTTPS)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Atalho equivalente:
sudo ufw allow 'Nginx Full'

# Banco de dados PostgreSQL (apenas de IPs confiáveis)
sudo ufw allow from 10.0.0.0/8 to any port 5432
sudo ufw allow from 192.168.1.0/24 to any port 5432

# n8n (só acesse de IP específico ou use Nginx como proxy)
sudo ufw allow from SEU_IP to any port 5678

# Docker expõe portas bypassando o UFW por padrão!
# Para ports mapeados com "0.0.0.0:PORTA", o Docker abre no iptables
# Solução: mapear apenas para localhost e usar Nginx como proxy
# ports: "127.0.0.1:5678:5678"   (acessível só via Nginx/proxy)

Gerenciar e remover regras

Manter as regras organizadas evita acúmulo de permissões desnecessárias:

bash
# Listar regras com número (para remoção)
sudo ufw status numbered

# Remover regra por número
sudo ufw delete 3

# Remover regra por descrição
sudo ufw delete allow 8080/tcp

# Negar um IP específico (bloquear atacante)
sudo ufw deny from 203.0.113.0 to any

# Negar uma faixa de IPs
sudo ufw deny from 203.0.113.0/24 to any

# Resetar todas as regras (cuidado!)
sudo ufw reset

Rate limiting para SSH (proteção contra força bruta)

UFW tem suporte nativo a rate limiting, bloqueia IPs que fazem muitas tentativas de conexão em pouco tempo:

bash
# Habilitar rate limiting na porta SSH (6+ tentativas em 30s = ban temporário)
sudo ufw limit OpenSSH
# Ou: sudo ufw limit 22/tcp

# Para porta SSH customizada:
sudo ufw limit 2222/tcp

# Verificar se a regra foi aplicada
sudo ufw status | grep LIMIT

# Ver tentativas bloqueadas nos logs
sudo grep "UFW BLOCK" /var/log/ufw.log | tail -20

Logs e diagnóstico

Habilite logs para entender quais conexões estão sendo bloqueadas e identificar tentativas de intrusão:

bash
# Habilitar logs (nível low registra conexões bloqueadas)
sudo ufw logging on
sudo ufw logging medium   # mais detalhado

# Ver log em tempo real
sudo tail -f /var/log/ufw.log

# Contar tentativas bloqueadas por IP (top atacantes)
sudo grep "UFW BLOCK" /var/log/ufw.log \
  | grep -oP 'SRC=\K[0-9.]+' \
  | sort | uniq -c | sort -rn | head -10

# Desabilitar logs (reduz I/O em VPS muito atacadas)
sudo ufw logging off

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

UFW é uma interface simplificada para iptables, use UFW para a maioria dos casos. iptables diretamente é necessário apenas para regras muito específicas (NAT, redirecionamento de porta, marcação de pacotes) que o UFW não suporta. O UFW gera regras iptables por baixo dos panos, você pode ver com iptables -L.

Do lado do servidor: sudo ufw status verbose e verifique se a porta está listada. Teste localmente: curl http://localhost:PORTA, se responder localmente mas não externamente, é o firewall. Do lado externo: nc -zv IP_DA_VPS PORTA, "Connection refused" indica porta fechada no app; "Connection timed out" indica bloqueio pelo firewall.

Adicione no /etc/docker/daemon.json: {"iptables": false}, isso desabilita o gerenciamento automático de iptables pelo Docker. Mas atenção: containers não conseguirão mais acessar a internet sem configuração manual de roteamento. A solução mais prática é mapear portas somente para 127.0.0.1 (ex: "127.0.0.1:5678:5678") e usar Nginx como proxy para expor externamente.

deny: descarta o pacote silenciosamente (conexão fica em timeout para o atacante). reject: retorna um erro ICMP "port unreachable" imediatamente. Para segurança, deny é preferível, atacantes não descobrem se a porta existe ou está filtrada. reject é mais "polido" em redes internas onde você quer feedback rápido.

Sim. O UFW protege o sistema operacional como um todo, não só as portas Docker. Serviços do sistema (samba, nfs, rpcbind), portas abertas acidentalmente por outros processos e o próprio SSH se beneficiam do firewall. Além disso, a política deny incoming é uma defesa em profundidade.