Aula 31: Shorewall — firewall de alto nível baseado em iptables para redes complexas

Aula 31: Shorewall — firewall de alto nível baseado em iptables para redes complexas

Quando um profissional de segurança da informação atinge o nível avançado em Linux, uma das habilidades mais valiosas é a capacidade de construir firewalls robustos sem se perder em dezenas de regras do iptables. É exatamente nesse ponto que o Shorewall entra em cena. O Shorewall é uma ferramenta de alto nível, escrita em Perl, que atua como uma camada de abstração sobre o iptables, permitindo que você descreva sua topologia de rede, políticas de segurança e regras de tráfego em arquivos de configuração legíveis e organizados. Em vez de memorizar cadeias, tabelas e regras numeradas, você define zonas, políticas e regras de forma declarativa — e o Shorewall gera as regras de iptables de maneira automática, consistente e otimizada. Nesta aula, você aprenderá a dominar o Shorewall do zero ao avançado, construindo um firewall corporativo completo para redes complexas.

Por que o Shorewall importa tanto em ambientes profissionais? A resposta é simples: manutenibilidade e redução de erros humanos. Um firewall baseado puramente em iptables, com 200 ou 300 regras escritas manualmente, torna-se um pesadelo para auditar, modificar e documentar. O Shorewall resolve esse problema ao separar conceitos lógicos — zonas, interfaces, políticas e regras — em arquivos independentes que qualquer administrador consegue ler e entender. Em nossos projetos na JRT Technology Solutions, utilizamos o Shorewall diariamente para implantar firewalls em clientes corporativos porque ele reduz drasticamente o tempo de troubleshooting e elimina a maioria dos erros comuns de sintaxe do iptables.

Nesta aula, você vai trabalhar com um cenário realista: um servidor Linux atuando como firewall e gateway para uma rede interna, com uma DMZ para servidores públicos e uma interface externa conectada à internet. Vamos configurar o Shorewall para controlar todo o tráfego entre essas zonas, aplicar NAT, liberar serviços específicos e bloquear tudo o que não for explicitamente permitido — o princípio do default deny. Ao final desta aula, você terá um firewall funcional, auditável e pronto para produção, com configurações completas comentadas linha por linha.

Os pré-requisitos para acompanhar esta aula incluem conhecimento sólido de TCP/IP, entendimento do funcionamento do iptables (cadeias, tabelas e política de alvos), familiaridade com roteamento no Linux e experiência com edição de arquivos de configuração via linha de comando. Você também precisará de uma máquina Linux com pelo menos duas interfaces de rede (ou uma máquina virtual com múltiplas NICs) para testar os cenários práticos. Se você concluiu as aulas anteriores deste curso, especialmente as que cobrem iptables e roteamento, está plenamente preparado para mergulhar no Shorewall.

O que você vai aprender nesta aula

  • Compreender a arquitetura do Shorewall e como ele se relaciona com o iptables
  • Instalar e configurar o Shorewall em Ubuntu/Debian e CentOS/RHEL/Rocky Linux
  • Criar um firewall completo com zonas net, lan e dmz
  • Configurar políticas de segurança padrão (default deny) e regras de exceção
  • Aplicar NAT (masquerading) para dar acesso à internet à rede interna
  • Verificar e testar a configuração com comandos de diagnóstico
  • Resolver os erros mais comuns em ambientes de produção
  • Aplicar boas práticas e otimizações avançadas de configuração

Pré-requisitos e Ambiente

Antes de iniciar esta aula, certifique-se de que seu ambiente atende aos seguintes requisitos. Primeiro, você precisa de uma distribuição Linux com os repositórios de pacotes habilitados: Ubuntu 22.04/24.04 LTS, Debian 11/12, ou CentOS/RHEL 8/9 / Rocky Linux 8/9. Para as distribuições da família Red Hat, será necessário habilitar o repositório EPEL (Extra Packages for Enterprise Linux), pois o Shorewall não está nos repositórios oficiais dessas distribuições. Segundo, sua máquina deve ter pelo menos duas interfaces de rede configuradas — uma para a rede externa (WAN) e outra para a rede interna (LAN). Idealmente, uma terceira interface para a DMZ tornará o cenário mais completo. Terceiro, você deve ter acesso root ou privilégios sudo, pois a instalação e configuração do Shorewall exigem permissões elevadas. Quarto, certifique-se de que o serviço de firewall anterior (como firewalld ou ufw) esteja desativado para evitar conflitos. Por fim, recomendamos fortemente que você teste em uma máquina virtual ou em um ambiente de laboratório antes de aplicar em produção — um erro de configuração de firewall pode bloquear completamente o acesso ao servidor.

