Proteja servidores HestiaCP com lista de ipset
Voltar para blog

Proteja servidores HestiaCP com lista de ipset

07/06/2026 · 5 min · Infraestrutura

O HestiaCP, combinado com os daemons Fail2ban e Iptables, oferece uma base sólida para a defesa e endurecimento (hardening) de servidores Linux. Contudo, gerenciar milhares de regras individuais no Iptables gera gargalo de CPU e latência de rede. É aqui que o IPset se torna indispensável: ele gerencia listas dinâmicas de IPs na memória do kernel (estruturas hash super rápidas), permitindo bloqueios volumétricos eficientes com baixo overhead de hardware.

Neste artigo, estruturamos a verificação de pré-requisitos, backups obrigatórios das regras do firewall, criação de whitelists para mitigar lockouts acidentais, auditorias sintáticas de scripts e procedimentos sistemáticos de monitoramento e rollback.


1) Verificação de pré-requisitos do sistema#

Antes de iniciar as configurações e agendar tarefas automatizadas no HestiaCP, garanta que todas as dependências e binários necessários estejam instalados no sistema e que o painel esteja operacional:

# 1. Verificar se o utilitário IPset está instalado e qual sua versão
which ipset
ipset --version

# 2. Verificar se o Fail2ban está instalado e respondendo
which fail2ban-client
fail2ban-client --version

# 3. Validar se o HestiaCP está ativo e rodando (o nome do serviço pode ser hestia, hestia-web ou hestiacp)
systemctl list-units --type=service | grep -i hestia
# E verificar o status do serviço específico encontrado (ex: hestia)
systemctl status hestia

# 4. Verificar se o script nativo de blacklist do HestiaCP está no local correto
ls -la /usr/local/hestia/install/common/firewall/ipset/blacklist.sh

2) Backup preventivo obrigatório do firewall#

Qualquer modificação na tabela de roteamento e regras de firewall ativa o risco de lockout (perda de acesso ao console). Realize o backup com carimbo de data (timestamp) de todas as regras atuais do Iptables e tabelas do IPset:

# 1. Exportar e fazer backup de todas as regras vigentes do Iptables
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules

# 2. Fazer backup da configuração e listagem atual do IPset
ipset list > /root/ipset-backup-$(date +%Y%m%d).txt

# 3. Opcional: Se utilizando CSF (ConfigServer Security & Firewall) em paralelo, faça backup do diretório
tar czf /root/csf-backup-$(date +%Y%m%d).tar.gz /etc/csf/

3) Whitelist de IPs (prevenção de lockouts)#

Para evitar que administradores, integradores e ferramentas de monitoramento confiáveis sejam bloqueados pelas listas globais de spam ou reputação, crie um set exclusivo de whitelist e defina uma regra prioritária que aceite as requisições antes do bloco de rejeições:

# 1. Criar o set de whitelist na memória do kernel
ipset create WHITELIST hash:ip

# 2. Adicionar os IPs e subredes de confiança na lista
ipset add WHITELIST 10.0.0.1
ipset add WHITELIST 192.168.1.0/24
# Opcional: Adicione seu próprio IP público dinâmico (caso seja fixo)
# ipset add WHITELIST 203.0.113.50

> [!IMPORTANT]
> **AVISO DE LOCKOUT:** Certifique-se de validar se o seu próprio IP público atual (ou o IP da sua VPN/Monitoramento) está adicionado à `WHITELIST` antes de configurar qualquer bloqueio. Mantenha sempre uma sessão SSH de backup aberta em paralelo para não perder o acesso ao servidor.

# 3. Criar a regra de aceitação prioritária no Iptables (inserida no topo da chain)
iptables -I INPUT -m set --match-set WHITELIST src -j ACCEPT

(No HestiaCP, se preferir gerenciar via interface, adicione uma regra de entrada com Ação: ACCEPT para o IPset correspondente antes das regras de drop/reject).


4) Validação do script de blacklist do HestiaCP#

