Tutorial

Configurar o ufw no Linux: firewall no servidor e noções básicas de nftables

Atualizado: · Skillaria.Top

Configurar o ufw se resume a três passos: definir as políticas padrão (sudo ufw default deny incoming e sudo ufw default allow outgoing), liberar o SSH e as portas necessárias (sudo ufw allow 22/tcp, sudo ufw allow 443/tcp) e ativar o firewall com sudo ufw enable. As regras são conferidas com sudo ufw status numbered, e por trás o ufw controla o netfilter via iptables ou nftables.

O firewall do Linux decide quais pacotes de rede o servidor aceita e quais descarta. No kernel, quem faz isso é o subsistema netfilter, e ele é controlado por utilitários: o iptables e o nftables, de baixo nível, e o ufw (Uncomplicated Firewall), uma camada mais simples por cima. Na maioria dos servidores Ubuntu e Debian, configurar o ufw leva cinco minutos: bloquear tudo o que entra, liberar o SSH e as portas dos serviços e ativar. A seguir estão o roteiro passo a passo, os erros típicos e o mínimo de nftables para entender o que acontece por baixo.

Como funciona o firewall no Linux

A filtragem de pacotes fica no kernel: é o netfilter. Ele oferece pontos de interceptação (hooks) para o tráfego de entrada no próprio host, de saída e de trânsito (forward). As ferramentas do usuário apenas gravam regras no kernel para esses pontos.

FerramentaNívelQuando usar
ufwcamada simples, sintaxe fácilservidor único em Ubuntu/Debian, regras típicas
firewalldcamada com zonasRHEL, Rocky, Fedora
nftables (nft)baixo nível, modernoregras complexas, NAT, conjuntos de endereços
iptablesbaixo nível, em desusosistemas antigos e scripts legados

Importante: use uma única ferramenta para gerenciar o firewall. Se você alterar regras ao mesmo tempo pelo ufw e pelo iptables manualmente, uma sobrescreve a outra, e o resultado fica imprevisível.

Instalação e verificação do ufw

No Ubuntu o ufw costuma já estar instalado, mas desativado. No Debian é preciso instalá-lo à parte:

$ sudo apt update
$ sudo apt install ufw
$ sudo ufw status
Status: inactive

O status inactive significa que as regras do ufw não estão sendo aplicadas. Ainda não ative o firewall: primeiro libere o SSH, senão em um servidor remoto você se tranca para fora.

Configuração passo a passo do ufw no servidor

Passo 1. Políticas padrão

A política padrão define o que fazer com um pacote quando nenhuma regra se aplica. Para um servidor, o esquema seguro é: entrada proibida e saída permitida.

$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'

As respostas às suas próprias conexões de saída passam automaticamente: o ufw acompanha o estado das conexões (connection tracking), então não é preciso abrir portas para as respostas.

Passo 2. Liberar o SSH

$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)

OpenSSH é um perfil de aplicação. Se o SSH escuta em uma porta não padrão, libere-a explicitamente: sudo ufw allow 2222/tcp. Para ver qual porta o sshd usa de fato, execute sudo ss -tlnp | grep sshd.

Passo 3. Abrir as portas dos serviços

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

Informe o protocolo: sem /tcp, o ufw abre a porta para TCP e UDP ao mesmo tempo, e uma porta aberta sem necessidade só aumenta a superfície de ataque.

Passo 4. Ativar o firewall

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

O ufw inicia imediatamente e passa a iniciar com o sistema. Não feche a sessão SSH atual: abra outra e confirme que a conexão funciona.

Passo 5. Conferir as regras

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

As regras para IPv6 são criadas pelo próprio ufw quando em /etc/default/ufw está IPV6=yes (valor padrão).

Como liberar uma porta no ufw: todas as formas de sintaxe

O comando ufw allow aceita a forma curta e a forma completa. A curta serve para os casos típicos; a completa, quando é preciso indicar a origem, a interface ou o endereço de destino.