O ambiente de rede que usaremos como referência nesta aula é o seguinte: a interface eth0 está conectada à internet (zona net) com IP público 203.0.113.10/24; a interface eth1 está conectada à rede interna (zona lan) com IP 10.0.0.1/24; e a interface eth2 está conectada à DMZ (zona dmz) com IP 192.168.1.1/24. Os servidores da DMZ incluem um servidor web (192.168.1.10) e um servidor de e-mail (192.168.1.20). A rede interna (10.0.0.0/24) deve ter acesso total à internet via NAT, acesso à DMZ para administração, mas não deve ser acessível diretamente da internet. Os servidores da DMZ devem ser acessíveis da internet apenas nas portas específicas de seus serviços (80, 443 e 25).

Conceitos Fundamentais do Shorewall: Zonas, Políticas e Regras

O Shorewall baseia-se em três conceitos centrais que você precisa dominar antes de escrever qualquer configuração: zonas, políticas e regras. Uma zona (zone) é uma abstração lógica que agrupa uma ou mais interfaces de rede que compartilham o mesmo nível de confiança de segurança. Por exemplo, a zona net representa a internet não confiável, a zona lan representa a rede interna confiável, e a zona dmz representa uma área de segurança intermediária para servidores públicos. O Shorewall trata cada zona como um contêiner de tráfego: o tráfego que entra por uma interface pertencente a uma zona é classificado como originário daquela zona, e o tráfego que sai por uma interface é classificado como destinado àquela zona. É crucial entender que uma zona pode conter múltiplas interfaces, mas uma interface pertence a apenas uma zona.

As políticas (policies) definem o comportamento padrão do firewall para o tráfego que se move entre duas zonas — e não dentro da mesma zona. Por exemplo, uma política pode dizer que todo o tráfego da zona lan para a zona net é ACEITO (ACCEPT), enquanto o tráfego da zona net para a zona lan é REJEITADO (REJECT) ou DESCARTADO (DROP). A política para tráfego da internet para o próprio firewall (zona net para a zona $FW) é tipicamente configurada como DROP, garantindo que apenas conexões explicitamente autorizadas por regras específicas sejam permitidas. O Shorewall trata o próprio host firewall como uma zona especial chamada $FW, que é implicitamente definida e não precisa ser declarada no arquivo de zonas. Cada par de zonas pode ter uma política diferente, e o Shorewall gera as cadeias de iptables correspondentes automaticamente.

As regras (rules) são exceções às políticas: elas especificam permissões ou bloqueios específicos para tráfego que atravessa o firewall ou se destina ao próprio firewall. Uma regra típica inclui a zona de origem, a zona de destino, o protocolo (TCP, UDP, ICMP), as portas de origem e destino, e uma ação (ACCEPT, REJECT, DROP). O Shorewall ordena as regras conforme aparecem no arquivo rules, e a primeira regra que corresponder ao tráfego é aplicada. Além disso, o Shorewall suporta políticas de logging — você pode adicionar o sufixo :info ou :debug a qualquer ação para registrar o tráfego correspondente no syslog. Essa capacidade de logging granular é extremamente útil para auditoria e troubleshooting em ambientes de produção.

Outro conceito fundamental é o de masquerading (SNAT dinâmico). Quando sua rede interna usa endereços IP privados (como 10.0.0.0/8, 172.16.0.0/12 ou 192.168.0.0/16) e precisa acessar a internet, o Shorewall substitui o endereço de origem dos pacotes pelo endereço IP público da interface de saída. Isso é configurado no arquivo masq, onde você especifica qual interface deve sofrer masquerading e para quais redes de origem. Sem o masquerading, os pacotes da rede interna chegariam à internet com endereços IP privados, e os roteadores da internet simplesmente descartariam essas conexões. O Shorewall também suporta SNAT estático e DNAT (redirecionamento de portas) através de regras no arquivo rules ou nat, permitindo expor serviços da DMZ ou da LAN para a internet de forma controlada.

Instalação do Shorewall no Ubuntu/Debian e CentOS/RHEL/Rocky Linux

A instalação do Shorewall varia entre as famílias de distribuições Linux. No Ubuntu e no Debian, o pacote está disponível nos repositórios oficiais, o que simplifica bastante o processo. Nas distribuições CentOS, RHEL e Rocky Linux, será necessário habilitar o repositório EPEL para obter o pacote. Vamos cobrir ambos os cenários em detalhes. Antes de iniciar, certifique-se de desativar qualquer firewall ativo que possa conflitar com o Shorewall, como o firewalld nas distros Red Hat ou o ufw no Ubuntu. Em ambientes de produção, recomendamos executar a instalação durante uma janela de manutenção, pois a desativação do firewall existente cria uma breve janela de exposição.

