Como Configurar um Firewall com Firewalld no Linux (Guia Completo)
Proteger o seu servidor Linux contra acesso não autorizado e tráfego malicioso não é opcional — é uma responsabilidade fundamental para qualquer administrador de sistemas. Quer esteja a executar um projeto pessoal, uma aplicação comercial ou um servidor web de produção, uma firewall adequadamente configurada é a sua primeira e mais crítica linha de defesa. Firewalld é uma das ferramentas de gestão de firewall mais poderosas e flexíveis disponíveis no Linux, oferecendo gestão dinâmica de regras, controlo de tráfego baseado em zonas e suporte a regras avançadas — tudo sem exigir um reinício completo do serviço quando as alterações são aplicadas.
Este guia abrangente orienta-o através de tudo o que precisa de saber: instalar Firewalld, compreender zonas, gerir serviços e portas, escrever regras avançadas e monitorizar a sua firewall em tempo real. Se está a alojar num VPS ou Servidor Dedicado da AlexHost, este guia ajudá-lo-á a proteger o seu ambiente e a manter uma postura de segurança forte e adaptável.
O que é Firewalld e por que deveria usá-lo?
Firewalld é um daemon de gestão de firewall dinâmica disponível na maioria das principais distribuições Linux, incluindo CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux e cada vez mais em Debian e Ubuntu também. Ao contrário da abordagem mais antiga iptables — onde cada alteração de regra exigia limpar e recarregar todo o conjunto de regras — Firewalld aplica alterações dinamicamente em tempo de execução sem interromper as ligações ativas.
Vantagens principais do Firewalld
- Arquitetura baseada em zonas — atribua diferentes níveis de confiança a diferentes interfaces de rede ou intervalos de IP
- Atualizações de regras dinâmicas — aplique alterações sem reiniciar a firewall ou descartar ligações existentes
- Abstração de serviços — gerencie o tráfego pelo nome do serviço (por exemplo,
http,ssh) em vez de números de porta brutos - Regras avançadas — escreva regras complexas e condicionais direcionadas a IPs, protocolos e ações específicas
- Integração D-Bus — permite que outras aplicações e serviços interajam com a firewall programaticamente
- Suporte IPv4 e IPv6 — gerencie ambas as famílias de protocolos a partir de uma única interface
Pré-requisitos
Antes de prosseguir, certifique-se de que tem:
- Um servidor Linux a executar CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian ou Ubuntu
- Acesso root ou
sudoao servidor - Uma compreensão básica dos comandos do terminal Linux
- Uma sessão SSH ativa (mantenha-a aberta durante todo o processo — estará a modificar regras de firewall)
> Aviso crítico: Certifique-se sempre de que SSH (porta 22 por padrão) é explicitamente permitido nas suas regras de firewall antes de ativar Firewalld. Bloquear-se a si próprio num servidor remoto é um erro comum e evitável.
Passo 1: Instalar Firewalld
Firewalld está incluído nos repositórios padrão da maioria das principais distribuições Linux. Use o gestor de pacotes apropriado para o seu sistema.
Em CentOS / RHEL / Rocky Linux / AlmaLinux
sudo yum install firewalld -yOu, em versões mais recentes usando DNF:
sudo dnf install firewalld -yEm Fedora
sudo dnf install firewalld -yEm Debian / Ubuntu
Embora Firewalld seja mais comumente associado a sistemas baseados em RHEL, é totalmente suportado em distribuições baseadas em Debian:
sudo apt update
sudo apt install firewalld -y> Nota para utilizadores Ubuntu/Debian: Se ufw está atualmente ativo no seu sistema, desative-o antes de ativar Firewalld para evitar conflitos:
> “`bash
> sudo ufw disable
> “`
Passo 2: Iniciar e ativar Firewalld
Após a instalação, inicie o serviço Firewalld e configure-o para ser iniciado automaticamente no arranque do sistema:
sudo systemctl start firewalld
sudo systemctl enable firewalldVerifique se o serviço está a funcionar corretamente:
sudo systemctl status firewalldDeverá ver uma saída semelhante a:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since ...Se o estado mostrar active (running), Firewalld está operacional e pronto para configurar.
Passo 3: Compreender as zonas do Firewalld
O modelo baseado em zonas é a pedra angular da arquitetura do Firewalld. Uma zona define um nível de confiança para uma ligação de rede ou interface. Cada zona contém o seu próprio conjunto de regras que determinam que tráfego é permitido ou negado.
Zonas Firewalld incorporadas
| Zona | Nível de confiança | Caso de uso típico |
|---|---|---|
drop | Mais baixo | Todas as ligações de entrada são descartadas sem resposta |
block | Muito baixo | As ligações de entrada são rejeitadas com uma mensagem ICMP |
public | Baixo | Zona padrão para redes públicas não confiáveis |
external | Baixo | Para interfaces viradas para o exterior com mascaramento NAT |
dmz | Médio | Servidores acessíveis do exterior mas isolados internamente |
work | Médio-Alto | Redes de trabalho com confiança moderada |
home | Alto | Redes domésticas onde outros anfitriões são confiáveis |
internal | Alto | Redes internas, semelhantes a casa |
trusted | Mais alto | Todas as ligações são aceites |
Verificar a zona padrão atual
sudo firewall-cmd --get-default-zoneListar todas as zonas disponíveis
sudo firewall-cmd --get-zonesVer zonas atualmente ativas e suas interfaces
sudo firewall-cmd --get-active-zonesSaída de exemplo:
public
interfaces: eth0Passo 4: Alterar a zona padrão
Exemplo 1 — Definir a zona padrão para public (Recomendado para VPS/Servidores Dedicados)
Para a maioria dos servidores virados para a Internet, public é a zona padrão apropriada. Aplica um nível de confiança conservador e apenas permite tráfego explicitamente permitido:
sudo firewall-cmd --set-default-zone=publicVerifique a alteração:
sudo firewall-cmd --get-default-zoneSaída esperada:
publicExemplo 2 — Definir a zona padrão para home
Se o seu servidor funciona numa rede privada confiável (como um laboratório doméstico ou ambiente de desenvolvimento interno), a zona home permite comunicação mais permissiva entre anfitriões confiáveis:
sudo firewall-cmd --set-default-zone=homeVerifique:
sudo firewall-cmd --get-default-zoneSaída esperada:
homeExemplo 3 — Definir a zona padrão para work
Para servidores numa rede corporativa ou de trabalho onde confiança moderada é apropriada:
sudo firewall-cmd --set-default-zone=workVerifique:
sudo firewall-cmd --get-default-zoneSaída esperada:
workPasso 5: Gerir serviços com Firewalld
Firewalld inclui uma biblioteca de definições de serviço predefinidas que mapeiam nomes de serviço para as suas portas e protocolos correspondentes. Isto torna muito mais fácil gerir regras por intenção em vez de números de porta brutos.
Listar todos os serviços predefinidos
sudo firewall-cmd --get-servicesPermitir um serviço numa zona
Para permitir tráfego HTTP (porta 80/TCP) na zona public permanentemente:
sudo firewall-cmd --zone=public --add-service=http --permanentPara permitir tráfego HTTPS (porta 443/TCP):
sudo firewall-cmd --zone=public --add-service=https --permanentPara permitir SSH (porta 22/TCP) — certifique-se sempre de que isto é permitido antes de fazer outras alterações:
sudo firewall-cmd --zone=public --add-service=ssh --permanentAplicar alterações recarregando Firewalld
A bandeira --permanent escreve a regra na configuração persistente mas não a aplica imediatamente à firewall em execução. Sempre recarregue após fazer alterações permanentes:
sudo firewall-cmd --reloadVerificar serviços numa zona
sudo firewall-cmd --zone=public --list-servicesSaída de exemplo:
dhcpv6-client http https sshRemover um serviço de uma zona
Para remover HTTPS da zona public:
sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reloadPasso 6: Gerir portas diretamente
Nos casos em que um serviço não tem uma definição Firewalld predefinida, pode abrir ou fechar portas específicas diretamente.
Abrir uma porta específica
Para abrir a porta 8080 sobre TCP na zona public:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reloadPara abrir uma porta UDP (por exemplo, porta 53 para DNS):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reloadPara abrir um intervalo de portas (por exemplo, 6000–6100 TCP):
sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reloadFechar uma porta específica
Para fechar a porta 8080:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reloadListar todas as portas abertas numa zona
sudo firewall-cmd --zone=public --list-portsPasso 7: Configuração avançada com regras avançadas
Regras avançadas dão-lhe controlo granular e condicional sobre o tráfego — muito além do que simples regras de serviço ou porta permitem. Suportam filtragem por IP de origem, IP de destino, protocolo, porta e ação (aceitar, rejeitar, descartar, registar).
Sintaxe de regra avançada
rule [family="<ipv4|ipv6>"]
[source address="<IP/CIDR>"]
[destination address="<IP/CIDR>"]
[service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
[log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
[accept|reject|drop]Exemplo 1 — Permitir SSH apenas a partir de um endereço IP específico
Esta é uma das configurações de segurança mais importantes para qualquer servidor remoto. Se gere o seu servidor a partir de um endereço IP fixo, restrinja o acesso SSH apenas a esse IP:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reloadExemplo 2 — Bloquear todo o tráfego de um endereço IP específico
Para bloquear completamente um endereço IP que está a gerar tráfego malicioso:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadExemplo 3 — Permitir HTTP a partir de uma sub-rede específica
Para permitir tráfego HTTP apenas a partir de uma sub-rede interna confiável (por exemplo, 192.168.1.0/24):
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reloadExemplo 4 — Limitar a taxa de ligações SSH para prevenir força bruta
Registar e limitar tentativas de ligação SSH para reduzir a exposição a ataques de força bruta:
sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reloadExemplo 5 — Permitir uma porta específica a partir de um IP específico
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reloadListar todas as regras avançadas numa zona
sudo firewall-cmd --zone=public --list-rich-rulesRemover uma regra avançada
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadPasso 8: Monitorizar e auditar a sua firewall
Rever regularmente a configuração da sua firewall é essencial para manter uma postura de segurança forte. Firewalld fornece vários comandos para inspecionar o estado atual das suas regras.
Ver a configuração completa para a zona padrão
sudo firewall-cmd --list-allSaída de exemplo:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="203.0.113.50" service name="ssh" acceptVer configuração para todas as zonas
sudo firewall-cmd --list-all-zonesVer configuração para uma zona específica
sudo firewall-cmd --zone=dmz --list-allVerificar se um serviço específico é permitido
sudo firewall-cmd --zone=public --query-service=httpVerificar se uma porta específica está aberta
sudo firewall-cmd --zone=public --query-port=8080/tcpPasso 9: Regras em tempo de execução vs. permanentes — compreender a diferença
Firewalld funciona com duas camadas de configuração distintas:
| Camada | Bandeira | Persistência | Caso de uso |
|---|---|---|---|
| Tempo de execução | *(sem bandeira)* | Perdida no recarregamento/reinicialização | Testar regras temporariamente |
| Permanente | --permanent | Sobrevive ao recarregamento e reinicialização | Configurações de produção |
Fluxo de trabalho de melhor prática
- Teste a regra em tempo de execução primeiro (sem
--permanent) para verificar se funciona conforme esperado - Adicione a regra permanentemente uma vez confirmada
- Recarregue Firewalld para sincronizar as configurações em tempo de execução e permanentes
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http
# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# Step 3: Reload to sync
sudo firewall-cmd --reloadAlternativamente, aplique uma regra permanente e recarregue imediatamente num fluxo de trabalho:
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reloadPasso 10: Atribuir interfaces de rede a zonas
Se o seu servidor tem múltiplas interfaces de rede (comum em Servidores Dedicados com NICs públicas e privadas), pode atribuir cada interface a uma zona diferente com diferentes níveis de confiança.
Atribuir uma interface a uma zona
sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reloadAlterar a zona de uma interface
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reloadRemover uma interface de uma zona
sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reloadPasso 11: Ativar mascaramento de IP e reencaminhamento de portas
Para servidores que atuam como gateways ou executam NAT (Network Address Translation), Firewalld suporta mascaramento e reencaminhamento de portas nativamente.
Ativar mascaramento (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadReencaminhar uma porta (por exemplo, reencaminhar a porta externa 80 para a porta interna 8080)
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reloadReencaminhar tráfego para um anfitrião diferente
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reloadConfigurações de segurança práticas para servidores AlexHost
Se está a executar um servidor web, servidor de base de dados ou servidor de aplicação na infraestrutura AlexHost, aqui estão configurações Firewalld de base recomendadas:
Configuração de base de servidor web
# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Reload to apply
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all> Dica profissional: Combine a configuração da sua firewall com um Certificado SSL válido para garantir que todo o tráfego web é encriptado de ponta a ponta. AlexHost oferece certificados SSL para todos os ambientes de alojamento.
Configuração de base de servidor de base de dados (MySQL/MariaDB)
# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null
sudo firewall-cmd --reloadConfiguração de base de servidor cPanel/WHM
Se está a usar um VPS com cPanel, precisará de abrir as portas exigidas por cPanel e WHM:
# Web traffic
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# cPanel/WHM ports
sudo firewall-cmd --zone=public --add-port=2082/tcp --permanent # cPanel HTTP
sudo firewall-cmd --zone=public --add-port=2083/tcp --permanent # cPanel HTTPS
sudo firewall-cmd --zone=public --add-port=2086/tcp --permanent # WHM HTTP
sudo firewall-cmd --zone=public --add-port=2087/tcp --permanent # WHM HTTPS
sudo firewall-cmd --zone=public --add-port=2095/tcp --permanent # Webmail HTTP
sudo firewall-cmd --zone=public --add-port=2096/tcp --permanent # Webmail HTTPS
# Mail ports
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reloadResolução de problemas comuns do Firewalld
Problema 1: Firewalld falha ao iniciar
Verifique se há conflitos com outras ferramentas de firewall:
sudo systemctl status iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo systemctl start firewalldProblema 2: Regras não persistem após reinicialização
Certifique-se de que usou a bandeira --permanent e recarregou:
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reloadO comando --runtime-to-permanent guarda todas as regras em tempo de execução atual na configuração permanente.
Problema 3: Bloqueado do SSH
Se acidentalmente bloqueou o acesso SSH, precisará de aceder ao servidor via consola (disponível através do painel de controlo VPS da AlexHost) e executar:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reloadProblema 4: Verificar registos do Firewalld
sudo journalctl -u firewalld -fOu verifique o registo do sistema para mensagens relacionadas com firewall:
sudo grep -i firewall /var/log/messagesFolha de referência rápida do Firewalld
| Tarefa | Comando |
|---|---|
| Verificar estado | sudo systemctl status firewalld |
| Iniciar Firewalld | ###PPT_NOTR |
