#!/usr/bin/env bash
#=============================================================================
# Sentinela ? Intelligent Linux Security Framework
# ipset/manager.sh ? Gestión centralizada de ipsets
#=============================================================================
#
# Administra todos los ipsets usados por Sentinela.
# Crea, destruye, lista y limpia sets.
#
# Ipsets:
# SENTINELA_TRUSTED - IPs de administración (timeout 86400s)
# SENTINELA_BLACKLIST - IPs maliciosas (timeout BAN_TIME)
# SENTINELA_DDOS - Atacantes DDoS (timeout DDOS_BAN_TIME)
# SENTINELA_REPUTATION - Redes maliciosas externas (timeout 86400s)
# SENTINELA_HONEY - IPs que cayeron en honeypots (timeout 3600s)
#=============================================================================
# shellcheck source=lib/common.sh
source "${SENTINELA_DIR}/lib/common.sh"
#=============================================================================
# Configuración de ipsets
#=============================================================================
declare -A IPSETS
IPSETS=(
["SENTINELA_TRUSTED"]="hash:ip 86400"
["SENTINELA_BLACKLIST"]="hash:ip ${BAN_TIME}"
["SENTINELA_DDOS"]="hash:ip ${DDOS_BAN_TIME:-600}"
["SENTINELA_REPUTATION"]="hash:net 86400"
["SENTINELA_HONEY"]="hash:ip 3600"
)
#=============================================================================
# Crear todos los ipsets
#=============================================================================
ipset_create_all() {
for set_name in "${!IPSETS[@]}"; do
local type_timeout="${IPSETS[$set_name]}"
local type="${type_timeout% *}"
local timeout="${type_timeout#* }"
if ! ${IPSET} list "${set_name}" &>/dev/null; then
log_info "Creando ipset ${set_name} (${type}, timeout: ${timeout}s)"
${IPSET} create "${set_name}" "${type}" timeout "${timeout}" 2>/dev/null || {
# Si falla, destruir y recrear
${IPSET} destroy "${set_name}" 2>/dev/null || true
${IPSET} create "${set_name}" "${type}" timeout "${timeout}"
}
else
log_debug "Ipset ${set_name} ya existe"
fi
done
}
#=============================================================================
# Destruir todos los ipsets
#=============================================================================
ipset_destroy_all() {
for set_name in "${!IPSETS[@]}"; do
if ${IPSET} list "${set_name}" &>/dev/null; then
log_info "Destruyendo ipset ${set_name}"
${IPSET} destroy "${set_name}" 2>/dev/null || true
fi
done
}
#=============================================================================
# Flush (limpiar) todos los ipsets
#=============================================================================
ipset_flush_all() {
for set_name in "${!IPSETS[@]}"; do
if ${IPSET} list "${set_name}" &>/dev/null; then
log_info "Limpiando ipset ${set_name}"
${IPSET} flush "${set_name}" 2>/dev/null || true
fi
done
}
#=============================================================================
# Listar todos los ipsets con conteo de entradas
#=============================================================================
ipset_list_all() {
echo "??? Ipsets activos ???"
echo
for set_name in "${!IPSETS[@]}"; do
if ${IPSET} list "${set_name}" &>/dev/null; then
local entries
entries=$(${IPSET} list "${set_name}" 2>/dev/null | grep -cE '^[0-9]' || true)
local type_timeout="${IPSETS[$set_name]}"
printf " ? %-25s %s\n" "${set_name}" "${entries} entradas"
else
printf " ? %-25s %s\n" "${set_name}" "no existe"
fi
done
echo
}
#=============================================================================
# Mostrar miembros de un ipset específico
#=============================================================================
ipset_show() {
local set_name="$1"
if ! ${IPSET} list "${set_name}" &>/dev/null; then
log_error "Ipset ${set_name} no existe"
return 1
fi
echo "Ipset: ${set_name}"
echo "??????????????????????????????????????"
${IPSET} list "${set_name}" | grep -E '^[0-9]' | while IFS= read -r line; do
local entry timeout
entry=$(echo "${line}" | awk '{print $1}')
timeout=$(echo "${line}" | awk '{print $2}')
if [[ "${timeout}" == "0" ]]; then
echo " ${entry} [permanente]"
else
echo " ${entry} [${timeout}s]"
fi
done
local total
total=$(${IPSET} list "${set_name}" | grep -cE '^[0-9]' || true)
echo "Total: ${total} entradas"
echo
}
#=============================================================================
# Salvar ipsets a archivo (para persistencia en boot)
#=============================================================================
ipset_save() {
local output="${1:-${BACKUP_DIR}/ipsets.backup}"
mkdir -p "${BACKUP_DIR}"
log_info "Guardando ipsets en: ${output}"
if ${IPSET} save > "${output}" 2>/dev/null; then
log_info "Ipsets guardados exitosamente ($(wc -c < "${output}") bytes)"
return 0
else
log_error "Fallo al guardar ipsets"
return 1
fi
}
#=============================================================================
# Restaurar ipsets desde archivo
#=============================================================================
ipset_restore() {
local input="${1:-${BACKUP_DIR}/ipsets.backup}"
if [[ ! -f "${input}" ]]; then
log_error "Archivo de ipsets no encontrado: ${input}"
return 1
fi
log_info "Restaurando ipsets desde: ${input}"
if ${IPSET} restore < "${input}" 2>/dev/null; then
log_info "Ipsets restaurados exitosamente"
return 0
else
log_error "Fallo al restaurar ipsets (puede que algunos sets ya existan)"
return 1
fi
}
|