Instalação no Ubuntu 22.04/24.04 e Debian 11/12: O processo é direto e pode ser concluído em poucos minutos. Primeiro, atualize o índice de pacotes para garantir que você obterá a versão mais recente disponível nos repositórios. Depois, instale o pacote shorewall. O instalador criará os diretórios de configuração em /etc/shorewall/ e o diretório de documentação em /usr/share/doc/shorewall/. Diferentemente de outras ferramentas, o Shorewall não inicia automaticamente após a instalação — ele vem desativado por padrão, pois a configuração padrão bloqueia todo o tráfego. Isso é uma medida de segurança deliberada para evitar que você seja trancado para fora do servidor. Para verificar se o Shorewall está instalado corretamente, use o comando shorewall version, que exibirá a versão instalada.

# Atualiza o índice de pacotes do sistema
sudo apt update

# Instala o Shorewall no Ubuntu/Debian
sudo apt install shorewall -y

# Verifica se o Shorewall foi instalado corretamente
shorewall version

# Verifica o diretório de configuração
ls -la /etc/shorewall/
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://archive.ubuntu.com/ubuntu jammy-security InRelease
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  shorewall
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 340 kB of archives.
After this operation, 1.247 kB of additional disk space will be used.
Setting up shorewall (5.2.8-1) ...
shorewall version: 5.2.8
total 64
drwxr-xr-x   2 root root  4096 Sep  6 10:00 .
drwxr-xr-x 128 root root 12288 Sep  6 10:00 ..
-rw-r--r--   1 root root   148 Sep  6 10:00 shorewall.conf
-rw-r--r--   1 root root   823 Sep  6 10:00 zones
-rw-r--r--   1 root root   246 Sep  6 10:00 interfaces
-rw-r--r--   1 root root   331 Sep  6 10:00 policy
-rw-r--r--   1 root root  1560 Sep  6 10:00 rules
-rw-r--r--   1 root root   174 Sep  6 10:00 masq

Instalação no CentOS/RHEL 8/9 e Rocky Linux: Nas distribuições da família Red Hat, o Shorewall não está nos repositórios oficiais. Você precisará habilitar o repositório EPEL (Extra Packages for Enterprise Linux), que fornece pacotes adicionais de alta qualidade para essas distribuições. O processo é igualmente simples, mas requer a instalação do pacote de configuração do EPEL antes. No CentOS Stream 9, Rocky Linux 9 e RHEL 9, o comando é dnf install epel-release; nas versões 8, também funciona com o mesmo comando. Após habilitar o EPEL, instale o pacote shorewall com o dnf ou yum. Antes de instalar, desative o firewalld para evitar conflitos de regras — use systemctl stop firewalld seguido de systemctl disable firewalld. Lembre-se de que o Shorewall não inicia automaticamente após a instalação, então você terá controle total sobre quando ativá-lo.

# Habilita o repositório EPEL para obter pacotes extras
sudo dnf install epel-release -y

# Desativa o firewalld para evitar conflito de regras
sudo systemctl stop firewalld
sudo systemctl disable firewalld

# Instala o Shorewall no CentOS/RHEL/Rocky Linux
sudo dnf install shorewall -y

# Verifica a versão instalada
shorewall version

# Lista os arquivos de configuração
ls -la /etc/shorewall/
Last metadata expiration check: 0:05:42 ago on Sun 06 Sep 2026 10:15:00 AM -03.
Dependencies resolved.
================================================================================
 Package          Architecture   Version                Repository         Size
================================================================================
 shorewall        noarch         5.2.8-3.el9          epel               340 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 340 k
Installed size: 1.2 M
Downloading Packages:
shorewall-5.2.8-3.el9.noarch.rpm                 340 kB/s | 340 kB     00:01
--------------------------------------------------------------------------------
Total                                           340 kB/s | 340 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : shorewall-5.2.8-3.el9.noarch                          1/1
  Running scriptlet: shorewall-5.2.8-3.el9.noarch                          1/1
  Verifying        : shorewall-5.2.8-3.el9.noarch                          1/1
Installed:
  shorewall-5.2.8-3.el9.noarch

Complete!
shorewall version: 5.2.8
total 64
drwxr-xr-x.  2 root root 4096 Sep  6 10:16 .
drwxr-xr-x. 14 root root 4096 Sep  6 10:16 ..
-rw-r--r--.  1 root root  148 Sep  6 10:16 shorewall.conf
-rw-r--r--.  1 root root  823 Sep  6 10:16 zones
-rw-r--r--.  1 root root  246 Sep  6 10:16 interfaces
-rw-r--r--.  1 root root  331 Sep  6 10:16 policy
-rw-r--r--.  1 root root 1560 Sep  6 10:16 rules
-rw-r--r--.  1 root root  174 Sep  6 10:16 masq

