Troubleshooting BIND9 + WHMCS: sintaxe DNS, cron de alta performance e integração eNom
Voltar para blog

Troubleshooting BIND9 + WHMCS: sintaxe DNS, cron de alta performance e integração eNom

07/06/2026 · 4 min · Desenvolvimento

Neste incidente, tratei três pontos encadeados em um ambiente de hosting: falha de sintaxe no BIND9, ajuste de cron no WHMCS para reduzir contenção e revisão da integração do registrador eNom com foco em segurança operacional.

A falha inicial de DNS foi:

missing ';' before 'deny'

A partir daí, executei um fluxo completo de diagnóstico, correção, validação e hardening para estabilizar o DNS autoritativo, a automação de billing/domínios e o registro automático.


1) BIND9: backup, diagnóstico e recuperação segura#

Qualquer alteração em servidores DNS de produção exige contingenciamento rígido. Um arquivo de configuração corrompido pode causar indisponibilidade completa de resolução.

1.1 backup preventivo obrigatório#

Antes de editar qualquer diretiva, salve um instantâneo de segurança do diretório do BIND9:

# Backup completo do BIND9 (arquivos de config e zonas)
sudo tar czf /root/bind-backup-$(date +%Y%m%d-%H%M%S).tar.gz /etc/bind/

# Backup simples da configuração principal
sudo cp /etc/bind/named.conf /etc/bind/named.conf.bak.$(date +%Y%m%d)

# Backup do subdiretório de zonas
sudo cp -r /etc/bind/zones/ /etc/bind/zones.bak.$(date +%Y%m%d)/ 2>/dev/null || true

1.2 coleta de evidências e status#

Identifique o erro lendo os logs de inicialização do daemon:

systemctl status bind9 --no-pager
journalctl -u bind9 -n 50 --no-pager

(Nota: em sistemas Red Hat/CentOS, substitua bind9 por named).

1.3 validação de arquivos incluídos com named-checkconf#

Um erro comum é executar named-checkconf apontando para um arquivo isolado. Se o seu named.conf importa outros arquivos (como named.conf.options ou named.conf.local), a validação pode passar em branco por erros aninhados.

# Buscar todos os arquivos incluídos na configuração do BIND
grep -r "include" /etc/bind/named.conf

# Validar recursivamente TODOS os arquivos configurados (método recomendado)
named-checkconf

# Validar especificamente um arquivo
named-checkconf /etc/bind/named.conf

1.4 a correção da sintaxe#

O erro missing ';' before 'deny' foi causado pela ausência de ponto e vírgula delimitador na declaração do IP de loopback.

  allow-recursion {
      127.0.0.1
      deny all;
  };
  allow-recursion {
      127.0.0.1;
      deny all;
  };

2) Hardening do BIND9: segurança, zonas reversas e logging#

2.1 zone transfer security (allow-transfer)#

Por padrão, se não configurado explicitamente, o BIND9 pode permitir que atacantes consultem todas as entradas de uma zona através de transferências AXFR completas. Proteja suas zonas restringindo essa ação:

options {
    directory "/var/cache/bind";
    
    # Bloquear transferência de zona globalmente
    allow-transfer { none; };
    
    # Ou permitir apenas IPs de servidores DNS secundários confiáveis
    # allow-transfer { 192.168.0.5; 192.168.0.6; };
};

2.2 configuração de logging detalhado#

Para fins de auditoria de segurança e depuração, configure canais de log dedicados no named.conf.options:

logging {
    channel default_log {
        file "/var/log/named/default.log" versions 5 size 10m;
        severity info;
        print-time yes;
        print-severity yes;
        print-category yes;
    };

    channel query_log {
        file "/var/log/named/query.log" versions 5 size 50m;
        severity info;
        print-time yes;
    };

    category default { default_log; };
    category queries { query_log; };
    category security { default_log; };
};

Crie o diretório correspondente no host e garanta as permissões do usuário do daemon:

sudo mkdir -p /var/log/named
sudo chown bind:bind /var/log/named

2.3 DNSSEC: validação e confiança#

A diretiva dnssec-validation auto; indica ao BIND que utilize as chaves âncora de confiança da raiz de DNS (root trust anchors) gerenciadas automaticamente pelo sistema para validar registros assinados.

  # Verificar status de chaves gerenciadas
  sudo rndc managed-keys status

Caso o servidor DNS não possua acesso externo para atualizar chaves (root hints), erros de resolução de domínios assinados podem ocorrer. Para depuração temporária, a diretiva pode ser desativada com dnssec-validation no; (não recomendado em produção).

2.4 configurando zonas reversas (PTR)#

A resolução de IPs para nomes (PTR) é mandatória para servidores de e-mail evitarem marcações de SPAM.

Declare a zona reversa no named.conf.local:

zone "0.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.0";
    allow-query { any; };
};

Crie o arquivo de zona /etc/bind/zones/db.192.168.0:

$TTL 86400
@   IN  SOA ns1.domain.local. admin.domain.local. (
        2026061501  ; Serial (YYYYMMDDNN)
        3600        ; Refresh
        900         ; Retry
        604800      ; Expire
        86400       ; Negative Cache TTL
)
    IN  NS  ns1.domain.local.
10  IN  PTR web.domain.local.
20  IN  PTR mail.domain.local.

2.5 limpeza de cache (flush)#

Após corrigir permissões ou registros DNS em zonas externas, limpe o cache do BIND para evitar respostas defasadas:

# Limpar cache geral
sudo rndc flush

# Limpar cache de um domínio específico
sudo rndc flushname example.com

# Dump das estatísticas de cache na memória
sudo rndc stats

3) Auditoria de rede e procedimentos operacionais#

3.1 verificação de firewall e portas#