TarefaComando
Porta TCPsudo ufw allow 443/tcp
Porta UDPsudo ufw allow 51820/udp
Faixa de portassudo ufw allow 6000:6007/tcp
Pelo nome do serviçosudo ufw allow https
De um único IPsudo ufw allow from 203.0.113.10
De uma sub-rede para uma portasudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
Em uma interfacesudo ufw allow in on eth1 to any port 3306 proto tcp
Bloquearsudo ufw deny 23/tcp
Rejeitar com respostasudo ufw reject 25/tcp

A diferença entre deny e reject: o deny descarta o pacote em silêncio, e o cliente espera até o tempo limite; o reject envia uma resposta informando que a porta está fechada. Para o tráfego externo, normalmente se escolhe deny; para redes internas, o reject é mais cômodo, porque o cliente vê o erro na hora.

Banco de dados acessível somente de um servidor

Uma tarefa comum: o PostgreSQL ou o MySQL não podem ser vistos pela internet, mas a aplicação em outro servidor precisa se conectar.

$ sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
Rule added

A porta 5432 continua fechada para todos os outros graças à política deny incoming. Além disso, convém configurar o próprio serviço para escutar somente no endereço interno: o firewall e a configuração do serviço se protegem mutuamente.

Perfis de aplicação

Os pacotes podem registrar a descrição de suas portas em /etc/ufw/applications.d/. Listagem e conteúdo dos perfis:

$ sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
  80,443/tcp

Para liberar um perfil: sudo ufw allow "Nginx Full". Nomes com espaços devem ir entre aspas. Um perfil próprio pode ser descrito no formato INI no mesmo diretório e aplicado com sudo ufw app update nome.

Como remover uma regra do ufw

O método mais confiável é pelo número:

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

$ sudo ufw delete 2
Deleting:
 allow 80/tcp
Proceed with operation (y|n)? y
Rule deleted

Depois de remover uma regra, os números mudam, por isso antes de apagar a próxima execute status numbered de novo. Há outro jeito: repetir a regra precedida de delete, por exemplo sudo ufw delete allow 80/tcp. Ele remove também a variante IPv6 de uma só vez.

Ordem das regras e inserção no início

O ufw verifica as regras de cima para baixo, e vale a primeira que corresponder. Por isso, uma proibição para um endereço específico deve ficar acima de uma permissão geral:

$ sudo ufw insert 1 deny from 198.51.100.23
Rule inserted

Se você adicionar o deny com o comando comum, ele vai parar no fim da lista, depois do allow 443/tcp, e não terá efeito sobre essa porta.

Proteção do SSH contra força bruta: ufw limit

A regra limit permite a conexão, mas bloqueia o endereço que abriu 6 ou mais conexões em 30 segundos:

$ sudo ufw limit OpenSSH
Rule updated

É uma proteção simples contra tentativas em massa de senha. Para uma defesa séria, desative o login por senha e use chaves e, se quiser, o fail2ban, que consegue bloquear endereços pelo ufw.

Logs do ufw

O registro é ativado com sudo ufw logging on; os níveis são low, medium, high e full. Os eventos vão para /var/log/ufw.log (via rsyslog) e para o log do kernel:

$ sudo journalctl -k | grep 'UFW BLOCK' | tail -2
Oct 14 10:12:03 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=45.155.205.1 DST=192.0.2.10 PROTO=TCP SPT=51544 DPT=3389
Oct 14 10:12:09 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=89.248.165.7 DST=192.0.2.10 PROTO=TCP SPT=40312 DPT=23

Os campos SRC e DPT mostram quem bateu e em qual porta. Se um serviço não responde e no log aparece UFW BLOCK para a porta dele, então a regra não foi adicionada.

ufw e Docker: por que as portas ficam abertas contra as regras

Esta é a armadilha mais conhecida. Ao publicar uma porta (-p 8080:80), o Docker cria sozinho regras de NAT e a cadeia DOCKER, e o tráfego para o contêiner passa pelo forward, sem passar pelas regras de entrada do ufw. Como resultado, o ufw status não mostra a porta 8080, mas ela fica acessível de fora.

Formas de resolver:

  • Publicar as portas somente em localhost: -p 127.0.0.1:8080:80, e expor para fora por meio de um proxy reverso (nginx).
  • Adicionar as próprias regras na cadeia DOCKER-USER — o Docker não a sobrescreve.
  • Não publicar as portas de contêineres auxiliares, e conectá-los pela rede do Docker.