Após a instalação em qualquer uma das distribuições, o Shorewall criará os arquivos de configuração padrão em /etc/shorewall/. Cada arquivo tem uma finalidade específica que exploraremos em detalhes nas próximas seções. Por enquanto, é importante entender que o Shorewall não está ativo por padrão — você precisa configurá-lo e habilitá-lo explicitamente. Isso é uma salvaguarda crítica para evitar que você seja bloqueado do servidor. Antes de ativar o Shorewall, sempre teste a configuração com o comando shorewall check, que valida a sintaxe e a lógica dos arquivos sem aplicar as regras.

Configurando o Shorewall Passo a Passo: Arquivo shorewall.conf

O coração da configuração do Shorewall está no arquivo /etc/shorewall/shorewall.conf. Este arquivo contém as configurações globais do firewall, incluindo o modo de inicialização, o tratamento de logs, o suporte a IPv6 e a definição de variáveis personalizadas. Vamos criar uma configuração completa para o nosso cenário de rede com três zonas. O parâmetro STARTUP_ENABLED controla se o Shorewall deve iniciar automaticamente no boot do sistema. Inicialmente, deixaremos como No durante a fase de testes e depois mudaremos para Yes quando a configuração estiver validada. O parâmetro LOGFILE define onde o Shorewall registra suas mensagens de log; o valor padrão /var/log/messages funciona bem para a maioria dos casos, mas você pode usar /var/log/syslog em sistemas Debian/Ubuntu. O parâmetro LOGRATE limita a taxa de log para evitar que um ataque de negação de serviço sobrecarregue o sistema de logging — o valor padrão /s (ilimitado) deve ser substituído por algo como 10/minute em produção.

Outro parâmetro crucial é o IP_FORWARDING. Quando o Shorewall atua como gateway entre redes, ele precisa habilitar o encaminhamento de pacotes (IP forwarding) no kernel. O Shorewall pode gerenciar isso automaticamente se o parâmetro IP_FORWARDING estiver configurado como On. O parâmetro BLACKLIST_ENABLED habilita o uso de listas negras de endereços IP, que veremos mais adiante. O parâmetro DETECT_DNAT_IPADDRS é relevante quando você usa DNAT (redirecionamento de portas), permitindo que o Shorewall detecte automaticamente os endereços IP de destino. Para o nosso cenário, também configuraremos CONFIG_PATH para apontar para /etc/shorewall, garantindo que todos os arquivos de configuração sejam encontrados corretamente. Vamos criar o arquivo completo com comentários explicativos para cada parâmetro.

# /etc/shorewall/shorewall.conf
# Configuração global do Shorewall para firewall corporativo
# Aula 31 - Segurança Linux do Zero ao Avançado - JRT Technology Solutions

# ============ Inicialização ============
# Define se o Shorewall inicia no boot. Use "No" durante testes, "Yes" em produção.
STARTUP_ENABLED=Yes

# ============ Caminhos de Arquivos ============
# Diretório onde os arquivos de configuração estão localizados
CONFIG_PATH=/etc/shorewall

# ============ Logging ============
# Arquivo de log para mensagens do Shorewall
LOGFILE=/var/log/syslog

# Limite de taxa de log (10 mensagens por minuto para evitar flood de logs)
LOGRATE=10/minute

# Nível de log para nova conexões não correspondidas (info, debug, warning)
LOG_LEVEL=info

# ============ Encaminhamento de IP ============
# Habilita IP forwarding (necessário para atuar como gateway)
IP_FORWARDING=On

# ============ Blacklist ============
# Habilita o suporte a listas negras (arquivo blacklist)
BLACKLIST_ENABLED=Yes

# ============ DNAT ============
# Detecta automaticamente endereços IP para regras DNAT
DETECT_DNAT_IPADDRS=Yes

# ============ IPv6 ============
# Habilita suporte a IPv6 (se seu kernel tiver suporte)
IPV6=No

# ============ Variáveis Personalizadas ============
# Alias para os IPs públicos e privados (usados nos arquivos de regras)
PUBLIC_IP=203.0.113.10
LAN_SUBNET=10.0.0.0/24
DMZ_SUBNET=192.168.1.0/24
WEB_SERVER=192.168.1.10
MAIL_SERVER=192.168.1.20

Após criar o arquivo shorewall.conf, o próximo passo é definir as zonas no arquivo /etc/shorewall/zones. Este arquivo estabelece a hierarquia de confiança entre as áreas da sua rede. A zona net representa a internet não confiável; a zona lan representa a rede interna confiável; e a zona dmz representa a área de segurança intermediária. O formato do arquivo é simples: cada linha define uma zona com seu nome e tipo. Os tipos ipv4 indicam zonas que aceitam tráfego IPv4. Você pode adicionar uma descrição opcional após o tipo para documentação. É importante notar que o próprio firewall é representado pela zona especial $FW, que não precisa ser declarada aqui — ela é implicitamente definida pelo Shorewall. Vamos criar o arquivo de zonas completo.

