Configurar o ufw no Linux: firewall no servidor e noções básicas de nftables
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.
| Ferramenta | Nível | Quando usar |
|---|---|---|
ufw | camada simples, sintaxe fácil | servidor único em Ubuntu/Debian, regras típicas |
firewalld | camada com zonas | RHEL, Rocky, Fedora |
nftables (nft) | baixo nível, moderno | regras complexas, NAT, conjuntos de endereços |
iptables | baixo nível, em desuso | sistemas 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.
| Tarefa | Comando |
|---|---|
| Porta TCP | sudo ufw allow 443/tcp |
| Porta UDP | sudo ufw allow 51820/udp |
| Faixa de portas | sudo ufw allow 6000:6007/tcp |
| Pelo nome do serviço | sudo ufw allow https |
| De um único IP | sudo ufw allow from 203.0.113.10 |
| De uma sub-rede para uma porta | sudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp |
| Em uma interface | sudo ufw allow in on eth1 to any port 3306 proto tcp |
| Bloquear | sudo ufw deny 23/tcp |
| Rejeitar com resposta | sudo 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 OpenSSHousudo 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 comss -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.
Este tema é abordado em profundidade, com prática, no curso “Linux: с нуля до уверенного администрирования”.
Ir para o curso