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

下面是检测和过滤恶意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

第二步:功能说明

  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. 赋予执行权限:

    bash 复制代码
    chmod +x ipshield.sh
  3. 安装依赖工具:

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

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

    bash 复制代码
    sudo ./ipshield.sh

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

bash 复制代码
sudo crontab -e
# 添加:
*/5 * * * * /path/to/ipshield.sh

第四步:增强功能建议

  1. 自动解封功能

    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 {} \;
  2. 可视化报表

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

    bash 复制代码
    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注入探测
  • 高频错误请求攻击
相关推荐
H13469489010 分钟前
文件备份服务器,备份文件内容到服务器有哪些方法?
运维·服务器
野生绿箭侠25 分钟前
Docker 部署 flink1.19.2
运维·docker·容器
ikun·1 小时前
nginx 核心功能
linux·服务器·nginx
鱼嘻1 小时前
数据结构------C语言经典题目(6)
linux·c语言·开发语言·数据结构·算法
星释2 小时前
阿里云服务迁移实战: 06-切换DNS
运维·阿里云·云计算
x-cmd2 小时前
[250430] Kali Linux 存储库密钥丢失导致所有用户无法正常更新 APT
linux·运维·服务器·kali linux
星雨流星天的笔记本3 小时前
3、Linux操作系统下,linux的技术手册使用(man)
linux·服务器
诗雅颂3 小时前
DrissionPage采集京东系列——自动化登录
运维·自动化
pengdott3 小时前
HAproxy+keepalived+tomcat部署高可用负载均衡实践
linux·运维·服务器·tomcat·负载均衡