# /etc/shorewall/zones
# Definição das zonas de segurança do firewall
# Formato: NOME_ZONA  TIPO  [DESCRIÇÃO]
# TIPO: ipv4 (tráfego IPv4), ip (IPv4 e IPv6), bport (bridge port)

# Zona da internet (não confiável)
net     ipv4    Internet pública

# Zona da rede interna (confiável)
lan     ipv4    Rede corporativa interna

# Zona DMZ (segurança intermediária para servidores públicos)
dmz     ipv4    Zona desmilitarizada para servidores web e e-mail

Definindo Interfaces, Políticas e Regras do Firewall

Depois de definir as zonas, precisamos associar cada interface física às suas respectivas zonas no arquivo /etc/shorewall/interfaces. O formato deste arquivo inclui o nome da interface, a zona à qual pertence e opções adicionais. A opção dhcp na interface eth0 indica que o IP é obtido dinamicamente via DHCP. A opção tcpflags ativa a verificação de flags TCP inválidas, ajudando a bloquear pacotes malformados. A opção nosmurfs bloqueia pacotes ICMP echo request com endereço de broadcast, uma proteção contra ataques smurf. A opção routeback permite que o tráfego da mesma rede volte pela mesma interface, necessário para algumas topologias. A opção logmartians registra pacotes com endereços de origem inválidos (martians) — endereços que não deveriam aparecer naquela interface, como IPs privados na interface WAN. Em nossos projetos na JRT Technology Solutions, sempre habilitamos logmartians nas interfaces externas para detectar tentativas de spoofing.

# /etc/shorewall/interfaces
# Associação entre interfaces físicas e zonas
# Formato: INTERFACE  ZONA  [OPÇÕES]
# OPÇÕES: dhcp, tcpflags, nosmurfs, routeback, logmartians, blacklist, etc.

# Interface externa (WAN) - conectada à internet
eth0    net     dhcp,tcpflags,nosmurfs,logmartians,blacklist

# Interface interna (LAN) - conectada à rede corporativa
eth1    lan     tcpflags,nosmurfs,routeback

# Interface DMZ - conectada aos servidores públicos
eth2    dmz     tcpflags,nosmurfs,routeback

O arquivo /etc/shorewall/policy define o comportamento padrão para o tráfego entre as zonas. Este é o arquivo que implementa o princípio do default deny — tudo o que não for explicitamente permitido será bloqueado. O formato é: zona de origem, zona de destino, ação padrão e nível de log opcional. A ação ACCEPT permite o tráfego; REJECT rejeita enviando uma resposta ICMP (permite que o remetente saiba que foi bloqueado); DROP descarta silenciosamente (mais seguro, mas mais difícil de diagnosticar); e INFO registra o tráfego no log. Para o tráfego da lan para a net, usamos ACCEPT, pois a rede interna precisa de acesso total à internet. Para o tráfego da net para a lan, usamos DROP — a internet nunca deve acessar diretamente a rede interna. A política da net para o $FW (o próprio firewall) também é DROP, garantindo que apenas serviços explicitamente liberados nas regras sejam acessíveis. A política da lan para a dmz permite que usuários internos acessem os servidores da DMZ para administração. O tráfego da dmz para a net é ACCEPT para que os servidores públicos possam fazer atualizações e enviar e-mails. A política da dmz para a lan é DROP, pois os servidores comprometidos não devem ter acesso à rede interna. Finalmente, a política all para all é DROP como fallback final — qualquer tráfego entre zonas não especificado será descartado.

# /etc/shorewall/policy
# Políticas padrão de tráfego entre zonas
# Formato: ORIGEM  DESTINO  AÇÃO  [LOG]
# AÇÃO: ACCEPT (permite), REJECT (rejeita), DROP (descarta), INFO (registra)

# Rede interna pode acessar a internet livremente
lan     net     ACCEPT

# Internet NÃO pode acessar a rede interna (default deny)
net     lan     DROP    info

# Internet NÃO pode acessar o firewall diretamente (apenas serviços liberados)
net     $FW     DROP    info

# Rede interna pode acessar a DMZ para administração
lan     dmz     ACCEPT

# DMZ pode acessar a internet (atualizações, e-mail, DNS)
dmz     net     ACCEPT

# DMZ NÃO pode acessar a rede interna (contenção de incidentes)
dmz     lan     DROP    info

# DMZ NÃO pode acessar o firewall (apenas serviços liberados)
dmz     $FW     DROP    info

# Rede interna pode acessar o firewall para administração limitada
lan     $FW     ACCEPT

# Fallback: qualquer tráfego não especificado acima é DROP
all     all     DROP    info

Escrevendo as Regras de Tráfego: Liberando Serviços com Segurança

