Ubuntu ufw

Um firewall é o porteiro do servidor: decide quais conexões entram e quais são barradas. O Ubuntu traz o ufw, de Uncomplicated Firewall, "firewall descomplicado". Por baixo, ele escreve as regras do kernel por você (o netfilter, que você verá em nftables).

Você vai aprender
  • O que são políticas padrão, portas e regras de entrada e saída.
  • A ordem segura para ligar o firewall num servidor remoto sem perder o acesso SSH.
  • Como liberar portas, serviços e IPs específicos, e como limitar tentativas de login.
  • Como listar, numerar e apagar regras, e como ler o log de bloqueios.

Antes, leia Conceitos de Rede e SSH. Nesta aula, a Ana administra uma máquina chamada servidor, acessada por SSH.


A ideia: tudo fechado, exceto o necessário

Cada serviço de rede escuta numa porta: SSH na 22, sites na 80 (HTTP) e 443 (HTTPS). O jeito seguro de configurar um firewall é:

  1. Bloquear tudo que entra (política padrão de entrada: deny, "negar").
  2. Liberar tudo que sai (política padrão de saída: allow, "permitir"), para o servidor conseguir baixar atualizações.
  3. Abrir só as portas dos serviços que você oferece.
TermoSignificado
Entrada (incoming)Conexões que chegam ao servidor vindas de fora. Exemplo: alguém acessando o seu site.
Saída (outgoing)Conexões que o servidor abre. Exemplo: apt update baixando pacotes.
Roteado (routed)Tráfego que só passa pelo servidor, quando ele é um roteador. Raramente usado.
Política padrãoO que acontece com uma conexão que não bate em nenhuma regra.
allow / deny / reject / limitPermitir / descartar em silêncio / recusar avisando / permitir com limite de tentativas.

Ver o estado

O ufw sempre precisa de sudo. Num servidor Ubuntu novo, ele vem instalado, mas desligado:

$ ufw status
ERROR: You need to be root to run this script
$ sudo ufw status
[sudo: authenticate] Senha:
Estado: inativo

Repare na mistura de idiomas: algumas mensagens do ufw estão traduzidas e outras não. É assim mesmo no Ubuntu 26.04.


Ligar o firewall com segurança: passo a passo

Libere o SSH antes de ligar o firewall

Se você ligar o firewall num servidor remoto sem liberar a porta do SSH, sua conexão cai e você fica trancado para fora. A única saída passa a ser o console do provedor de nuvem ou ir até a máquina. Siga a ordem abaixo.

  1. Defina as políticas padrão. Nada muda ainda, porque o firewall está desligado.

    sudo ufw
    O firewall, como administrador.
    default
    Mexer na política padrão.
    deny
    A decisão: negar.
    incoming
    Para qual direção: entrada.
    $ sudo ufw default deny incoming
    A política padrão incoming mudou para 'deny'
    (assegure-se de ter atualizado suas regras apropriadamente)
    $ sudo ufw default allow outgoing
    A política padrão outgoing mudou para 'allow'
    (assegure-se de ter atualizado suas regras apropriadamente)
  2. Libere o SSH. O openssh-server registra um "perfil de aplicativo" chamado OpenSSH:

    $ sudo ufw app list
    Aplicativos disponíveis:
      OpenSSH
    $ sudo ufw allow OpenSSH
    Regras atualizadas
    Regras atualizadas (v6)                             « uma regra para IPv4 e outra para IPv6

    Se o seu SSH usa outra porta (por exemplo, 2222), libere ela: sudo ufw allow 2222/tcp.

  3. Ligue o firewall. Ele avisa que conexões SSH podem cair e pede confirmação:

    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall está ativo e habilitado na inicialização do sistema

    "Habilitado na inicialização" quer dizer que o firewall volta sozinho depois de um reboot.

  4. Confira, sem fechar a conexão atual. Abra um segundo terminal e conecte de novo por SSH. Só feche o primeiro depois que o segundo entrar.

    $ sudo ufw status verbose
    Estado: ativo
    Logando: on (low)
    Predefinido: deny (entrada), allow (saída), disabled (roteado)
    Novos perfis: skip
    
    Para                       Ação        De
    ----                       ----        --
    22/tcp (OpenSSH)           ALLOW IN    Anywhere
    22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)

Como ler a tabela do status:

ColunaExemploSignificado
Para22/tcp (OpenSSH)A porta e o protocolo no servidor (e o perfil que criou a regra).
AçãoALLOW INPermitir conexões de entrada.
DeAnywhereDe qualquer endereço. "(v6)" indica a regra para IPv6.

Abrir portas e serviços: formas diferentes

Há várias formas de escrever a mesma liberação. Escolha a mais clara para quem vai ler depois.

FormaExemploMelhor quando…
Perfil de aplicativosudo ufw allow "Nginx Full"O programa instalou um perfil (veja ufw app list).
Nome do serviçosudo ufw allow sshÉ um serviço conhecido (os nomes vêm de /etc/services).
Porta e protocolosudo ufw allow 443/tcpVocê sabe a porta. É a forma mais explícita.
Várias portassudo ufw allow 80,443/tcpLiberar um grupo de uma vez (exige o protocolo).
Faixa de portassudo ufw allow 6000:6010/tcpUm programa usa uma faixa de portas.
$ sudo ufw allow 80,443/tcp
Regras atualizadas
Regras atualizadas (v6)
$ sudo ufw allow 80,443/tcp
Ignorando adição de regra que já existe
Skipping adding existing rule (v6)                  « regra repetida não é duplicada
Sempre diga o protocolo

sudo ufw allow 80 abre a porta 80 em TCP e UDP. Sites só precisam de TCP. Ser explícito (80/tcp) abre menos coisas.

Liberar só para um IP ou uma rede

Um banco de dados não deve ficar aberto para a internet inteira. Libere só para quem precisa:

sudo ufw allow
Criar uma regra de permissão.
from 192.168.0.0/24
Só para conexões vindas da rede local 192.168.0.x (veja CIDR em Conceitos de Rede).
to any
Para qualquer endereço deste servidor.
port 5432
Na porta 5432 (PostgreSQL).
proto tcp
Só TCP.
$ sudo ufw allow from 192.168.0.0/24 to any port 5432 proto tcp
Regra adicionada

Só uma regra foi criada, sem "(v6)": como a origem é um endereço IPv4, não há versão IPv6.

Limitar tentativas: limit

limit permite a conexão, mas bloqueia um IP que tentar conectar 6 vezes ou mais em 30 segundos. É uma proteção simples contra robôs que tentam adivinhar senhas do SSH:

$ sudo ufw limit OpenSSH
Regra atualizada
Rule updated (v6)                                   « a regra allow virou limit

Para uma proteção mais completa, use o fail2ban (veja Segurança do Servidor).

Bloquear um endereço

$ sudo ufw insert 1 deny from 203.0.113.45
Regra inserida

O insert 1 coloca a regra no topo. Isso importa porque o ufw lê as regras de cima para baixo e para na primeira que bate. Uma regra deny no fim da lista nunca seria usada se um allow acima já tivesse liberado.


Listar e apagar regras

A forma mais segura de apagar é pelo número. Primeiro, liste com números:

$ sudo ufw status numbered
Estado: ativo

     Para                       Ação        De
     ----                       ----        --
[ 1] Anywhere                   DENY IN     203.0.113.45
[ 2] OpenSSH                    LIMIT IN    Anywhere
[ 3] 80,443/tcp                 ALLOW IN    Anywhere
[ 4] 5432/tcp                   ALLOW IN    192.168.0.0/24
[ 5] OpenSSH (v6)               LIMIT IN    Anywhere (v6)
[ 6] 80,443/tcp (v6)            ALLOW IN    Anywhere (v6)
$ sudo ufw delete 4
Deleting:
 allow from 192.168.0.0/24 to any port 5432 proto tcp
Proceed with operation (y|n)? y
Regra apagada
Os números mudam depois de cada exclusão

Ao apagar a regra 4, a antiga 5 vira a 4. Para apagar várias, rode status numbered de novo antes de cada delete, ou apague de baixo para cima.

Outra forma é repetir a regra com delete na frente. Ela apaga as versões IPv4 e IPv6 de uma vez:

$ sudo ufw delete allow 80,443/tcp
Regra apagada
Rule deleted (v6)

Logs: ver o que foi bloqueado

Com o registro ligado (o padrão é low), cada bloqueio vira uma linha no log do kernel, marcada com [UFW BLOCK]:

$ sudo tail -n 1 /var/log/ufw.log
2026-10-15T10:42:07.118342-03:00 servidor kernel: [UFW BLOCK] IN=eth0 OUT= MAC=52:54:00:12:34:56:52:54:00:ab:cd:ef:08:00 SRC=203.0.113.45 DST=192.168.0.20 LEN=60 TOS=0x00 PREC=0x00 TTL=52 ID=0 DF PROTO=TCP SPT=51234 DPT=3306 WINDOW=64240 RES=0x00 SYN URGP=0
CampoSignificado
IN=eth0Placa de rede por onde chegou
SRC=203.0.113.45Quem tentou conectar (origem)
DST=192.168.0.20Para onde (o seu servidor)
PROTO=TCPProtocolo
DPT=3306Porta de destino. 3306 é o MySQL: alguém procurando banco de dados aberto.

Comandos úteis: sudo ufw logging on / off, sudo journalctl -k | grep "UFW BLOCK" e sudo grep "DPT=22 " /var/log/ufw.log | wc -l, que conta tentativas na porta do SSH.


Quando não funciona

Liguei o firewall e o SSH caiu

O que aconteceu: a porta do SSH não estava liberada, ou o SSH usa uma porta diferente da 22.

Como resolver: entre pelo console web do provedor de nuvem (ou pelo teclado e monitor da máquina) e rode sudo ufw allow OpenSSH, ou a porta certa. Em último caso, sudo ufw disable desliga tudo. Para descobrir em que porta o SSH escuta: sudo ss -tlnp | grep ssh.

"ERROR: Could not find a profile matching 'nginx'"
$ sudo ufw allow nginx
ERROR: Não foi possível encontrar um perfil correspondente 'nginx'

O que aconteceu: os nomes de perfil diferenciam maiúsculas e têm espaço. Também pode ser que o programa não esteja instalado.

Como resolver: confira os nomes exatos com sudo ufw app list e use aspas: sudo ufw allow "Nginx Full".

Liberei a porta, mas o serviço continua inacessível

O que aconteceu: o firewall é só uma das barreiras. Confira na ordem:

  1. O serviço está rodando e escutando? sudo ss -tlnp deve mostrar a porta.
  2. Ele escuta em todos os endereços (0.0.0.0) ou só em 127.0.0.1? Este último só aceita conexões do próprio servidor.
  3. Na nuvem, o provedor tem um firewall próprio ("security group") que também precisa liberar a porta.
Uma porta do Docker está aberta mesmo sem regra no ufw

O que aconteceu: o Docker escreve as próprias regras no netfilter quando você publica uma porta (-p 8080:80), e elas são avaliadas antes das regras do ufw.

Como resolver: publique só no endereço local, -p 127.0.0.1:8080:80, e exponha o serviço por um proxy como o nginx (veja Docker).


Referência

ComandoO que faz
sudo ufw statusMostra se está ativo e as regras
sudo ufw status verboseInclui políticas padrão e log
sudo ufw status numberedRegras numeradas, para apagar
sudo ufw enable / disableLiga / desliga (e no boot)
sudo ufw default deny incomingPolítica padrão de entrada
sudo ufw allow 443/tcpLibera uma porta
sudo ufw allow from IP to any port NLibera só para um endereço
sudo ufw deny from IPBloqueia um endereço
sudo ufw limit sshPermite com limite de tentativas
sudo ufw insert 1 REGRAColoca a regra no topo
sudo ufw delete NApaga a regra de número N
sudo ufw app list / app info NOMEPerfis de aplicativo e suas portas
sudo ufw logging onLiga o registro de bloqueios
sudo ufw resetApaga todas as regras e desliga (pede confirmação)

Exercícios

1. Política de entrada

Complete para bloquear, por padrão, tudo que chega:

sudo ufw default incoming

2. Liberar HTTPS

Complete para liberar só TCP na porta 443:

sudo ufw allow

3. Só a rede local

Complete para liberar a porta 22 apenas para a rede 192.168.0.0/24:

sudo ufw allow 192.168.0.0/24 to any port 22 proto tcp

4. Num servidor acessado por SSH, qual é a ordem segura?

5. Você apagou a regra 2 com ufw delete 2. O que acontece com a antiga regra 3?


Resumo

  • Política segura: deny incoming, allow outgoing e só as portas necessárias.
  • Sempre libere o SSH antes do ufw enable e teste num segundo terminal.
  • Prefira regras explícitas (443/tcp) e restrinja por origem (from 192.168.0.0/24) quando puder.
  • Apague por número com status numbered + delete N; os números mudam após cada exclusão.
  • Bloqueios aparecem como [UFW BLOCK] em /var/log/ufw.log.