# 1. 检查并解封超过指定时间的IP echo"检查需要解封的IP..." for blocked_ip in"$BLOCKED_IPS_DIR"/*; do # 提取IP地址 ip=$(basename"$blocked_ip") # 检查文件是否存在且是常规文件 if [ -f "$blocked_ip" ]; then # 获取封锁时间(文件创建时间) block_time=$(stat -c %Y "$blocked_ip") current_time=$(date +%s) time_diff=$(( (current_time - block_time) / 3600 )) # 转换为小时 # 检查是否超过解封时间 if [ $time_diff -ge $UNBAN_HOURS ]; then # 从iptables中删除规则 iptables -D INPUT -p tcp --dport 22 -s "$ip" -j DROP 2>/dev/null # 删除记录文件 rm -f "$blocked_ip" echo"已自动解封IP: $ip(超过$UNBAN_HOURS小时无活动)" fi fi done
# 2. 检测并封锁新的恶意IP echo"检测新的恶意IP..." # 从日志中提取失败次数达到阈值的IP IP=$(awk '/Failed password/ {IP[$(NF-3)]++} END { for (k in IP) { if (IP[k]>='$BLOCK_THRESHOLD') print k }}'"$LOG_FILE")
for ip in$IP; do # 检查IP是否已在DROP规则中 if ! iptables -L INPUT -n | grep -q "DROP.*tcp dpt:22.*$ip"; then # 添加封锁规则 iptables -I INPUT -p tcp --dport 22 -s "$ip" -j DROP # 创建/更新封锁记录文件(文件修改时间将用于判断解封) touch"$BLOCKED_IPS_DIR/$ip" echo"已封锁IP: $ip(失败次数超过$BLOCK_THRESHOLD次)" else # 如果IP已被封锁,更新记录文件时间(表示该IP仍在尝试) touch"$BLOCKED_IPS_DIR/$ip" fi done
# 3. 确保iptables-persistent已安装 if ! dpkg -s iptables-persistent &> /dev/null; then echo"安装iptables-persistent..." apt-get update &>/dev/null apt-get -y install iptables-persistent &>/dev/null fi
# 4. 保存规则 netfilter-persistent save &>/dev/null netfilter-persistent reload &>/dev/null
# 1. 检查并解封超过指定时间的IP echo"检查需要解封的IP..." for blocked_ip in"$BLOCKED_IPS_DIR"/*; do ip=$(basename"$blocked_ip") if [ -f "$blocked_ip" ]; then block_time=$(stat -c %Y "$blocked_ip") current_time=$(date +%s) time_diff=$(( (current_time - block_time) / 3600 )) if [ $time_diff -ge $UNBAN_HOURS ]; then iptables -D INPUT -p tcp --dport 22 -s "$ip" -j DROP 2>/dev/null rm -f "$blocked_ip" echo"已自动解封IP: $ip(超过$UNBAN_HOURS小时无活动)" fi fi done
# 2. 检测并封锁新的恶意IP echo"检测新的恶意IP..." IP=$(awk '/Failed password/ {IP[$(NF-3)]++} END { for (k in IP) { if (IP[k]>='$BLOCK_THRESHOLD') print k }}'"$LOG_FILE")
for ip in$IP; do # 检查IP是否在白名单中 ifecho"$WHITELIST_IPS" | grep -qw "$ip"; then echo"IP $ip 在白名单中,跳过封锁" continue# 跳过白名单IP,不执行后续封锁操作 fi
# 检查IP是否已在DROP规则中 if ! iptables -L INPUT -n | grep -q "DROP.*tcp dpt:22.*$ip"; then iptables -I INPUT -p tcp --dport 22 -s "$ip" -j DROP touch"$BLOCKED_IPS_DIR/$ip" echo"已封锁IP: $ip(失败次数超过$BLOCK_THRESHOLD次)" else touch"$BLOCKED_IPS_DIR/$ip" fi done
# 3. 确保iptables-persistent已安装 if ! dpkg -s iptables-persistent &> /dev/null; then echo"安装iptables-persistent..." apt-get update &>/dev/null apt-get -y install iptables-persistent &>/dev/null fi
# 4. 保存规则 netfilter-persistent save &>/dev/null netfilter-persistent reload &>/dev/null