O arquivo /etc/shorewall/rules contém as exceções às políticas padrão — as regras específicas que liberam ou bloqueiam determinados serviços. É aqui que você define, por exemplo, que o servidor web da DMZ é acessível da internet na porta 80, que o servidor de e-mail aceita conexões na porta 25, e que o firewall aceita conexões SSH apenas de redes específicas. O formato básico de uma regra é: ACTION, SOURCE, DEST, PROTO, DEST_PORT, SOURCE_PORT, ORIGINAL_DEST e opções. A ACTION pode ser ACCEPT, REJECT, DROP, DNAT, REDIRECT, LOG, entre outras. As colunas SOURCE e DEST podem ser nomes de zonas (net, lan, dmz), a zona especial $FW, ou endereços IP específicos com máscara. O campo PROTO pode ser tcp, udp, icmp ou all. O campo DEST_PORT permite especificar portas individuais, intervalos (ex.: 8000:8100) ou listas separadas por vírgula.

Vamos criar as regras para o nosso cenário. Primeiro, liberamos o acesso SSH ao firewall da rede interna e da DMZ — nunca da internet diretamente, a menos que seja absolutamente necessário e protegido por fail2ban ou VPN. Segundo, liberamos o acesso ao servidor web da DMZ na porta 80 (HTTP) e 443 (HTTPS) a partir da internet. Terceiro, liberamos o acesso ao servidor de e-mail da DMZ na porta 25 (SMTP) da internet. Quarto, liberamos o acesso DNS da DMZ para a internet (porta 53 UDP) — embora a política já permita ACCEPT de dmz para net, é boa prática documentar explicitamente as portas de saída. Quinto, liberamos o protocolo ICMP (ping) da rede interna para o firewall para monitoramento, mas bloqueamos ping da internet para o firewall (já coberto pela política DROP). Sexto, liberamos o acesso ao serviço de monitoramento na porta 161 UDP (SNMP) apenas da rede interna para o firewall. Sétimo, adicionamos uma regra de DNAT para redirecionar o tráfego da internet na porta 8080 para o servidor web da DMZ na porta 80 — útil para testes ou quando o ISP bloqueia a porta 80. Cada regra deve ser comentada com o propósito para facilitar auditorias futuras.

# /etc/shorewall/rules
# Regras específicas de tráfego (exceções às políticas padrão)
# Formato: AÇÃO  ORIGEM  DESTINO  PROTOCOLO  PORTA_DESTINO  [PORTA_ORIGEM]  [OPÇÕES]
# AÇÃO: ACCEPT, REJECT, DROP, DNAT, REDIRECT, LOG

# ============ Acesso ao Firewall (SSH) ============
# SSH da rede interna para o firewall (administração)
# Nota: A política lan->$FW já permite, mas documentamos explicitamente
ACCEPT  lan  $FW  tcp  22  -  "SSH para administração do firewall"

# SSH da DMZ para o firewall (administração limitada de servidores)
ACCEPT  dmz  $FW  tcp  22  -  "SSH permitido da DMZ para o firewall"

# SSH da internet para o firewall é BLOQUEADO (política net->$FW é DROP)
# Não adicionamos regra ACCEPT para net->$FW na porta 22 por segurança

# ============ Servidores Públicos (DMZ) ============
# Acesso HTTP ao servidor web a partir da internet
ACCEPT  net  dmz:192.168.1.10  tcp  80  -  "Acesso HTTP ao servidor web"

# Acesso HTTPS ao servidor web a partir da internet
ACCEPT  net  dmz:192.168.1.10  tcp  443  -  "Acesso HTTPS ao servidor web"

# Acesso SMTP ao servidor de e-mail a partir da internet
ACCEPT  net  dmz:192.168.1.20  tcp  25  -  "Acesso SMTP ao servidor de e-mail"

# ============ Serviços Internos ============
# DNS da DMZ para a internet (consulta a servidores DNS externos)
ACCEPT  dmz  net  udp  53  -  "DNS da DMZ para internet"

# NTP da DMZ para a internet (sincronização de relógio)
ACCEPT  dmz  net  udp  123  -  "NTP da DMZ para internet"

# ICMP (ping) da rede interna para o firewall (monitoramento)
ACCEPT  lan  $FW  icmp  8  -  "Ping da LAN para o firewall"

# SNMP da rede interna para o firewall (monitoramento de hardware)
ACCEPT  lan  $FW  udp  161  -  "SNMP da LAN para firewall"

# ============ DNAT (Redirecionamento de Portas) ============
# Redireciona porta 8080 da internet para porta 80 do servidor web
# Usado quando o ISP bloqueia a porta 80 de entrada
DNAT  net  dmz:192.168.1.10:80  tcp  8080  -  "Redireciona porta 8080 para servidor web"

Configurando Masquerading (NAT) para Acesso à Internet

