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).
- 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 é:
- Bloquear tudo que entra (política padrão de entrada:
deny, "negar"). - Liberar tudo que sai (política padrão de saída:
allow, "permitir"), para o servidor conseguir baixar atualizações. - Abrir só as portas dos serviços que você oferece.
| Termo | Significado |
|---|---|
| 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ão | O que acontece com uma conexão que não bate em nenhuma regra. |
allow / deny / reject / limit | Permitir / 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
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.
-
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)
-
Libere o SSH. O
openssh-serverregistra um "perfil de aplicativo" chamadoOpenSSH:$ 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. -
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.
-
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:
| Coluna | Exemplo | Significado |
|---|---|---|
| Para | 22/tcp (OpenSSH) | A porta e o protocolo no servidor (e o perfil que criou a regra). |
| Ação | ALLOW IN | Permitir conexões de entrada. |
| De | Anywhere | De 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.
| Forma | Exemplo | Melhor quando… |
|---|---|---|
| Perfil de aplicativo | sudo ufw allow "Nginx Full" | O programa instalou um perfil (veja ufw app list). |
| Nome do serviço | sudo ufw allow ssh | É um serviço conhecido (os nomes vêm de /etc/services). |
| Porta e protocolo | sudo ufw allow 443/tcp | Você sabe a porta. É a forma mais explícita. |
| Várias portas | sudo ufw allow 80,443/tcp | Liberar um grupo de uma vez (exige o protocolo). |
| Faixa de portas | sudo ufw allow 6000:6010/tcp | Um 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
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
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
| Campo | Significado |
|---|---|
IN=eth0 | Placa de rede por onde chegou |
SRC=203.0.113.45 | Quem tentou conectar (origem) |
DST=192.168.0.20 | Para onde (o seu servidor) |
PROTO=TCP | Protocolo |
DPT=3306 | Porta 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
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.
$ 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".
O que aconteceu: o firewall é só uma das barreiras. Confira na ordem:
- O serviço está rodando e escutando?
sudo ss -tlnpdeve mostrar a porta. - Ele escuta em todos os endereços (
0.0.0.0) ou só em127.0.0.1? Este último só aceita conexões do próprio servidor. - Na nuvem, o provedor tem um firewall próprio ("security group") que também precisa liberar a porta.
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
| Comando | O que faz |
|---|---|
sudo ufw status | Mostra se está ativo e as regras |
sudo ufw status verbose | Inclui políticas padrão e log |
sudo ufw status numbered | Regras numeradas, para apagar |
sudo ufw enable / disable | Liga / desliga (e no boot) |
sudo ufw default deny incoming | Política padrão de entrada |
sudo ufw allow 443/tcp | Libera uma porta |
sudo ufw allow from IP to any port N | Libera só para um endereço |
sudo ufw deny from IP | Bloqueia um endereço |
sudo ufw limit ssh | Permite com limite de tentativas |
sudo ufw insert 1 REGRA | Coloca a regra no topo |
sudo ufw delete N | Apaga a regra de número N |
sudo ufw app list / app info NOME | Perfis de aplicativo e suas portas |
sudo ufw logging on | Liga o registro de bloqueios |
sudo ufw reset | Apaga todas as regras e desliga (pede confirmação) |
Exercícios
1. Política de entrada
Complete para bloquear, por padrão, tudo que chega:
2. Liberar HTTPS
Complete para liberar só TCP na porta 443:
3. Só a rede local
Complete para liberar a porta 22 apenas para a rede 192.168.0.0/24:
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 outgoinge só as portas necessárias. - Sempre libere o SSH antes do
ufw enablee 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.