当前位置: 首页 > java >正文

从实列中学习linux shell6: 写一个 shell 脚本 过滤 恶意ip 攻击

下面是检测和过滤恶意IP攻击的Shell脚本,包含自动分析日志、封锁IP、白名单管理等功能:

第一步:过滤脚本

#!/bin/bash# 配置区域(根据需求修改)
LOG_FILES=(/var/log/auth.log /var/log/nginx/access.log)  # 监控的日志文件
THRESHOLD=10              # 触发封锁的请求阈值
TIME_RANGE=300           # 统计时间范围(秒)
WHITELIST=(127.0.0.1 192.168.1.0/24) # IP白名单
FIREWALL_TOOL="auto"     # 防火墙工具 auto/iptables/firewalld
BAN_TIME="86400"         # 封锁时间(秒)86400=24小时
MAIL_TO="admin@example.com" # 报警通知邮箱# 全局变量
BAD_IPS=()
CURRENT_IPS=()
TMP_DIR="/tmp/ipshield"
mkdir -p $TMP_DIR# 日志函数
log() {echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" | tee -a /var/log/ipshield.log
}# 获取系统防火墙工具
detect_firewall() {if [ "$FIREWALL_TOOL" = "auto" ]; thenif systemctl status firewalld &> /dev/null; thenecho "firewalld"elif which iptables &> /dev/null; thenecho "iptables"elselog "错误:未找到可用的防火墙工具"exit 1fielseecho $FIREWALL_TOOLfi
}# 防火墙管理函数
block_ip() {local ip=$1local fw_tool=$(detect_firewall)# 检查是否已存在封锁规则case $fw_tool in"iptables")if ! iptables -nL | grep -q $ip; theniptables -A INPUT -s $ip -j DROPlog "已通过iptables封锁IP: $ip"fi;;"firewalld")if ! firewall-cmd --list-rich-rules | grep -q $ip; thenfirewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' reject"firewall-cmd --reloadlog "已通过firewalld封锁IP: $ip"fi;;esac
}# 分析SSH暴力破解
analyze_ssh() {log "正在分析SSH日志..."local logfile=$1local cutoff_time=$(date -d "-${TIME_RANGE} seconds" +"%Y-%m-%d %H:%M:%S")grep "Failed password" $logfile | awk -v ct="$cutoff_time" '$1" "$2 >= ct {for(i=1;i<=NF;i++){if($i=="from") {print $(i+1); break}}}' | tr -d '()' | sort | uniq -c | while read count ip; doif [ $count -ge $THRESHOLD ]; thenBAD_IPS+=($ip)fidone
}# 分析HTTP攻击
analyze_http() {log "正在分析HTTP访问日志..."local logfile=$1local cutoff_time=$(date -d "-${TIME_RANGE} seconds" +"%d/%b/%Y:%H:%M")awk -v ct="$cutoff_time" -v thr=$THRESHOLD '$4 >= "["ct {if($9 ~ /40[0-9]/ || $7 ~ /(wp-login|admin|sql)/) {print $1}}' $logfile | sort | uniq -c | while read count ip; doif [ $count -ge $thr ]; thenBAD_IPS+=($ip)fidone
}# 主检测函数
detect_malicious_ips() {for logfile in "${LOG_FILES[@]}"; do[ ! -f $logfile ] && continuecase $logfile in*auth.log*) analyze_ssh $logfile ;;*access.log*) analyze_http $logfile ;;esacdone# 去重处理BAD_IPS=($(printf "%s\n" "${BAD_IPS[@]}" | sort -u))
}# 白名单过滤
filter_whitelist() {for ip in "${BAD_IPS[@]}"; dolocal is_whitelisted=0for white_ip in "${WHITELIST[@]}"; doif ipcalc -n "$white_ip" | grep -q "$ip"; thenis_whitelisted=1breakfidone[ $is_whitelisted -eq 0 ] && CURRENT_IPS+=($ip)done
}# 发送邮件通知
send_alert() {[ -z "$MAIL_TO" ] && returnlocal subject="[安全警报] 检测到恶意IP攻击"local body="已封锁以下恶意IP:\n${CURRENT_IPS[@]}\n\n详细信息请查看系统日志"echo -e $body | mail -s "$subject" $MAIL_TO
}# 主程序
main() {log "====== 开始恶意IP检测 ======"detect_malicious_ipsfilter_whitelistif [ ${#CURRENT_IPS[@]} -gt 0 ]; thenlog "检测到可疑IP:${CURRENT_IPS[*]}"for ip in "${CURRENT_IPS[@]}"; doblock_ip $ipdonesend_alertelselog "未发现可疑IP"filog "====== 检测完成 ======"
}# 执行主程序
main

第二步:功能说明

  1. 多日志分析

    • 支持分析SSH暴力破解(/var/log/auth.log)
    • 支持分析Web攻击(/var/log/nginx/access.log)
    • 自动识别40x错误请求和敏感路径访问
  2. 智能防火墙管理

    • 自动检测系统使用的防火墙工具(iptables/firewalld)
    • 防止重复添加封锁规则
    • 支持IPv4地址和CIDR格式白名单
  3. 高级特性

    • 基于时间的日志分析(默认检测5分钟内的攻击)
    • 频率阈值设置(默认10次触发封锁)
    • 邮件报警通知功能
    • 自动去重处理

第三步:使用方法

  1. 保存脚本为ipshield.sh

  2. 赋予执行权限:

    chmod +x ipshield.sh
    
  3. 安装依赖工具:

    # CentOS/RHEL
    sudo yum install ipcalc mailx# Debian/Ubuntu
    sudo apt-get install ipcalc mailutils
    
  4. 配置参数:

    • 修改LOG_FILES添加需要监控的日志
    • 调整THRESHOLDTIME_RANGE
    • 设置WHITELIST白名单
  5. 测试运行:

    sudo ./ipshield.sh
    

设置定时任务(每5分钟检测一次):

sudo crontab -e
# 添加:
*/5 * * * * /path/to/ipshield.sh

第四步:增强功能建议

  1. 自动解封功能

    # 在block_ip函数中添加:
    echo "$(date +%s) $ip" >> $TMP_DIR/banned_ips.log# 添加定时清理任务:
    find $TMP_DIR/banned_ips.log -type f -mtime +$((BAN_TIME/86400)) -exec rm {} \;
    
  2. 可视化报表

    # 在日志分析后添加:
    echo "检测统计:" | mail -a /var/log/ipshield.log -s "安全周报" $MAIL_TO
    
  3. Cloudflare API集成(需要jq工具):

    block_ip() {# 原有防火墙代码...curl -X POST "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/firewall/access_rules/rules" \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \--data '{"mode":"block","configuration":{"target":"ip","value":"'$ip'"},"notes":"Blocked by IPSHIELD"}'
    }
    

第五步:注意事项

  1. 需要root权限运行
  2. 首次使用前建议先测试白名单功能
  3. 生产环境建议将日志文件与监控系统集成
  4. 重要服务器建议配合fail2ban使用
  5. 定期检查/var/log/ipshield.log查看运行情况

这个脚本可以防御以下类型攻击:

  • SSH暴力破解
  • HTTP洪水攻击
  • 目录扫描
  • SQL注入探测
  • 高频错误请求攻击
http://www.xdnf.cn/news/3191.html

相关文章:

  • css 数字从0开始增加的动画效果
  • 【数学建模国奖速成系列】优秀论文绘图复现代码(二)
  • DeepSeek V1:初代模型的架构与性能
  • 艺术与科技的双向奔赴——高一鑫荣获加州联合表彰
  • Java ResourceBundle 资源绑定详解
  • 腾讯元宝桌面客户端:基于Tauri的开源技术解析
  • Python GIL 与 pybind11 GIL管理机制
  • 模拟flexible.js 前端开发中的大屏布局方案
  • Hadoop虚拟机中配置hosts
  • 评价类模型数据预处理(定量指标值的无量纲化处理)
  • 从零构建 MCP Server 与 Client:打造你的第一个 AI 工具集成应用
  • 如何禁止AutoCAD这类软件联网
  • Go语言的发展历史 -《Go语言实战指南》
  • Copilot:您的AI伴侣-微软50周年系列更新
  • 《Java高级编程:从原理到实战 - 进阶知识篇一》
  • 【阿里云大模型高级工程师ACP学习笔记】2.7 通过微调增强模型能力 (下篇)(⭐️⭐️⭐️ 重点章节!!!)
  • C#学习第20天:垃圾回收
  • C#规避内存泄漏的编码方法
  • ZStack Cloud 5.3.28正式发布
  • 【蓝桥杯省赛真题59】Scratch收集松果 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
  • 跨境电商生死劫:IP筛查三法则破解封号魔咒
  • 编译原理实验二:构建TINY语言的词法分析器
  • 【数据链路层】网络通信的“桥梁建设者”
  • 在Carla中构建自动驾驶:使用PID控制和ROS2进行路径跟踪
  • WPF性能优化举例
  • python中库pydantic的作用和基本用法
  • 《ESP32音频开发实战:I2S协议解析与WAV音频录制/播放全指南》
  • 90.如何将Maui应用安装到手机(最简) C#例子 Maui例子
  • 西门子PLC S7-1200电动机软启动、软停止的控制实例
  • Android 移动开发:ProgressBar(转圈进度条)