O arquivo /etc/shorewall/masq define as regras de mascaramento (SNAT dinâmico) para permitir que redes privadas acessem a internet usando o endereço IP público do firewall. Sem essas regras, os pacotes da rede interna (10.0.0.0/24) e da DMZ (192.168.1.0/24) chegariam à internet com endereços IP privados e seriam descartados pelos roteadores. O formato do arquivo é: INTERFACE, SOURCE, ADDRESS, PROTO, PORT. A INTERFACE é a interface de saída para a internet (eth0). O SOURCE é a rede de origem que será mascarada — pode ser uma subnet específica ou all para todas as redes. O campo ADDRESS opcional especifica o endereço IP a ser usado; se deixado em branco, o Shorewall usa o IP da interface automaticamente. O campo PROTO opcional limita o mascaramento a um protocolo específico (tcp, udp, icmp); o valor all (ou deixar em branco) aplica a todos. O campo PORT opcional limita a portas específicas. Vamos configurar o masquerading para a rede interna e a DMZ na interface eth0.

# /etc/shorewall/masq
# Regras de masquerading (SNAT dinâmico) para acesso à internet
# Formato: INTERFACE  ORIGEM  [ENDEREÇO]  [PROTOCOLO]  [PORTA]
# INTERFACE: interface de saída (eth0 para a internet)
# ORIGEM: rede de origem a ser mascarada

# Mascara a rede interna na interface externa (acesso à internet)
eth0  10.0.0.0/24  -  all  -

# Mascara a rede DMZ na interface externa (acesso à internet)
eth0  192.168.1.0/24  -  all  -

# Alternativa: mascarar todas as redes de uma só vez
# eth0  all  -  all  -

O masquerading é uma das funcionalidades mais críticas para um firewall corporativo. Sem ele, a rede interna ficaria isolada da internet, e os usuários não conseguiriam navegar, receber e-mails ou acessar serviços externos. É importante entender que o masquerading é dinâmico: o Shorewall monitora o endereço IP da interface externa e ajusta as regras automaticamente quando ele muda (por exemplo, em conexões DHCP). Isso é uma vantagem significativa sobre SNAT estático, que requer configuração manual quando o IP público muda. Além disso, o masquerading também é aplicado ao tráfego de retorno: quando uma resposta chega da internet, o Shorewall desfaz o mascaramento e encaminha o pacote ao host interno correto, garantindo que as conexões bidirecionais funcionem perfeitamente.

Aplicando e Ativando a Configuração do Shorewall

Agora que todos os arquivos de configuração estão prontos, é hora de validar e aplicar as regras. O primeiro e mais importante passo é executar o comando shorewall check, que valida a sintaxe e a lógica de todos os arquivos de configuração sem aplicar nada. Isso é crucial porque um erro de sintaxe no arquivo de regras pode resultar em um firewall com regras incompletas ou incorretas — potencialmente bloqueando o acesso ao servidor ou, pior, deixando-o vulnerável. Se o comando check retornar sem erros, você pode prosseguir com segurança. Se houver erros, o Shorewall exibirá mensagens detalhadas indicando o arquivo e a linha problemática, permitindo correção imediata. Nunca pule esta etapa — em nossos projetos na JRT Technology Solutions, consideramos o shorewall check um passo obrigatório antes de qualquer ativação.

Após validar, aplique a configuração com o comando shorewall start (ou shorewall restart se já estiver em execução). O comando start gera as regras de iptables a partir dos arquivos de configuração e as aplica no kernel. Durante o processo, o Shorewall exibe informações sobre cada zona, interface e regra gerada. Preste atenção às mensagens de saída para confirmar que todas as zonas foram processadas corretamente e que as regras foram aplicadas sem warnings. Se o comando start retornar com sucesso, seu firewall está ativo e funcionando. Para garantir que o Shorewall inicie automaticamente no boot, use systemctl enable shorewall (no Debian/Ubuntu e CentOS/RHEL). Lembre-se de que o parâmetro STARTUP_ENABLED=Yes no arquivo shorewall.conf é necessário para o serviço systemd iniciar o firewall corretamente.

# 1. Valida a configuração antes de aplicar (OBRIGATÓRIO)
sudo shorewall check

# 2. Aplica a configuração (gera regras de iptables e ativa o firewall)
sudo shorewall start

# 3. Habilita o serviço para iniciar automaticamente no boot
sudo systemctl enable shorewall

# 4. Verifica o status do serviço
sudo systemctl status shorewall
Checking...
Validating interfaces file...
Validating zones file...
Validating policy file...
Validating rules file...
Validating masq file...
Configuration validated successfully

Starting Shorewall...
Initializing...
Processing /etc/shorewall/zones...
  Zone net: eth0
  Zone lan: eth1
  Zone dmz: eth2
  Zone $FW: firewall host
