Módulo 5 · 5.2
Uma firewall com ufw e nftables
Módulo 5: Proteger a rede · Tempo de leitura: 12 minutos
Objetivo de aprendizagem: No final desta lição, saberá configurar uma firewall que só permite o que é necessário, em IPv4 e em IPv6, sem ficar sem acesso ao servidor, e saberá contra o que uma firewall no seu servidor não protege.
Conceitos-chave: filtro de pacotes, netfilter, nftables, iptables-nft, ufw, política predefinida, allow, deny, reject, limit, IPv6 no ufw, firewall do fornecedor, firewalld, Docker e a firewall
O que faz uma firewall
Uma firewall no seu servidor é um filtro de pacotes: para cada pacote de rede que chega, consulta uma lista de regras e decide se pode passar. No Linux, esse filtro está no kernel e chama-se netfilter. A configuração faz-se com um programa:
- nftables (comando
nft) é a ferramenta atual. O Debian utiliza-o por predefinição desde o Debian 10. - iptables é a ferramenta antiga. Nos sistemas modernos,
iptablesé normalmente uma tradução para nftables (iptables-nft), para que os manuais antigos continuem a funcionar. - ufw (Uncomplicated Firewall) é uma camada simples por cima, presente por predefinição no Ubuntu e instalável no Debian com um único comando. Para um único servidor, o ufw é a opção mais fácil. Esta lição utiliza o ufw e mostra depois como ficam as mesmas regras em nftables.
Uma firewall é a sua segunda camada de defesa. A primeira é garantir que os serviços só escutam no endereço correto (lição 5.1). Em conjunto, asseguram que um erro numa das camadas não se transforma de imediato numa porta aberta.
Primeiro: como recuperar o acesso se algo correr mal?
O erro clássico: ativa a firewall, esquece-se de permitir o SSH e a ligação cai. Deixa então de conseguir aceder por SSH. Antes de começar:
- Saiba como abrir a consola do seu fornecedor (lição 1.2). Esta funciona fora da rede, portanto também quando a firewall bloqueia tudo. Aí inicia sessão e escreve
ufw disable. - Faça um snapshot se tiver dúvidas.
- Mantenha a sua sessão SSH atual aberta e teste com uma segunda sessão.
O ufw em cinco passos
Passo 1: instalar e escolher a predefinição.
anna@web1:~$ sudo apt install ufw
anna@web1:~$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
anna@web1:~$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'A política predefinida aplica-se a tudo o que não tem uma regra. "Deny incoming" significa: tudo o que entra é proibido, exceto o que permitir a seguir. É a única base segura. O tráfego de saída (o seu servidor a obter atualizações) é permitido.
Passo 2: permitir o SSH antes de ativar a firewall.
anna@web1:~$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)OpenSSH é um perfil de aplicação que o ufw conhece (corresponde à porta 22/tcp). Se o SSH estiver numa porta diferente, utilize o número: sudo ufw allow 2222/tcp. Repare em "Rules updated (v6)": o ufw cria a regra também para IPv6. Fá-lo porque em /etc/default/ufw consta a linha IPV6=yes, que é a predefinição. Convém verificar; se estiver em no, a sua firewall só se aplica a IPv4.
Passo 3: o que mais precisar.
anna@web1:~$ sudo ufw allow 80/tcp
anna@web1:~$ sudo ufw allow 443/tcp
anna@web1:~$ sudo ufw allow 443/udp # apenas se utilizar HTTP/3Pode limitar uma regra a um único endereço de origem, por exemplo uma porta de administração que só pode ser usada a partir do seu escritório:
anna@web1:~$ sudo ufw allow from 198.51.100.20 to any port 9090 proto tcpPasso 4: ativar.
anna@web1:~$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startupPasso 5: verificar. Abra uma segunda janela e inicie sessão novamente. Se conseguir, o SSH está bem configurado. Veja depois as regras:
anna@web1:~$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (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)Para remover uma regra, utilize os números: sudo ufw status numbered e depois sudo ufw delete 3.
deny, reject e limit
- deny descarta o pacote em silêncio: do exterior vê-se "filtrado" (lição 5.1).
- reject devolve uma recusa: do exterior vê-se "fechado". É mais correto para os seus próprios serviços, mas revela que existe um servidor.
- limit permite uma ligação, mas bloqueia um endereço que tente ligar-se seis ou mais vezes em 30 segundos. Útil para o SSH:
sudo ufw limit OpenSSHem vez deallow. É grosseiro (conta ligações, não inícios de sessão falhados); o fail2ban (lição 5.3) é mais preciso.
As mesmas regras em nftables
Nos bastidores, o ufw escreve regras netfilter. Se preferir trabalhar sem ufw, escreve o seu próprio ficheiro nftables. No Debian, este encontra-se em /etc/nftables.conf e é carregado com o serviço nftables:
#!/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
meta l4proto { icmp, 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;
}
}Leia-o assim. A tabela chama-se filter e pertence à família inet: uma única tabela para IPv4 e IPv6 em simultâneo, para que não se possa esquecer do IPv6. Na cadeia input, a política é drop. Depois: as respostas a ligações já existentes podem regressar (established,related), tudo no loopback é permitido, o ICMP é permitido (necessário, entre outros, para o IPv6 e para as mensagens de erro sobre o tamanho dos pacotes) e as portas 22, 80 e 443 são permitidas.
anna@web1:~$ sudo nft -c -f /etc/nftables.conf # verificar sem carregar
anna@web1:~$ sudo systemctl enable --now nftables
anna@web1:~$ sudo nft list rulesetUtilize ou o ufw ou um ficheiro nftables próprio, não ambos: escrevem no mesmo netfilter e podem interferir com as regras um do outro.
Contra o que a sua firewall não protege
- Serviços que o próprio utilizador permite. A porta 443 está aberta para o seu site; uma vulnerabilidade no site continua, portanto, acessível. A firewall só protege as portas que estão fechadas.
- Docker. Quando publica uma porta com o Docker (
-p 5432:5432), o Docker define as suas próprias regras netfilter, que redirecionam o tráfego antes de as regras do ufw serem aplicadas. A documentação do Docker diz textualmente que o Docker e o ufw não funcionam bem em conjunto. Uma porta de um contentor pode, assim, estar aberta ao exterior sem queufw statusa mostre. A solução (publicar em127.0.0.1) é abordada na lição 9.3. - Tráfego de saída. Com "allow outgoing", um programa comprometido pode ligar-se a qualquer lado. Para a maioria dos servidores pequenos, é uma opção aceitável; ambientes mais rigorosos limitam também o tráfego de saída.
A firewall do seu fornecedor
Muitos fornecedores dispõem também de uma firewall na rede, à frente do seu servidor, que configura no painel de cliente (por vezes chamada "cloud firewall" ou "security group"). É uma excelente camada adicional e funciona mesmo que algo seja mal configurado no próprio servidor. Mas não substitui a firewall no servidor: se mudar o servidor de sítio ou mudar de fornecedor, ela não vai consigo, e nem todos os fornecedores a oferecem. Mantenha, por isso, sempre uma firewall no próprio servidor.
No AlmaLinux e no Rocky Linux
Nestes sistemas, o firewalld está ativo por predefinição, com zonas. Os comandos mais importantes:
[root@web1 ~]# firewall-cmd --list-all
[root@web1 ~]# firewall-cmd --permanent --add-service=http --add-service=https
[root@web1 ~]# firewall-cmd --reloadSem --permanent, uma alteração só vale até ao próximo reinício; com --permanent, só entra em vigor após --reload. O SSH já está aberto na zona predefinida.
Na prática
Se, ainda assim, ficar sem acesso a um VPS da WebOké, abra a consola no ecrã do VPS, inicie sessão e desative a firewall (ufw disable) ou reverta a última regra. Noutros fornecedores, este acesso de emergência também se chama consola, VNC ou rescue. Saiba onde está esse botão antes de precisar dele.
Resumo
- Uma firewall é a sua segunda camada depois de "escutar só onde é necessário"; o nftables é a ferramenta do kernel, o ufw é uma camada simples por cima.
- Comece com
default deny incoming, permita o SSH antes deufw enable, teste com uma segunda sessão e conheça a consola do seu fornecedor. - Verifique se o ufw também cobre o IPv6 (
IPV6=yes); no nftables, a famíliainettrata disso de uma só vez. denymostra "filtrado" do exterior,rejectmostra "fechado";limittrava ligações repetidas.- As portas do Docker contornam o ufw (lição 9.3); a firewall do seu fornecedor é uma camada adicional, não um substituto.
Questionário
Exercício
Exercício O5.2: Configurar a sua firewall. Ative no seu servidor uma firewall com ufw (ou nftables, ou firewalld no AlmaLinux/Rocky): por predefinição, tudo fechado à entrada, o SSH e o que mais precisar realmente. Teste com uma segunda sessão, verifique se o IPv6 está coberto e confirme a partir do exterior com nc que uma porta não permitida está fechada ou filtrada. Preencha a lista de verificação e cole o seu ufw status verbose (ou nft list ruleset); indique para cada porta aberta a sua finalidade.
Exercício O5.2: Configurar a sua firewall
Este exercício faz você mesmo; ninguém o verifica. Assinale o que já fez e marque o exercício como concluído.
Para um servidor web, apenas 22 (ou a sua porta SSH), 80 e 443, para IPv4 e IPv6. Portas de administração apenas a partir de um endereço fixo ou através de um túnel SSH. Através da consola: ufw disable (ou esvaziar as regras do nftables).
As suas marcações e notas ficam apenas neste navegador; não as enviamos para lado nenhum. Se tiver sessão iniciada, guardamos em Os meus cursos apenas que concluiu o exercício.
Para saber mais
- Proteger o seu VPS: os primeiros cinco minutos
- Sem acesso ao seu VPS: o que fazer?
- Debian Wiki, nftables: https://wiki.debian.org/nftables
- Documentação do Ubuntu Server, Firewall (ufw): https://ubuntu.com/server/docs/how-to/security/firewalls/
- Documentação do Docker, Packet filtering and firewalls: https://docs.docker.com/engine/network/packet-filtering-firewalls/
