#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_fail2ban.sh
# 功能描述: 自动化巡检 Fail2Ban 防御状态与拦截统计 (纯只读)
# 使用方式: 在运行 Fail2Ban 的宿主机以 root 权限执行
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} Fail2Ban 自动防御系统状态巡检与统计 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 检查服务存活状态
if ! command -v fail2ban-client &>/dev/null; then
echo -e "${RED}[ERROR] 当前系统未安装 Fail2Ban。${PLAIN}"
exit 1
fi
F2B_STATUS=$(systemctl is-active fail2ban 2>/dev/null)
if [ "$F2B_STATUS" == "active" ]; then
echo -e "${YELLOW}[1/3] 服务状态: ${GREEN}[运行中]${PLAIN}"
else
echo -e "${YELLOW}[1/3] 服务状态: ${RED}[未运行] ($F2B_STATUS)${PLAIN}"
exit 1
fi
# 2. 提取配置的 Jail 列表
JAILS=$(fail2ban-client status | grep "Jail list:" | sed -e 's/.*Jail list://' -e 's/,//g')
if [ -z "$JAILS" ]; then
echo -e "${YELLOW}[INFO] 当前未启用任何监控策略 (Jail)。${PLAIN}"
exit 0
fi
echo -e "\n${YELLOW}[2/3] 当前生效的防御策略 (Jails):${PLAIN}"
for jail in $JAILS; do
echo -e " -> ${GREEN}${jail}${PLAIN}"
done
# 3. 统计拦截数据与被封禁 IP 列表
echo -e "\n${YELLOW}[3/3] 防御拦截数据统计明细:${PLAIN}"
TOTAL_BANNED=0
for jail in $JAILS; do
STATUS_OUT=$(fail2ban-client status "$jail")
# 提取关键数据
CURRENT_BANNED=$(echo "$STATUS_OUT" | grep "Currently banned:" | awk '{print $4}')
TOTAL_JAIL_BANNED=$(echo "$STATUS_OUT" | grep "Total banned:" | awk '{print $4}')
BANNED_IPS=$(echo "$STATUS_OUT" | grep "Banned IP list:" | sed -e 's/.*Banned IP list://')
echo -e "${BLUE}----------------------------------------------------------------${PLAIN}"
echo -e " 策略名称 : ${GREEN}$jail${PLAIN}"
echo -e " 当前被封禁 IP 数 : ${RED}${CURRENT_BANNED}${PLAIN}"
echo -e " 历史累计封禁次数 : ${YELLOW}${TOTAL_JAIL_BANNED}${PLAIN}"
if [ "$CURRENT_BANNED" -gt 0 ]; then
echo -e " 当前封禁 IP 列表 :\n ${BANNED_IPS}"
fi
TOTAL_BANNED=$((TOTAL_BANNED + CURRENT_BANNED))
done
echo -e "${BLUE}----------------------------------------------------------------${PLAIN}"
if [ "$TOTAL_BANNED" -gt 0 ]; then
echo -e "${RED}[提示] 当前共有 ${TOTAL_BANNED} 个 IP 处于封禁状态。${PLAIN}"
echo -e "若需手动解除误封,请执行: ${YELLOW}fail2ban-client set <策略名称> unbanip <IP>${PLAIN}"
else
echo -e "${GREEN}[OK] 当前暂无处于封禁状态的异常 IP。${PLAIN}"
fi
echo -e "${BLUE}================================================================${PLAIN}"