O DNS opera tanto em UDP (consultas rápidas) quanto em TCP (transferências de zona e respostas grandes que ultrapassam 512 bytes) na porta 53.

# Confirmar se o daemon do BIND está em escuta
sudo ss -lntup | grep :53

# Verificar regras ativas de firewall no UFW
sudo ufw status | grep 53

# Ou inspecionar regras brutas de iptables
sudo iptables -L -n | grep 53

# Liberar portas caso necessário
sudo ufw allow 53/tcp
sudo ufw allow 53/udp

Teste a resolução externamente:

dig @IP_DO_SERVIDOR_DNS example.com A +short

3.2 procedimento para adicionar novas zonas#

Siga rigorosamente estas etapas para adicionar um novo domínio ao BIND9:

  1. Criar o arquivo de zona: crie /etc/bind/zones/novo-domain.com.db com o SOA, NS e apontamentos A/MX.
  2. Declarar no config: adicione a zona ao named.conf.local:
   zone "novo-domain.com" {
       type master;
       file "/etc/bind/zones/novo-domain.com.db";
   };
  1. Validar a integridade:
   sudo named-checkconf
   sudo named-checkzone novo-domain.com /etc/bind/zones/novo-domain.com.db
  1. Aplicar as alterações:
   sudo rndc reload

4) Otimização da cron do WHMCS e prevenção de overlap#

Executar a cron do WHMCS (cron.php) a cada minuto pode criar gargalos de banco e load devido ao acúmulo de processos pendentes de encerramento.

4.1 otimização de agendamento#

Ajuste a execução para um intervalo seguro de 5 minutos, utilizando o binário absoluto do interpretador PHP:

# Modo Clássico Otimizado
*/5 * * * * /usr/local/bin/php -q /home/usuario/whmcs/crons/cron.php

4.2 prevenção de overlap com lock mutual exclusion (flock)#

Impeça que novos disparos ocorram se o ciclo anterior ainda estiver ativo:

# Prevenção ativa de contenção via flock
*/5 * * * * /usr/bin/flock -n /tmp/whmcs-cron.lock /usr/local/bin/php -q /home/usuario/whmcs/crons/cron.php

4.3 auditoria e depuração da cron#

Para validar o processamento dinâmico e localizar falhas de bootstrap:

# Monitorar logs de execução do cron do WHMCS
tail -f /home/usuario/whmcs/crons/cron.log 2>/dev/null || true

# Rastrear logs de erro do PHP-FPM
tail -f /var/log/php-fpm/error.log

# Verificar processos de cron ativos no sistema
pgrep -af "whmcs/crons/cron.php"

# Listar agendamentos do usuário executor
crontab -l -u usuario

5) Integração segura com API eNom#

O provisionamento automático de domínios via eNom exige consistência no fluxo de autenticação e comunicação com a API REST.

5.1 validação de conectividade e credenciais#

Antes de delegar o registro ao WHMCS, confirme a comunicação e a liberação de IP direto do terminal do host:

# Testar conexão básica e saldo de conta na API de sandbox do eNom
curl -v "https://reseller.enom.com/interface.asp?command=GetBalance&uid=USUARIO&pw=SENHA&ResponseType=XML"

5.2 monitoramento de erros da API eNom no WHMCS#

Se o registro de domínios falhar silenciosamente:

  tail -f /home/usuario/whmcs/modules/registrars/enom/emails.log 2>/dev/null || true

6) Scripts de apoio operacional#

Script de diagnóstico do BIND9 (diagnose-bind9.sh)#

#!/bin/bash
# diagnose-bind9.sh - Diagnóstico de integridade e desempenho do BIND9
set -euo pipefail

echo "=== Diagnóstico BIND9 ==="

# 1. Verificar Serviço
if systemctl is-active --quiet bind9 2>/dev/null || systemctl is-active --quiet named 2>/dev/null; then
    echo "✅ Serviço DNS está rodando."
else
    echo "❌ Serviço DNS está inativo!"
fi

# 2. Validar Arquivos de Configuração
if command -v named-checkconf &>/dev/null; then
    if named-checkconf >/dev/null 2>&1; then
        echo "✅ Sintaxe das configurações global válida."
    else
        echo "❌ Erro na validação de sintaxe! Detalhes:"
        named-checkconf || true
    fi
fi

# 3. Porta 53
if ss -lntup | grep -q ":53"; then
    echo "✅ Porta 53 em escuta ativa."
else
    echo "❌ Porta 53 não detectada em escuta!"
fi

# 4. Status de Resolução Local
if command -v dig &>/dev/null; then
    if dig @127.0.0.1 google.com A +short +time=2 +tries=1 >/dev/null 2>&1; then
        echo "✅ Resolução recursiva local funcionando."
    else
        echo "⚠️ Falha na resolução local de teste."
    fi
fi

Script de backup automático do BIND9 (backup-bind9.sh)#

#!/bin/bash
# backup-bind9.sh - Backup preventivo e empacotamento do DNS
set -euo pipefail

BACKUP_DIR="/root/bind-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"

echo "Iniciando backup das configurações do BIND..."
sudo cp -r /etc/bind/ "$BACKUP_DIR/config/"

if [ -d /var/log/named ]; then
    echo "Salvando dumps de logs..."
    sudo cp -r /var/log/named/ "$BACKUP_DIR/logs/" 2>/dev/null || true
fi

tar czf "${BACKUP_DIR}.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"

echo "✅ Backup concluído em: ${BACKUP_DIR}.tar.gz"

Checklist de deploy e validação#

Este artigo foi útil?

Deixe uma reação rápida para apoiar o conteúdo:

CC BY-NC

Este post está licenciado sob CC BY-NC.

Comentários

Participe da discussão abaixo.

0 comentários