下面是检测和过滤恶意IP攻击的Shell脚本,包含自动分析日志、封锁IP、白名单管理等功能:
第一步:过滤脚本
bash
#!/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="[email protected]" # 报警通知邮箱
# 全局变量
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" ]; then
if systemctl status firewalld &> /dev/null; then
echo "firewalld"
elif which iptables &> /dev/null; then
echo "iptables"
else
log "错误:未找到可用的防火墙工具"
exit 1
fi
else
echo $FIREWALL_TOOL
fi
}
# 防火墙管理函数
block_ip() {
local ip=$1
local fw_tool=$(detect_firewall)
# 检查是否已存在封锁规则
case $fw_tool in
"iptables")
if ! iptables -nL | grep -q $ip; then
iptables -A INPUT -s $ip -j DROP
log "已通过iptables封锁IP: $ip"
fi
;;
"firewalld")
if ! firewall-cmd --list-rich-rules | grep -q $ip; then
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' reject"
firewall-cmd --reload
log "已通过firewalld封锁IP: $ip"
fi
;;
esac
}
# 分析SSH暴力破解
analyze_ssh() {
log "正在分析SSH日志..."
local logfile=$1
local 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; do
if [ $count -ge $THRESHOLD ]; then
BAD_IPS+=($ip)
fi
done
}
# 分析HTTP攻击
analyze_http() {
log "正在分析HTTP访问日志..."
local logfile=$1
local 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; do
if [ $count -ge $thr ]; then
BAD_IPS+=($ip)
fi
done
}
# 主检测函数
detect_malicious_ips() {
for logfile in "${LOG_FILES[@]}"; do
[ ! -f $logfile ] && continue
case $logfile in
*auth.log*) analyze_ssh $logfile ;;
*access.log*) analyze_http $logfile ;;
esac
done
# 去重处理
BAD_IPS=($(printf "%s\n" "${BAD_IPS[@]}" | sort -u))
}
# 白名单过滤
filter_whitelist() {
for ip in "${BAD_IPS[@]}"; do
local is_whitelisted=0
for white_ip in "${WHITELIST[@]}"; do
if ipcalc -n "$white_ip" | grep -q "$ip"; then
is_whitelisted=1
break
fi
done
[ $is_whitelisted -eq 0 ] && CURRENT_IPS+=($ip)
done
}
# 发送邮件通知
send_alert() {
[ -z "$MAIL_TO" ] && return
local subject="[安全警报] 检测到恶意IP攻击"
local body="已封锁以下恶意IP:\n${CURRENT_IPS[@]}\n\n详细信息请查看系统日志"
echo -e $body | mail -s "$subject" $MAIL_TO
}
# 主程序
main() {
log "====== 开始恶意IP检测 ======"
detect_malicious_ips
filter_whitelist
if [ ${#CURRENT_IPS[@]} -gt 0 ]; then
log "检测到可疑IP:${CURRENT_IPS[*]}"
for ip in "${CURRENT_IPS[@]}"; do
block_ip $ip
done
send_alert
else
log "未发现可疑IP"
fi
log "====== 检测完成 ======"
}
# 执行主程序
main
第二步:功能说明
-
多日志分析:
- 支持分析SSH暴力破解(/var/log/auth.log)
- 支持分析Web攻击(/var/log/nginx/access.log)
- 自动识别40x错误请求和敏感路径访问
-
智能防火墙管理:
- 自动检测系统使用的防火墙工具(iptables/firewalld)
- 防止重复添加封锁规则
- 支持IPv4地址和CIDR格式白名单
-
高级特性:
- 基于时间的日志分析(默认检测5分钟内的攻击)
- 频率阈值设置(默认10次触发封锁)
- 邮件报警通知功能
- 自动去重处理
第三步:使用方法
-
保存脚本为
ipshield.sh
-
赋予执行权限:
bashchmod +x ipshield.sh
-
安装依赖工具:
bash# CentOS/RHEL sudo yum install ipcalc mailx # Debian/Ubuntu sudo apt-get install ipcalc mailutils
-
配置参数:
- 修改
LOG_FILES
添加需要监控的日志 - 调整
THRESHOLD
和TIME_RANGE
- 设置
WHITELIST
白名单
- 修改
-
测试运行:
bashsudo ./ipshield.sh
设置定时任务(每5分钟检测一次):
bash
sudo crontab -e
# 添加:
*/5 * * * * /path/to/ipshield.sh
第四步:增强功能建议
-
自动解封功能:
bash# 在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 {} \;
-
可视化报表:
bash# 在日志分析后添加: echo "检测统计:" | mail -a /var/log/ipshield.log -s "安全周报" $MAIL_TO
-
Cloudflare API集成(需要jq工具):
bashblock_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注入探测
- 高频错误请求攻击