Firewall no Ubuntu
Duas ferramentas complementares para proteger o servidor: UFW define o que pode entrar, fail2ban detecta e bane comportamento suspeito em tempo real.
UFW e fail2ban são parte do setup padrão do servidor. Ver server/ubuntu-server-setup.md e server/ssl-https.md.
🆚 UFW vs fail2ban
| Característica | UFW | fail2ban |
|---|---|---|
| Tipo | Estático | Dinâmico |
| Reage a comportamento | ❌ Não | ✅ Sim |
| Bloqueia portas fechadas | ✅ Sim | ❌ Não diretamente |
| Ban por tempo | ❌ Não | ✅ Sim |
| Auto-desban | ❌ Não | ✅ Sim |
| Lê logs | ❌ Não | ✅ Sim |
| Precisa do outro? | Não | Sim (para executar o ban) |
🧱 UFW — Uncomplicated Firewall
UFW é um frontend para iptables (e nftables em kernels recentes) que simplifica o gerenciamento de regras de firewall no Ubuntu/Debian. Vem instalado por padrão, mas desabilitado.
Regras simples
ufw allow 22/tcp em vez de múltiplos comandos iptables.
IPv4 + IPv6
Gerencia ambos simultaneamente com os mesmos comandos.
Perfis de app
Pacotes definem perfis com nome (OpenSSH, Nginx Full, etc.).
📂 UFW — Estrutura de Arquivos
🚀 UFW — Configuração Inicial
Se habilitar o UFW com política deny incoming sem liberar a porta 22, você perde o acesso remoto ao servidor.
# 1. Política padrão sudo ufw default deny incoming # bloqueia tudo que entra sudo ufw default allow outgoing # permite tudo que sai # 2. Liberar SSH ANTES de habilitar sudo ufw allow 22/tcp # se mudou a porta: sudo ufw allow 2222/tcp # 3. Habilitar sudo ufw enable # 4. Verificar sudo ufw status verbose
📋 UFW — Regras
Sintaxe básica
# Porta + protocolo sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw deny 8080/tcp # Faixa de portas sudo ufw allow 8000:9000/tcp # Por serviço (/etc/services) sudo ufw allow ssh sudo ufw allow http sudo ufw allow https # Por IP de origem sudo ufw allow from 203.0.113.10 sudo ufw allow from 10.0.0.0/8 # IP + porta específica sudo ufw allow from 203.0.113.10 to any port 5432 # PostgreSQL só deste IP sudo ufw allow from 10.0.0.0/8 to any port 22/tcp # SSH só da rede interna # Por interface de rede sudo ufw allow in on eth0 to any port 80 sudo ufw deny in on eth0 to any port 3306 # MySQL: só interno
allow vs deny vs reject
| Ação | Comportamento | Quando usar |
|---|---|---|
allow |
Permite a conexão | Serviços públicos (HTTP, HTTPS, SSH) |
deny |
Dropa silenciosamente (DROP) — atacante não sabe se host existe | Padrão — política default incoming |
reject |
Envia RST/ICMP unreachable — cliente recebe erro imediato | Apps legítimas que precisam de feedback rápido |
Gerenciando regras existentes
# Listar com número sudo ufw status numbered # Deletar por número sudo ufw delete 3 # Deletar por descrição (inverso do add) sudo ufw delete allow 80/tcp # Inserir em posição específica sudo ufw insert 1 allow from 10.0.0.0/8 # CUIDADO: reseta tudo (perde SSH se não reconfigurar) sudo ufw reset
Setup típico — servidor web
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp # SSH sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw enable sudo ufw status verbose
📦 UFW — Perfis de Aplicação
Pacotes instalados registram perfis em /etc/ufw/applications.d/ com nomes amigáveis para conjuntos de portas.
# Listar perfis disponíveis sudo ufw app list # Ver detalhes de um perfil sudo ufw app info OpenSSH sudo ufw app info 'Nginx Full' # Usar perfil sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' # HTTP + HTTPS (80 + 443) sudo ufw allow 'Nginx HTTP' # só porta 80 sudo ufw allow 'Nginx HTTPS' # só porta 443
Criando perfil customizado
[MyApp] title=My Application description=My custom application ports=3000,4000/tcp
📊 UFW — Logging
# Habilitar log sudo ufw logging on # Níveis de log sudo ufw logging low # conexões bloqueadas sudo ufw logging medium # + conexões permitidas inválidas sudo ufw logging high # + todas as conexões permitidas sudo ufw logging full # absolutamente tudo # Ver logs sudo tail -f /var/log/ufw.log sudo journalctl -k --grep="UFW"
🚨 fail2ban
fail2ban monitora arquivos de log em busca de padrões suspeitos (tentativas de login falhas, scanning, etc.) e bane automaticamente os IPs ofensores usando iptables ou UFW.
Monitora logs
Lê em tempo real: /var/log/auth.log, logs do nginx, etc.
Regex por serviço
Cada "jail" tem filtros específicos para detectar falhas de autenticação.
Ban temporário
Bane por tempo configurável. Desbaneia automaticamente. Pode incrementar a cada reincidência.
⚙️ fail2ban — Como Funciona
/var/log/auth.logmaxretry dentro do findtime, executa a action: adiciona regra no UFW/iptables bloqueando o IP.Terminologia
| Termo | O que é |
|---|---|
jail | Configuração de monitoramento para um serviço específico (ex: sshd, nginx) |
filter | Regex que detecta linhas de falha no log |
action | O que fazer quando detecta falhas (adicionar regra UFW/iptables) |
bantime | Por quanto tempo o IP fica banido |
findtime | Janela de tempo para contar as tentativas |
maxretry | Quantas falhas antes de banir |
ignoreip | IPs que nunca serão banidos (whitelist) |
📂 fail2ban — Estrutura de Arquivos
Arquivos .conf são sobrescritos em atualizações. Crie e edite sempre os correspondentes .local.
🔧 fail2ban — Instalação e Setup
sudo apt install fail2ban -y # Criar jail.local a partir do conf sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Habilitar e iniciar sudo systemctl enable fail2ban sudo systemctl start fail2ban # Verificar sudo systemctl status fail2ban sudo fail2ban-client status
jail.local — configuração base ([DEFAULT])
[DEFAULT] # IPs que NUNCA serão banidos ignoreip = 127.0.0.1/8 ::1 10.0.0.0/8 # Tempo de ban bantime = 1h # aceita: 30 (segundos), 1h, 1d, 1w # Janela para contar tentativas findtime = 10m # Tentativas antes de banir maxretry = 5 # Backend de leitura de logs backend = systemd # ou: auto, polling, pyinotify # Action: usar UFW em vez de iptables direto banaction = ufw
Ban incremental — cada reincidência bane mais tempo
bantime.increment = true bantime.multiplier = 2 # dobra a cada ban: 1h → 2h → 4h → 8h... bantime.maxtime = 1w # máximo 1 semana bantime = 1h # tempo inicial
🔒 fail2ban — Configurando Jails
SSH
[sshd] enabled = true port = ssh # ou 2222 maxretry = 3 bantime = 1h
Nginx — auth básica
[nginx-http-auth] enabled = true port = http,https logpath = /var/log/nginx/error.log maxretry = 5
Nginx — limite de requests
[nginx-limit-req] enabled = true port = http,https logpath = /var/log/nginx/error.log maxretry = 10 findtime = 1m bantime = 10m
Nginx — bots/scanning
[nginx-botsearch] enabled = true port = http,https logpath = /var/log/nginx/access.log maxretry = 2 bantime = 1d
Ban times recomendados por cenário
💻 fail2ban — Comandos
# Status sudo fail2ban-client status # jails ativas sudo fail2ban-client status sshd # detalhes: banned IPs, total # Ban / Unban manual sudo fail2ban-client set sshd banip 203.0.113.50 sudo fail2ban-client set sshd unbanip 203.0.113.50 # Listar IPs banidos sudo fail2ban-client get sshd banip # Recarregar sudo fail2ban-client reload # toda configuração sudo fail2ban-client reload sshd # jail específica # Logs sudo tail -f /var/log/fail2ban.log sudo journalctl -u fail2ban -f # Regras geradas no iptables sudo iptables -n -L f2b-sshd --line-numbers # Testar filtro SEM banir sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
🎯 fail2ban — Filtros Customizados
Para proteger uma aplicação que não tem filtro padrão.
[Definition] # <HOST> é substituído pelo IP capturado failregex = ^<HOST> .* "POST /login" 401 ignoreregex =
[myapp-login] enabled = true port = 443 logpath = /var/log/nginx/access.log filter = myapp maxretry = 5 bantime = 1h
# Testa o regex contra o log sem executar nada
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/myapp.conf --print-all-matched
🔗 Integração UFW + fail2ban
fail2ban usa o UFW como "action" — quando detecta um IP malicioso, chama o UFW para inserir a regra de bloqueio.
[DEFAULT] banaction = ufw # usa UFW em vez de iptables direto
Com isso, fail2ban executa internamente:
# ao banir: ufw insert 1 deny from <IP> to any # ao desbanir: ufw delete deny from <IP> to any
Mantém visibilidade: bans aparecem em ufw status. Consistência: tudo passa pelo mesmo mecanismo de firewall. Sem conflito entre regras UFW e iptables direto.
🚀 Setup Completo — Do Zero
Sequência usada no server/ubuntu-server-setup.md deste projeto.
# ───────────────────────────────────────── # PASSO 1: UFW # ───────────────────────────────────────── sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp # SSH — ANTES de habilitar! sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw enable sudo ufw status verbose # ───────────────────────────────────────── # PASSO 2: fail2ban # ───────────────────────────────────────── sudo apt install fail2ban -y sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # Criar config modular sudo tee /etc/fail2ban/jail.d/custom.conf > /dev/null << 'EOF' [DEFAULT] banaction = ufw bantime = 1h maxretry = 5 findtime = 10m [sshd] enabled = true port = ssh maxretry = 3 EOF # Iniciar sudo systemctl enable fail2ban sudo systemctl start fail2ban # ───────────────────────────────────────── # VERIFICAÇÃO # ───────────────────────────────────────── sudo ufw status verbose sudo fail2ban-client status sudo fail2ban-client status sshd
📡 Monitoramento e Diagnóstico
sudo ufw status verbose sudo ufw status numbered sudo tail -f /var/log/ufw.log
# Jails e IPs banidos sudo fail2ban-client status sudo fail2ban-client status sshd # Logs em tempo real sudo tail -f /var/log/fail2ban.log sudo journalctl -u fail2ban -f # IPs banidos agora sudo fail2ban-client get sshd banip # Ver regras geradas pelo fail2ban no iptables sudo iptables -n -L f2b-sshd --line-numbers # Testar filtro sem executar ação sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf --print-all-matched
⚡ Referência Rápida
Documentação relacionada neste projeto
Referências externas
man ufw
fail2ban docs
DigitalOcean
Guias de UFW e fail2ban no Ubuntu com exemplos práticos