#!/bin/bash LOG="/var/log/fail2ban_manager.log" # Requiere privilegios de root if [[ $EUID -ne 0 ]]; then echo -e "\e[31m[!] Este script requiere privilegios de root. Reejecutando con sudo...\e[0m" exec sudo "$0" "$@" fi # Colores RED='\e[31m' GREEN='\e[32m' YELLOW='\e[33m' CYAN='\e[36m' NC='\e[0m' function log_accion() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG" } function jail_existe() { fail2ban-client status | grep -q "Jail list" && \ fail2ban-client status | grep -oP "Jail list:\s*\K.+" | tr ',' '\n' | grep -qw "$1" } function listar_jails() { echo -e "${CYAN}Jails activos en Fail2Ban:${NC}" fail2ban-client status | grep "Jail list" | sed 's/^.*: //' } function ver_ips_bloqueadas() { echo -e "${CYAN}Obteniendo IPs bloqueadas en todos los jails activos...${NC}" jails=$(fail2ban-client status | grep "Jail list:" | cut -d: -f2 | tr -d ' ' | tr ',' '\n') for jail in $jails; do echo -e "\n${YELLOW}=== Jail: $jail ===${NC}" fail2ban-client status "$jail" | awk '/Banned IP list:/,/^$/' done } function bloquear_ip() { read -p "Ingrese el nombre del jail (default sshd): " jail jail=${jail:-sshd} read -p "Ingrese la IP a bloquear: " ip if [[ -n "$ip" ]]; then if jail_existe "$jail"; then fail2ban-client set "$jail" banip "$ip" echo -e "${GREEN}IP $ip bloqueada en jail $jail.${NC}" log_accion "Bloqueada IP $ip en jail $jail" else echo -e "${RED}El jail '$jail' no existe o no está activo.${NC}" fi else echo -e "${RED}No se ingresó IP.${NC}" fi } function desbloquear_ip() { read -p "Ingrese el nombre del jail (default sshd): " jail jail=${jail:-sshd} read -p "Ingrese la IP a desbloquear: " ip if [[ -n "$ip" ]]; then if jail_existe "$jail"; then fail2ban-client set "$jail" unbanip "$ip" echo -e "${GREEN}IP $ip desbloqueada en jail $jail.${NC}" log_accion "Desbloqueada IP $ip en jail $jail" else echo -e "${RED}El jail '$jail' no existe o no está activo.${NC}" fi else echo -e "${RED}No se ingresó IP.${NC}" fi } function bloquear_ip_vsftpd() { read -p "Ingrese la IP a bloquear en el jail 'vsftpd': " ip if [[ -n "$ip" ]]; then if jail_existe "vsftpd"; then fail2ban-client set vsftpd banip "$ip" echo -e "${GREEN}IP $ip bloqueada en jail vsftpd.${NC}" log_accion "Bloqueada IP $ip en jail vsftpd" else echo -e "${RED}El jail 'vsftpd' no está activo.${NC}" fi else echo -e "${RED}No se ingresó IP.${NC}" fi } function desbloquear_ip_vsftpd() { read -p "Ingrese la IP a desbloquear en el jail 'vsftpd': " ip if [[ -n "$ip" ]]; then if jail_existe "vsftpd"; then fail2ban-client set vsftpd unbanip "$ip" echo -e "${GREEN}IP $ip desbloqueada en jail vsftpd.${NC}" log_accion "Desbloqueada IP $ip en jail vsftpd" else echo -e "${RED}El jail 'vsftpd' no está activo.${NC}" fi else echo -e "${RED}No se ingresó IP.${NC}" fi } function ver_estado_jail() { read -p "Ingrese el nombre del jail (default sshd): " jail jail=${jail:-sshd} if jail_existe "$jail"; then echo -e "${CYAN}Estado del jail $jail:${NC}" fail2ban-client status "$jail" else echo -e "${RED}El jail '$jail' no existe o no está activo.${NC}" fi } function ver_log_acciones() { echo -e "${CYAN}Historial de acciones:${NC}" if [[ -f "$LOG" ]]; then cat "$LOG" else echo "No hay registros aún." fi } function estadisticas_jails() { echo -e "${CYAN}Estadísticas de jails activos:${NC}" jails=$(fail2ban-client status | grep "Jail list:" | cut -d: -f2 | tr -d ' ' | tr ',' '\n') for jail in $jails; do echo -e "\n${YELLOW}=== Jail: $jail ===${NC}" fail2ban-client status "$jail" | awk '/Currently banned:/ || /Total banned:/ || /Total failed:/' done } function desbloquear_todas_ips() { read -p "Ingrese el nombre del jail: " jail if jail_existe "$jail"; then ips=$(fail2ban-client status "$jail" | awk -F': ' '/Banned IP list:/ {print $2}') for ip in $ips; do fail2ban-client set "$jail" unbanip "$ip" echo -e "${GREEN}IP $ip desbloqueada.${NC}" log_accion "Desbloqueada IP $ip en jail $jail" done else echo -e "${RED}El jail '$jail' no existe o no está activo.${NC}" fi } function reiniciar_fail2ban() { systemctl restart fail2ban echo -e "${GREEN}Fail2Ban reiniciado.${NC}" log_accion "Reinicio de Fail2Ban" } function backup_config() { backup_dir="/home/sjd/fail2ban_$(date +%F_%H-%M-%S)" mkdir -p "$backup_dir" cp -r /etc/fail2ban/* "$backup_dir" echo -e "${GREEN}Configuración respaldada en $backup_dir${NC}" log_accion "Backup de configuración en $backup_dir" } function exportar_ips_bloqueadas() { salida="/home/sjd/ips_bloqueadas_$(date +%F).txt" echo "IPs bloqueadas por Fail2Ban - $(date)" > "$salida" jails=$(fail2ban-client status | grep "Jail list:" | cut -d: -f2 | tr -d ' ' | tr ',' '\n') for jail in $jails; do echo -e "\n=== Jail: $jail ===" >> "$salida" fail2ban-client status "$jail" | awk '/Banned IP list:/,/^$/' >> "$salida" done echo -e "${GREEN}IPs exportadas a $salida${NC}" log_accion "Exportadas IPs bloqueadas a $salida" } function restaurar_backup() { echo -e "${CYAN}Buscando backups en /home/sjd...${NC}" backups=(/home/sjd/fail2ban_*/) if [ ${#backups[@]} -eq 0 ]; then echo -e "${RED}No se encontraron backups.${NC}" return fi echo -e "${YELLOW}Backups disponibles:${NC}" select bkp in "${backups[@]}" "Cancelar"; do if [[ "$bkp" == "Cancelar" ]]; then echo "Cancelado." return elif [[ -d "$bkp" ]]; then read -p "¿Estás seguro que querés restaurar el backup '$bkp'? Esto sobrescribirá /etc/fail2ban [s/N]: " confirm if [[ "$confirm" =~ ^[sS]$ ]]; then cp -r "$bkp"/* /etc/fail2ban/ echo -e "${GREEN}Backup restaurado desde $bkp.${NC}" log_accion "Restaurado backup desde $bkp" reiniciar_fail2ban else echo -e "${YELLOW}Restauración cancelada.${NC}" fi return else echo -e "${RED}Selección inválida.${NC}" fi done } # Menú principal while true; do echo -e "${YELLOW}==== Fail2Ban Manager ====${NC}" echo "1) Listar jails activos" echo "2) Ver IPs bloqueadas" echo "3) Bloquear IP ssh" echo "4) Desbloquear IP ssh" echo "5) Ver estado de un jail" echo "6) Bloquear IP en vsftpd" echo "7) Desbloquear IP en vsftpd" echo "8) Ver historial de acciones" echo "9) Ver estadísticas de los jails" echo "10) Desbloquear todas las IPs de un jail" echo "11) Reiniciar Fail2Ban" echo "12) Backup de configuración de Fail2Ban" echo "13) Exportar IPs bloqueadas a archivo" echo "14) Restaurar configuración desde backup" echo "0) Salir" read -p "Elige una opción: " opcion case $opcion in 1) listar_jails ;; 2) ver_ips_bloqueadas ;; 3) bloquear_ip ;; 4) desbloquear_ip ;; 5) ver_estado_jail ;; 6) bloquear_ip_vsftpd ;; 7) desbloquear_ip_vsftpd ;; 8) ver_log_acciones ;; 9) estadisticas_jails ;; 10) desbloquear_todas_ips ;; 11) reiniciar_fail2ban ;; 12) backup_config ;; 14) restaurar_backup ;; 13) exportar_ips_bloqueadas ;; 0) echo -e "${CYAN}Saliendo...${NC}"; exit 0 ;; *) echo -e "${RED}Opción inválida.${NC}" ;; esac echo done