---
title: "Configurar Fail2Ban na VPS: SSH, Nginx e reincidentes"
description: "Instale o Fail2Ban no Ubuntu, crie o jail.local e ative jails para SSH, Nginx e reincidentes, com backend certo no 24.04, consulta de bans e unban."
url: "https://streethosting.com.br/guias/vps/configurar-fail2ban-ssh-vps"
category: "vps"
slug: "configurar-fail2ban-ssh-vps"
datePublished: "2026-06-17"
dateModified: "2026-09-28"
author: "Equipe StreetHosting"
difficulty: "intermediario"
language: "pt-BR"
keywords:
  - "configurar fail2ban ssh vps"
  - "fail2ban proteger ssh"
  - "bloquear forca bruta ssh"
  - "jail fail2ban bantime maxretry"
  - "fail2ban nginx"
  - "fail2ban ubuntu 24.04"
  - "fail2ban recidive"
---

# Fail2Ban na VPS Ubuntu: jails para SSH, Nginx e reincidentes

O Fail2Ban lê os logs, identifica quem erra demais e bane o IP no firewall. Veja como configurar no Ubuntu 24.04, onde o padrão do pacote muda o comportamento das jails, e como operar os bans no dia a dia.

> **Resposta rápida**
>
> Instale com `sudo apt install fail2ban`, crie o `/etc/fail2ban/jail.local` com ignoreip, bantime e aumento progressivo, ajuste a jail do SSH e valide com `sudo fail2ban-client -t`. No **Ubuntu 24.04** o padrão é ler o journal, então jails que leem arquivo, como as do Nginx e a recidive, precisam de `backend = auto`.

## O que o Fail2Ban faz e o que não faz

Todo servidor com IP público recebe tentativas de login automáticas minutos depois de ligado. O Fail2Ban observa os registros do sistema, conta as falhas de cada IP dentro de uma janela de tempo e, quando o limite é atingido, cria uma regra de bloqueio no firewall por um período. Cada conjunto de serviço monitorado, filtro, limite e ação se chama jail.