O HestiaCP traz um script utilitário projetado para coletar bases públicas de IPs maliciosos. Certifique-se de validar sua integridade e permissões de execução antes de agendá-lo no cron:

# 1. Garantir que o script possui permissões de execução para o root
chmod +x /usr/local/hestia/install/common/firewall/ipset/blacklist.sh

# 2. Testar a análise sintática do script (Dry Run de compilação do bash)
bash -n /usr/local/hestia/install/common/firewall/ipset/blacklist.sh

# 3. Executar em modo verbose para diagnóstico de download e processamento de IPs
sudo bash -x /usr/local/hestia/install/common/firewall/ipset/blacklist.sh 2>&1 | head -n 50

# 4. Executar o script manualmente em primeiro plano para carregar as listas iniciais
sudo /usr/local/hestia/install/common/firewall/ipset/blacklist.sh

Esse script integra diversas fontes de feeds públicos e de reputação cibernética, livre de placeholders:


5) Cadastro das listas no HestiaCP#

No painel administrativo HestiaCP, gerencie a integração do IPset de forma visual:

  1. Acesse Configurações do Servidor (ícone de engrenagem).
  2. Vá até a aba Firewall.
  3. Clique em Listas de IP Set.
  4. Selecione Adicionar lista de IP.

Preencha as opções conforme a tabela de homologação:

script:/usr/local/hestia/install/common/firewall/ipset/blacklist.sh


6) Configuração das regras do firewall HestiaCP#

Fluxo de bloqueio ipset + HestiaCP#

flowchart LR subgraph Kernel IS["IPset BLOCK-LIST<br/>hash:ip"] IPT["iptables INPUT<br/>match set src"] end subgraph Userspace BL[blacklist.sh] F2B[Fail2ban] CRON[Cron diário 3:00] HCP[HestiaCP Firewall UI] end BL -->|alimenta| IS F2B -->|ban dinâmico| IS CRON -->|gatilho| BL HCP -->|regras DROP/REJECT| IPT IS -->|match| IPT IPT -->|DROP/REJECT| PKT[Pacote malicioso] style IS fill:#f59e0b,color:#000 style IPT fill:#ef4444,color:#fff

Crie regras específicas para associar a lista IPset às ações de bloqueio no HestiaCP:

Regra 1: Negar tráfego TCP (entrada)#

Regra 2: Negar tráfego UDP (entrada/saída)#

(Nota: O uso de DROP para UDP e ICMP é a prática de segurança recomendada em vez de REJECT, pois evita o envio de mensagens ICMP Port Unreachable de volta ao remetente, o que revelaria a existência do host).

Regra 3: Negar pacotes ICMP (ping)#


7) Verificação pós-configuração e homologação#

Após criar a lista e cadastrar as regras no HestiaCP, realize a validação operacional para certificar que o bloqueio está sendo processado pelo kernel:

# 1. Verificar se a lista IPset BLOCK-LIST foi de fato criada
ipset list BLOCK-LIST | head -n 10

# 2. Contar a quantidade total de IPs carregados na lista (evitando cabeçalhos)
ipset save BLOCK-LIST | grep -c "^add "
# Ou
ipset list BLOCK-LIST -o save | grep "^add" | wc -l

# 3. Auditar a vinculação da tabela IPset nas regras do Iptables
iptables -L -n | grep -i "ipset"

# 4. Adicionar um IP de teste temporário para simular um bloqueio
ipset add BLOCK-LIST 192.0.2.1

# 5. Confirmar se o IP de teste consta na lista activa
ipset test BLOCK-LIST 192.0.2.1

8) Atualização das listas ipset via cron#

As listas de IPs maliciosos mudam constantemente. Para garantir que as atualizações ocorram em segundo plano, configure um agendamento do cron job:

# Executar a atualização manualmente para teste
sudo /usr/local/hestia/install/common/firewall/ipset/blacklist.sh

# Adicionar a tarefa no cron do root (ex: atualiza diariamente às 3:00 da manhã)
# Usamos o 'flock' para evitar execuções concorrentes se o download das listas demorar ou falhar
# 0 3 * * * /usr/bin/flock -n /var/run/blacklist-ipset.lock /usr/local/hestia/install/common/firewall/ipset/blacklist.sh > /dev/null 2>&1

