从实列中学习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
第二步:功能说明
-
多日志分析:
- 支持分析SSH暴力破解(/var/log/auth.log)
- 支持分析Web攻击(/var/log/nginx/access.log)
- 自动识别40x错误请求和敏感路径访问
-
智能防火墙管理:
- 自动检测系统使用的防火墙工具(iptables/firewalld)
- 防止重复添加封锁规则
- 支持IPv4地址和CIDR格式白名单
-
高级特性:
- 基于时间的日志分析(默认检测5分钟内的攻击)
- 频率阈值设置(默认10次触发封锁)
- 邮件报警通知功能
- 自动去重处理
第三步:使用方法
-
保存脚本为
ipshield.sh
-
赋予执行权限:
chmod +x ipshield.sh
-
安装依赖工具:
# CentOS/RHEL sudo yum install ipcalc mailx# Debian/Ubuntu sudo apt-get install ipcalc mailutils
-
配置参数:
- 修改
LOG_FILES
添加需要监控的日志 - 调整
THRESHOLD
和TIME_RANGE
- 设置
WHITELIST
白名单
- 修改
-
测试运行:
sudo ./ipshield.sh
设置定时任务(每5分钟检测一次):
sudo crontab -e
# 添加:
*/5 * * * * /path/to/ipshield.sh
第四步:增强功能建议
-
自动解封功能:
# 在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 {} \;
-
可视化报表:
# 在日志分析后添加: echo "检测统计:" | mail -a /var/log/ipshield.log -s "安全周报" $MAIL_TO
-
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"}' }
第五步:注意事项
- 需要root权限运行
- 首次使用前建议先测试白名单功能
- 生产环境建议将日志文件与监控系统集成
- 重要服务器建议配合fail2ban使用
- 定期检查
/var/log/ipshield.log
查看运行情况
这个脚本可以防御以下类型攻击:
- SSH暴力破解
- HTTP洪水攻击
- 目录扫描
- SQL注入探测
- 高频错误请求攻击