O que ele não faz: não segura ataques distribuídos em que milhares de IPs tentam uma senha cada um, não substitui o [login por chave](https://streethosting.com.br/guias/vps/configurar-chave-ssh-sem-senha-vps) e não serve contra DDoS, porque só age depois que as tentativas já chegaram e foram registradas. Ele é um redutor de ruído e de risco, não uma muralha.

## Instalar e entender os arquivos

Atualize o sistema antes de instalar. O pacote do Ubuntu 24.04 já teve uma versão que não subia com o Python 3.12, corrigida por atualização.

```
sudo apt update && sudo apt upgrade
sudo apt install fail2ban
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
```

O Fail2Ban lê a configuração em camadas, e o último valor lido vence: primeiro o `jail.conf`, depois os arquivos .conf em `jail.d/`, depois o `jail.local` e por fim os .local em jail.d. O jail.conf traz os padrões e as jails prontas, desligadas; nunca edite ele, porque atualizações do pacote sobrescrevem. No Ubuntu, o pacote ainda instala este arquivo:

```
# /etc/fail2ban/jail.d/defaults-debian.conf (Ubuntu 24.04)
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]
backend = systemd

[sshd]
enabled = true
```

Três consequências práticas. A jail do SSH já nasce ligada. Os bans são feitos direto no nftables, em uma tabela própria, e não aparecem no `ufw status`. E o backend systemd, definido no DEFAULT, vale para toda jail que não declara o próprio, caso das jails do Nginx e da recidive. Ele lê o journal, ótimo para o SSH, mas inútil para serviços que gravam em arquivo.

## O jail.local e a jail do SSH

Todas as suas mudanças vão em um único arquivo, criado do zero:

```
# /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
bantime.maxtime = 1w

[sshd]
enabled = true
mode = aggressive
maxretry = 3
# port = 2222
```

- **ignoreip:** troque 203.0.113.10 pelo seu IP fixo, se tiver. Se o seu IP muda, deixe só os endereços locais e confie no login por chave.
- **bantime.increment:** cada novo ban do mesmo IP dobra de duração, até o teto de bantime.maxtime. Robôs persistentes somem por dias; um erro isolado custa só uma hora.
- **mode = aggressive:** o filtro do SSH tem os modos normal, ddos, extra e aggressive. O último junta todos e pega também conexões que desistem antes de autenticar, comuns em varreduras.
- **port:** se o SSH usa porta customizada, informe aqui. A regra de ban bloqueia só a porta configurada, e um ban na 22 não impede nada se o SSH escuta na 2222.

Valide antes de aplicar, porque um erro de sintaxe impede o serviço de subir:

```
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
```

## Jails para o Nginx

O Fail2Ban já traz filtros para o Nginx. Os três mais úteis leem o log de erro e bloqueiam as portas 80 e 443. Acrescente ao mesmo jail.local:

```
[nginx-http-auth]
enabled = true
backend = auto
logpath = /var/log/nginx/error.log

[nginx-limit-req]
enabled = true
backend = auto
logpath = /var/log/nginx/error.log
findtime = 1m
maxretry = 10

[nginx-botsearch]
enabled = true
backend = auto
logpath = /var/log/nginx/error.log
```

- `nginx-http-auth`: bane quem erra usuário ou senha em áreas protegidas por autenticação básica do Nginx.
- `nginx-limit-req`: bane quem estoura o limite de frequência repetidamente. Só funciona se você configurou limit_req no Nginx, como mostra o guia de [proteção de aplicação web](https://streethosting.com.br/guias/infraestrutura/proteger-aplicacao-web-ataques).
- `nginx-botsearch`: bane robôs que procuram caminhos típicos de painel e instalador que não existem no seu site.

Antes de ativar, teste se o filtro reconhece as linhas do seu log. O resultado mostra quantas linhas casaram:

```
sudo fail2ban-regex /var/log/nginx/error.log /etc/fail2ban/filter.d/nginx-limit-req.conf
```

> **Atenção**
>
> Se o site fica atrás de uma CDN, o log registra o IP da CDN, e o Fail2Ban baniria a própria CDN, derrubando o site para muita gente. Configure o IP real no Nginx antes. E lembre que, mesmo com o IP certo, um ban no firewall da VPS não barra quem entra pela CDN, porque a conexão vem dela.

### Outros serviços e filtros próprios

A pasta `/etc/fail2ban/filter.d/` tem filtros prontos para dezenas de serviços, como Postfix, Dovecot, MySQL e servidores de FTP; o jail.conf traz as jails correspondentes, desligadas. Para a sua própria aplicação, basta ela registrar cada login falho com o IP em uma linha previsível. O filtro é uma expressão regular em que `<HOST>` marca onde está o IP:

```
# /etc/fail2ban/filter.d/minha-app.conf
[Definition]
failregex = ^.*login falhou .* ip=<HOST>$

# no jail.local
[minha-app]
enabled = true
backend = auto
logpath = /var/log/minha-app/app.log
port = http,https
maxretry = 5
```

Se a aplicação roda como serviço systemd e escreve só no journal, mantenha o backend systemd e troque o logpath por `journalmatch = _SYSTEMD_UNIT=minha-app.service`. Em qualquer caso, teste com o `fail2ban-regex` antes de ligar.

## Jail recidive para reincidentes

A recidive é uma jail que lê o log do próprio Fail2Ban. Quando um IP é banido várias vezes, por qualquer jail, ela aplica um ban longo em todas as portas. Os padrões já vêm no jail.conf: log em `/var/log/fail2ban.log`, ban de uma semana, janela de um dia e ação que bloqueia todas as portas. Falta só ligar e corrigir o backend:

```
[recidive]
enabled = true
backend = auto
logpath = /var/log/fail2ban.log
```

Com o aumento progressivo ligado, a recidive fica em parte redundante para o SSH, mas continua útil para cruzar jails: um IP que foi banido no Nginx e depois tenta o SSH é o mesmo robô, e merece sair de circulação em tudo.

## Parâmetros que você vai ajustar

| Parâmetro | O que controla | Padrão | Sugestão |
| --- | --- | --- | --- |
| maxretry | Falhas antes do ban | 5 | 3 no SSH, 10 no limite de requisições |
| findtime | Janela para contar as falhas | 10 minutos | 10 minutos; 1 minuto no limite de requisições |
| bantime | Duração do ban | 10 minutos | 1 hora, com aumento progressivo |
| bantime.increment | Ban cresce a cada reincidência | Desligado | Ligado, com teto de uma semana |
| ignoreip | Endereços nunca banidos | Só os IPs da própria máquina | Acrescentar o seu IP fixo, se tiver |
| backend | De onde vêm os eventos | systemd no Ubuntu 24.04 | auto nas jails que leem arquivo |
| banaction | Como o ban é aplicado | nftables no Ubuntu 24.04 | Manter; ufw se quiser ver os bans no UFW |
| mode (sshd) | Quais mensagens do SSH contam | normal | aggressive |

## Consultar, desbanir e ver os bloqueios

Os comandos do dia a dia:

```
# jails ativas e resumo de uma jail
sudo fail2ban-client status
sudo fail2ban-client status sshd

# desbanir em uma jail ou em todas
sudo fail2ban-client set sshd unbanip 198.51.100.23
sudo fail2ban-client unban 198.51.100.23

# banir na mão, útil para testar a ação
sudo fail2ban-client set sshd banip 198.51.100.23

# ver os bloqueios no firewall e acompanhar o log
sudo nft list table inet f2b-table
sudo tail -f /var/log/fail2ban.log
```

O status de uma jail mostra quantas falhas estão sendo contadas, o total de bans e a lista de IPs banidos no momento. Nas jails que leem arquivo, mostra também a lista de arquivos monitorados; se ela estiver vazia, o backend ou o logpath estão errados. No `/var/log/fail2ban.log`, cada falha contada aparece como uma linha Found e cada bloqueio como uma linha NOTICE com o nome da jail, a palavra Ban e o IP. Um pico de linhas Found de muitos IPs diferentes, cada um com uma ou duas tentativas, é sinal de ataque distribuído, que o Fail2Ban não segura sozinho.

> **Dica**
>
> Prefere ver os bans junto com as regras do [UFW](https://streethosting.com.br/guias/vps/firewall-ufw-vps-ubuntu)? Coloque `banaction = ufw` no DEFAULT do jail.local. Cada ban vira uma regra no topo do UFW. O nftables direto é mais eficiente com muitos bans, mas os dois funcionam. Se você se banir por engano, o console da VPS no painel continua acessível.

## Fail2Ban dentro da defesa em camadas

- [ ] Login por chave ativo e senha desativada no SSH
- [ ] Login direto do root desativado
- [ ] Firewall liberando só as portas necessárias
- [ ] Jail do SSH na porta real, com aumento progressivo
- [ ] Jails do Nginx com backend auto e filtro testado
- [ ] Recidive ligada para reincidentes

O Fail2Ban é a camada que reage. As que previnem são a configuração do próprio SSH, detalhada no guia de [SSH seguro na VPS](https://streethosting.com.br/guias/vps/ssh-seguro-vps-linux), e a estratégia de exposição, com restrição por IP ou VPN, em [proteger o SSH contra força bruta](https://streethosting.com.br/guias/infraestrutura/proteger-servidor-linux-ssh-brute-force).

Nas [VPS da StreetHosting](https://streethosting.com.br/vps), com KVM e acesso root, o Fail2Ban e o nftables funcionam sem restrição, e o AntiDDoS incluso na rede cuida do volume que nenhuma jail seguraria. O Fail2Ban é leve e roda bem desde a VPS Xeon de R$ 26,00 ou a Ryzen 9 9950X de R$ 42,00. Para projetos grandes, com muitos serviços expostos, os [servidores dedicados](https://streethosting.com.br/dedicated) em São Paulo têm 10 Gbps, AntiDDoS e acesso root total, a partir de R$ 1.599,00, com entrega em até 6 dias.

## Perguntas frequentes

### O Fail2Ban substitui a chave SSH?

Não. A chave elimina a adivinhação de senha, e o Fail2Ban reduz o ruído banindo quem insiste. Com senha desativada no SSH, um ataque de força bruta não tem chance de sucesso; o Fail2Ban continua útil para limpar os logs e poupar recursos.

### Por que a jail do Nginx não bane ninguém no Ubuntu 24.04?

Quase sempre é o backend. O pacote do Ubuntu 24.04 define o backend systemd como padrão, as jails do Nginx herdam esse valor, e o Nginx grava em arquivo, não no journal. Acrescente backend = auto na jail e confira no status dela se o arquivo de log aparece na lista monitorada.

### Bani o meu próprio IP. Como desfaço?

Entre por outra rede, como o 4G do celular, ou pelo console da VPS na área do cliente, e rode o comando unban do cliente do Fail2Ban com o seu IP. Depois, se o seu IP for fixo, coloque ele no ignoreip para não repetir.

### Quanto tempo devo banir um IP?

Uma hora é um bom começo para SSH. Com o aumento progressivo ligado, cada reincidência dobra o tempo até um teto, e a jail recidive tira de circulação por uma semana quem é banido várias vezes no mesmo dia. Ban permanente raramente compensa, porque IPs mudam de dono.

### O Fail2Ban funciona com o site atrás de uma CDN?

Só com ajustes. O Nginx precisa registrar o IP real do visitante, e mesmo assim banir esse IP no firewall da VPS não adianta, porque a conexão chega pela CDN. Nesse cenário o bloqueio tem que acontecer na própria CDN ou no Nginx, e o Fail2Ban fica para SSH e serviços acessados direto.

## Guias relacionados

- [SSH seguro em VPS Linux: chaves, senhas, fail2ban e hábitos que evitam invasão](https://streethosting.com.br/guias/vps/ssh-seguro-vps-linux.md)
- [UFW na VPS Ubuntu: regras de firewall sem perder o SSH](https://streethosting.com.br/guias/vps/firewall-ufw-vps-ubuntu.md)
- [Como configurar chave SSH sem senha na VPS](https://streethosting.com.br/guias/vps/configurar-chave-ssh-sem-senha-vps.md)
- [Proteger SSH contra brute force: estratégia em camadas](https://streethosting.com.br/guias/infraestrutura/proteger-servidor-linux-ssh-brute-force.md)
- [Proteger aplicação web contra ataques: defesa em camadas](https://streethosting.com.br/guias/infraestrutura/proteger-aplicacao-web-ataques.md)

## Produtos citados

- https://streethosting.com.br/vps
- https://streethosting.com.br/vps/ryzen
- https://streethosting.com.br/dedicated

## Dados estruturados

```json
[
  {
    "@context": "https://schema.org",
    "@type": [
      "Article",
      "TechArticle"
    ],
    "headline": "Fail2Ban na VPS Ubuntu: jails para SSH, Nginx e reincidentes",
    "name": "Configurar Fail2Ban na VPS: SSH, Nginx e reincidentes",
    "abstract": "O Fail2Ban lê os logs, identifica quem erra demais e bane o IP no firewall. Veja como configurar no Ubuntu 24.04, onde o padrão do pacote muda o comportamento das jails, e como operar os bans no dia a dia.",
    "description": "Instale o Fail2Ban no Ubuntu, crie o jail.local e ative jails para SSH, Nginx e reincidentes, com backend certo no 24.04, consulta de bans e unban.",
    "datePublished": "2026-06-17",
    "dateModified": "2026-09-28",
    "author": {
      "@type": "Organization",
      "name": "Equipe StreetHosting"
    },
    "publisher": {
      "@type": "Organization",
      "name": "StreetHosting",
      "url": "https://streethosting.com.br"
    },
    "inLanguage": "pt-BR",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://streethosting.com.br/guias/vps/configurar-fail2ban-ssh-vps"
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "O Fail2Ban substitui a chave SSH?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Não. A chave elimina a adivinhação de senha, e o Fail2Ban reduz o ruído banindo quem insiste. Com senha desativada no SSH, um ataque de força bruta não tem chance de sucesso; o Fail2Ban continua útil para limpar os logs e poupar recursos."
        }
      },
      {
        "@type": "Question",
        "name": "Por que a jail do Nginx não bane ninguém no Ubuntu 24.04?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Quase sempre é o backend. O pacote do Ubuntu 24.04 define o backend systemd como padrão, as jails do Nginx herdam esse valor, e o Nginx grava em arquivo, não no journal. Acrescente backend = auto na jail e confira no status dela se o arquivo de log aparece na lista monitorada."
        }
      },
      {
        "@type": "Question",
        "name": "Bani o meu próprio IP. Como desfaço?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Entre por outra rede, como o 4G do celular, ou pelo console da VPS na área do cliente, e rode o comando unban do cliente do Fail2Ban com o seu IP. Depois, se o seu IP for fixo, coloque ele no ignoreip para não repetir."
        }
      },
      {
        "@type": "Question",
        "name": "Quanto tempo devo banir um IP?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Uma hora é um bom começo para SSH. Com o aumento progressivo ligado, cada reincidência dobra o tempo até um teto, e a jail recidive tira de circulação por uma semana quem é banido várias vezes no mesmo dia. Ban permanente raramente compensa, porque IPs mudam de dono."
        }
      },
      {
        "@type": "Question",
        "name": "O Fail2Ban funciona com o site atrás de uma CDN?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Só com ajustes. O Nginx precisa registrar o IP real do visitante, e mesmo assim banir esse IP no firewall da VPS não adianta, porque a conexão chega pela CDN. Nesse cenário o bloqueio tem que acontecer na própria CDN ou no Nginx, e o Fail2Ban fica para SSH e serviços acessados direto."
        }
      }
    ]
  }
]
```