### 8-b) persistência do ipset pós-reboot

Por padrão, as tabelas do IPset ficam salvas apenas na memória do kernel e são perdidas no reboot. Para torná-las persistentes, salve as regras e crie um script ou serviço systemd de restauração:

Salvar os sets atuais para um arquivo de regras#

ipset save > /etc/ipset.rules


Crie o arquivo `/etc/systemd/system/ipset-restore.service`:

[Unit] Description=Restaurar Regras do IPset no Boot Before=network.target

[Service] Type=oneshot ExecStart=/sbin/ipset restore -f /etc/ipset.rules ExecStop=/sbin/ipset save -f /etc/ipset.rules RemainAfterExit=yes

[Install] WantedBy=multi-user.target


Ative o serviço:

systemctl daemon-reload systemctl enable ipset-restore.service


9) Monitoramento do ipset e Fail2ban#

Implemente monitoramento para garantir a integridade dos sets. A indisponibilidade de rede ou falha de escrita pode corromper as atualizações:

# 1. Verificar jails e status do Fail2ban
fail2ban-client status
fail2ban-client status sshd

# 2. Verificar IPs banidos ativamente no jail sshd
fail2ban-client status sshd | grep -i "banned"

# 3. Monitorar logs do Fail2ban em tempo real
tail -n 100 /var/log/fail2ban.log

Script de monitoramento de integridade (monitor-ipset.sh)#

Crie este script em /usr/local/sbin/monitor-ipset.sh para auditar periodicamente o tamanho da sua lista, verificando se o set existe e contando os IPs de forma correta:

#!/bin/bash
# monitor-ipset.sh - Verifica o tamanho mínimo da lista de bloqueio
SET_NAME="${1:-BLOCK-LIST}"
MIN_IPS="${2:-100}"

if ! ipset list "$SET_NAME" >/dev/null 2>&1; then
    echo "CRITICAL: IPset $SET_NAME não existe!" | mail -s "Alerta de Seguranca: IPset" [email protected]
    exit 2
fi

# Contar apenas as entradas add (desconsiderando o cabeçalho)
COUNT=$(ipset save "$SET_NAME" | grep -c "^add ")

if [ "$COUNT" -lt "$MIN_IPS" ]; then
    echo "ALERTA: A lista IPset $SET_NAME está anormalmente pequena: $COUNT IPs carregados." | mail -s "Alerta de Seguranca: IPset" [email protected]
    exit 1
else
    echo "OK: IPset $SET_NAME operando normalmente com $COUNT IPs."
    exit 0
fi

10) Procedimento de rollback e contingência#

Em caso de indisponibilidade ou travamento de acessos legítimos devido às listas, execute a remoção rápida das regras e o restabelecimento do Iptables:

# 1. Remover a vinculação da lista no Iptables (Exclui as regras de Drop/Reject baseadas na lista)
iptables -D INPUT -m set --match-set BLOCK-LIST src -j DROP 2>/dev/null
iptables -D INPUT -m set --match-set BLOCK-LIST src -j REJECT 2>/dev/null

# 2. Destruir os sets de IPset criados para limpar a memória do kernel
ipset destroy BLOCK-LIST
ipset destroy WHITELIST

# 3. Restaurar as regras de firewall padrão a partir do backup preventivo (substitua a data real do backup)
ls -la /root/iptables-backup-*.rules
iptables-restore < /root/iptables-backup-20260618.rules

11) Diagnóstico dinâmico através dos arquivos de log#

Caso ocorram problemas de rede ou erros na sincronização de pacotes do HestiaCP, consulte os arquivos de logs:

journalctl --since "1 hour ago" | grep -i "ipset"

tail -100 /var/log/messages | grep -i "DROP\|REJECT"

tail -100 /usr/local/hestia/log/system.log


Checklist: ipset no HestiaCP#

Utilize este roteiro de auditoria e validação técnica em novos setups HestiaCP:

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