Processing /etc/shorewall/interfaces...
Processing /etc/shorewall/policy...
  Policy lan to net: ACCEPT
  Policy net to lan: DROP info
  Policy net to $FW: DROP info
  Policy lan to dmz: ACCEPT
  Policy dmz to net: ACCEPT
  Policy dmz to lan: DROP info
  Policy dmz to $FW: DROP info
  Policy lan to $FW: ACCEPT
  Policy all to all: DROP info
Processing /etc/shorewall/rules...
  Rule: ACCEPT lan $FW tcp 22
  Rule: ACCEPT dmz $FW tcp 22
  Rule: ACCEPT net dmz:192.168.1.10 tcp 80
  Rule: ACCEPT net dmz:192.168.1.10 tcp 443
  Rule: ACCEPT net dmz:192.168.1.20 tcp 25
  Rule: ACCEPT dmz net udp 53
  Rule: ACCEPT dmz net udp 123
  Rule: ACCEPT lan $FW icmp 8
  Rule: ACCEPT lan $FW udp 161
  Rule: DNAT net dmz:192.168.1.10:80 tcp 8080
Processing /etc/shorewall/masq...
  Masquerade: eth0 10.0.0.0/24
  Masquerade: eth0 192.168.1.0/24
Shorewall started successfully

Created symlink /etc/systemd/system/multi-user.target.wants/shorewall.service → /lib/systemd/system/shorewall.service.
● shorewall.service - Shorewall IPv4 firewall
     Loaded: loaded (/lib/systemd/system/shorewall.service; enabled; vendor preset: enabled)
     Active: active (exited) since Sun 2026-09-06 10:30:00 -03; 2s ago
   Main PID: 4321 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 4096)
     Memory: 0B
        CPU: 0
     CGroup: /system.slice/shorewall.service

Sep 06 10:30:00 firewall systemd[1]: Starting Shorewall IPv4 firewall...
Sep 06 10:30:02 firewall systemd[1]: Finished Shorewall IPv4 firewall.

Verificando a Instalação / Testando a Configuração

Após ativar o Shorewall, é fundamental verificar se as regras foram aplicadas corretamente no iptables e se o firewall está funcionando como esperado. O comando shorewall status exibe um resumo das zonas, políticas e regras ativas. Além dele, você pode inspecionar diretamente as regras do iptables para confirmar que o Shorewall as gerou corretamente. Use iptables -L -v -n para listar todas as cadeias com contadores de pacotes e bytes — isso mostra o tráfego real que está passando pelo firewall. Para ver as regras da tabela NAT (incluindo masquerading e DNAT), use iptables -t nat -L -v -n. Para testar a conectividade de ponta a ponta, execute testes a partir de máquinas em cada zona: da LAN, tente acessar a internet (ping 8.8.8.8) e a DMZ (ping 192.168.1.10); da DMZ, tente acessar a internet e a LAN (esta última deve falhar); da internet, tente acessar o servidor web na porta 80 (deve funcionar) e o firewall na porta 22 (deve falhar). Esses testes validam se as políticas e regras estão comportando-se conforme o planejado.

# Verifica o status do Shorewall
sudo shorewall status

# Lista as regras da tabela filter (políticas e regras de filtragem)
sudo iptables -L -v -n --line-numbers

# Lista as regras da tabela NAT (masquerading e DNAT)
sudo iptables -t nat -L -v -n

# Verifica o encaminhamento de IP
cat /proc/sys/net/ipv4/ip_forward

# Testa da máquina LAN: acesso à internet
ping -c 3 8.8.8.8

# Testa da máquina LAN: acesso à DMZ
ping -c 3 192.168.1.10

# Testa da máquina DMZ: acesso à internet (deve funcionar)
ping -c 3 8.8.8.8

# Testa da máquina DMZ: acesso à LAN (DEVE FALHAR)
ping -c 3 10.0.0.10
Shorewall-5.2.8 Status at firewall - Sun Sep  6 10:35:00 -03 2026

Zones:
dmz (ipv4)
lan (ipv4)
net (ipv4)

Policies:
dmz to lan : DROP info
dmz to net : ACCEPT
dmz to $FW : DROP info
lan to dmz : ACCEPT
lan to net : ACCEPT
lan to $FW : ACCEPT
net to dmz : DROP info
net to lan : DROP info
net to $FW : DROP info
all to all : DROP info

Rules:
ACCEPT lan $FW tcp 22
ACCEPT dmz $FW tcp 22
ACCEPT net dmz:192.168.1.10 t

Quer aprender na prática com especialistas?

A JRT Technology Solutions oferece treinamentos e implementação de Segurança Linux para equipes corporativas.



Falar no WhatsApp

Avatar photo

Thiago Paes Rodrigues

Com mais de 22 anos de experiência em Tecnologia da Informação, este profissional construiu uma trajetória sólida como empresário, atuando de forma estratégica na implementação de soluções tecnológicas que otimizam processos e impulsionam resultados em diferentes setores.