Reset e desativação

$ sudo ufw disable     # desativar; as regras são mantidas
$ sudo ufw reset       # apagar todas as regras e desativar
$ sudo ufw reload      # reler a configuração

Antes do reset, o ufw salva cópias dos arquivos de regras em /etc/ufw/ com um sufixo de data. As regras ficam em /etc/ufw/user.rules e user6.rules, que não devem ser editados à mão: altere-os apenas pelos comandos.

Noções básicas de nftables

O nftables é o substituto moderno do iptables no kernel do Linux. No Debian 10+ e no Ubuntu 20.10+, o comando iptables funciona por padrão por meio da camada de compatibilidade iptables-nft, por isso as regras do ufw também acabam no nftables. Para ver tudo o que está carregado no kernel:

$ sudo nft list ruleset

A estrutura do nftables: uma tabela (família ip, ip6 ou inet, que vale para ambos) contém cadeias ligadas aos pontos do netfilter, e as cadeias contêm regras. Um firewall mínimo para servidor no arquivo /etc/nftables.conf:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        ip protocol icmp accept
        meta l4proto ipv6-icmp accept
        tcp dport { 22, 80, 443 } accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Para aplicar e ativar na inicialização:

$ sudo nft -c -f /etc/nftables.conf   # apenas verificar a sintaxe
$ sudo systemctl enable --now nftables

Regras podem ser acrescentadas na hora, mas somem após a reinicialização se não forem gravadas em um arquivo:

$ sudo nft add rule inet filter input tcp dport 5432 ip saddr 10.0.0.5 accept
$ sudo nft -a list chain inet filter input   # -a mostra o handle de cada regra
$ sudo nft delete rule inet filter input handle 9

A principal vantagem do nftables são os conjuntos ({ 22, 80, 443 }) e a tabela única inet, que atende IPv4 e IPv6. Não execute o seu serviço nftables ao mesmo tempo que o ufw: o flush ruleset apaga as regras do ufw.

Erros comuns

  • Ativou o ufw sem regra para o SSH — o acesso se perdeu. Quem salva é o console do provedor (VNC/serial): sudo ufw allow OpenSSH ou sudo ufw disable.
  • Abriu a porta, mas o serviço não responde — o serviço escuta em 127.0.0.1, e não no endereço externo. Confira com ss -tlnp.
  • Existe um firewall adicional na nuvem — muitos provedores têm grupos de segurança; a porta também precisa ser liberada lá.
  • O deny não funciona — a regra está abaixo de uma permissão. Use insert 1.

Conclusão

A configuração básica do ufw é: default deny incoming, liberar o SSH e as portas dos serviços, ufw enable e conferência com status numbered. Para acesso pontual use regras com from e port, para o SSH use limit, e ao trabalhar com Docker lembre que ele contorna o ufw. Quando precisar de NAT ou de conjuntos complexos de regras, passe para o nftables. A proteção de servidores com firewall é praticada no curso de Linux.

Perguntas frequentes

Qual a diferença entre ufw e iptables?

O ufw é uma camada com sintaxe simples que gera sozinha as regras do iptables ou do nftables. O iptables e o nftables são ferramentas de baixo nível, que dão controle total, mas exigem mais conhecimento.

As regras do ufw permanecem após a reinicialização?

Sim. Depois de sudo ufw enable o firewall inicia com o sistema, e as regras ficam guardadas em /etc/ufw/user.rules e user6.rules.

Preciso liberar portas para conexões de saída?

Com a política allow outgoing, não. As respostas às conexões de saída passam automaticamente pelo ufw graças ao acompanhamento de estado.

Como permitir ping com o ufw ativo?

Por padrão o ufw já aceita o echo-request ICMP de entrada: a regra está em /etc/ufw/before.rules. Para bloquear o ping, troque ACCEPT por DROP nessa regra e execute sudo ufw reload.

O ufw existe no CentOS e no Rocky Linux?

Nessas distribuições a ferramenta padrão é o firewalld, com o comando firewall-cmd. O ufw pode ser instalado pelo EPEL, mas não é recomendável misturá-lo com o firewalld.

Aprenda este tema em vídeo

Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.

Ir para o curso