Shell实战:生产可用Web恶意IP自动检测脚本

发布时间:2026/7/10 20:19:34

Shell实战:生产可用Web恶意IP自动检测脚本 Shell实战生产可用Web恶意IP自动检测脚本 前言 运维痛点网站突然卡顿、CPU 100%多半是 CC/DOS 恶意IP高频访问。人工手动翻日志统计IP效率极低攻击爆发后几小时才能发现极易造成网站宕机。本文提供一套直接上线生产、零第三方依赖的Shell巡检脚本融合文本三剑客awk/sort/uniq、if条件判断、命令替换、日志持久化、邮件告警全套语法。全程零基础友好复制粘贴跟着操作即可部署完成。✅ 脚本完整实现能力 自动解析 Nginx/Apache 标准access.log提取所有客户端访问IP 自动统计单IP当日访问总量自动抓取访问频次最高IP 自定义攻击阈值默认单IP访问超10000次判定恶意攻击 攻击触发双留存本地永久告警日志 自动发送邮件通知管理员 配合crontab定时巡检实现7×24小时无人值守安全监控 兼容 CentOS7 / Rocky Linux / RHEL 主流服务器系统⚠️ 前置环境准备必看缺少任意一项脚本无法告警服务器提前部署mailx sendmail邮件服务网站存在标准访问日志access.logNginx默认路径/var/log/nginx/access.log服务器外网可正常发送邮件防火墙放行465 SMTP端口基础操作vim编辑文件、脚本赋权、crontab定时任务基础认知一、核心前置知识点速学1.1 日志统计流水线核心命令执行流程文字图示纯文本全平台兼容读取access.log日志 → awk提取第一列IP → sort -n IP排序 → uniq -c 统计每个IP访问次数 → sort -rn 按访问次数倒序 → head -1 取出访问最高IP完整流水线代码awk{print $1}/var/log/nginx/access.log|sort-n|uniq-c|sort-rn|head-1逐段功能拆解awk {print $1} access.log提取日志第一列客户端IPsort -nIP数字排序重点uniq统计前必须排序否则统计失效uniq -c统计重复IP访问次数输出格式访问次数 IP地址sort -rn按访问次数从高到低倒序攻击IP排在最上方head -1仅保留访问量最高一行数据1.2 命令替换变量语法核心语法变量名$(命令)将命令输出结果存入变量脚本3个核心变量# 获取本机服务器主机名server_name$(cat/etc/hostname)# 抓取最高访问次数uniq输出第一列$1max_conn$(awk流水线|awk{print $1})# 抓取攻击IP地址uniq输出第二列$2attack_ip$(awk流水线|awk{print $2})1.3 阈值判断规则使用整数比较参数-gt大于判断逻辑if [ 最高访问次数 -gt 阈值 ] → 判定恶意攻击触发邮件告警小型站点推荐阈值5000中型站点默认阈值10000高并发业务阈值300001.4 配套工具功能速查表命令作用脚本用途date %y年%m月%d日%H时%M分%S秒生成中文时间戳告警日志记录攻击发生时间追加写入文件永久保存告警记录不覆盖历史日志mail -s 标题 邮箱发送系统邮件攻击时推送告警给管理员二、完整生产可用脚本anti_dos_ip.sh 脚本说明所有可修改配置统一放在顶部零基础无需改动下方逻辑代码直接修改顶部变量即可适配自己服务器。#!/bin/bash# # 脚本名称anti_dos_ip.sh# 功能自动检测Web访问日志恶意高频IP超阈值日志记录邮件告警# 适用系统CentOS / Rocky Linux# 编写时间2026-07-09# ########################### 【可自定义配置区域】############################ 网站访问日志路径Nginx/Apache按需修改LOG_PATH/var/log/nginx/access.log# 告警日志持久化保存路径WARN_LOG/shell/log/anti-dos.log# 攻击访问阈值超过该数值判定恶意IPLIMIT_NUM10000# 管理员接收告警邮箱ADMIN_MAILadmin189.cn########################################################################### 1. 自动创建日志目录不存在则新建避免写入报错mkdir-p/shell/log/# 2. 捕获基础信息存入变量now_time$(date%y年%m月%d日%H时%M分%S秒)# 中文时间戳server_name$(cat/etc/hostname)# 服务器主机名# 3. 日志统计流水线提取IP、统计次数、取最高访问IPip_stat$(awk{print $1}${LOG_PATH}|sort-n|uniq-c|sort-rn|head-1)# 拆分访问次数、攻击IP为独立变量max_conn$(echo${ip_stat}|awk{print $1})attack_ip$(echo${ip_stat}|awk{print $2})# 4. 阈值条件判断逻辑if[${max_conn}-gt${LIMIT_NUM}];then# 组装完整告警文本warn_info【攻击告警】服务器${server_name}| 时间${now_time}| 恶意IP${attack_ip}| 当日访问次数${max_conn}单IP访问超过阈值${LIMIT_NUM}疑似DOS/CC攻击# 写入本地告警日志echo${warn_info}${WARN_LOG}# 终端打印告警手动执行时直观查看echo${warn_info}# 发送告警邮件通知管理员echo${warn_info}|mail-s【紧急】服务器遭遇高频IP攻击告警${ADMIN_MAIL}else# 无攻击时记录正常巡检日志不需要可删除本段echo【正常巡检】${now_time}服务器${server_name}无异常IP最高访问IP${attack_ip}访问次数${max_conn}${WARN_LOG}fi2.1 分模块代码图示讲解纯文字标注替代图片图示模块① 头部自定义配置区作用#!/bin/bash指定Bash解释器脚本运行必备头部标识全部可变参数集中放置新手只需要修改这一块不用改动业务逻辑修改示例Apache日志只需替换LOG_PATH/var/log/httpd/access_log模块② 自动创建日志目录mkdir-p/shell/log/✅ 运行效果目录不存在自动创建已存在不会抛出报错防止日志写入失败。模块③ 基础信息变量捕获now_time$(date%y年%m月%d日%H时%M分%S秒)server_name$(cat/etc/hostname)输出示例now_time26年07月09日16时22分30秒多服务器集群场景通过主机名快速区分哪台机器发生攻击。模块④ 核心IP统计流水线ip_stat$(awk{print $1}${LOG_PATH}|sort-n|uniq-c|sort-rn|head-1)max_conn$(echo${ip_stat}|awk{print $1})attack_ip$(echo${ip_stat}|awk{print $2})执行前后对比执行前access.log 成千上百行杂乱访问日志执行后输出示例12650 110.23.45.67拆分结果max_conn12650访问次数attack_ip110.23.45.67攻击IP模块⑤ if阈值判断告警逻辑if[${max_conn}-gt${LIMIT_NUM}];then# 告警逻辑else# 正常巡检记录fi⚠️ 重点避坑[ ]括号左右内侧必须保留空格少空格直接脚本报错追加写入日志历史告警永久保存用于事后溯源邮件标题带【紧急】标识管理员可第一时间识别高危告警。三、零基础完整部署步骤分步图标注新手跟着复制步骤1创建脚本文件 打开服务器终端执行命令创建脚本vimanti_dos_ip.sh粘贴完整脚本代码按ESC输入:wq保存退出。步骤2赋予脚本执行权限 Linux新建文本默认无执行权限直接运行会报Permission deniedchmodx anti_dos_ip.sh步骤3手动测试脚本验证功能 ./anti_dos_ip.sh两种运行结果区分 正常无攻击终端无告警输出日志文件写入正常巡检记录 存在恶意IP终端打印告警文本本地日志留存记录管理员邮箱收到告警邮件。步骤4查看历史告警日志 cat/shell/log/anti-dos.log可查看全部巡检、攻击记录攻击事件溯源必备。步骤5配置定时任务生产自动巡检 ⏰手动执行仅用于测试生产环境配置定时任务每小时自动巡检一次编辑定时任务列表crontab-e写入定时规则每小时整点执行0* * * * /shell/anti_dos_ip.sh查看已配置定时任务crontab-l定时格式说明分 时 日 月 周0 * * * * 每小时0分自动运行脚本四、生产环境避坑指南❌ 高频踩坑点解决方案日志路径错误无法统计IP解决核对Nginx/Apache真实日志路径修改脚本顶部LOG_PATH变量收不到告警邮件解决提前部署mailxsendmail邮箱开启POP3/SMTP并获取授权码防火墙放行465端口脚本执行报括号语法错误解决[ 变量 -gt 数值 ]括号内侧左右必须留空格无空格直接崩溃定时任务不自动执行解决脚本使用绝对路径提前执行chmod x授权定时任务缺少终端环境变量告警日志持续膨胀占满磁盘增加日志自动清理代码放在脚本最底部# 自动删除30天前告警日志find/shell/log-nameanti-dos.log-mtime30-delete五、脚本生产升级拓展方案 二次开发扩展功能按需添加自动防火墙拉黑恶意IP识别攻击IP后通过firewalld/iptables永久封禁IP阻断流量多渠道告警新增钉钉/企业微信机器人推送不局限邮件通知告警防抖1小时内同一IP重复攻击仅推送1次邮件避免消息轰炸日志按日期分割每日生成独立告警日志防止单文件过大服务联动监控搭配netstat检测Nginx服务服务宕机同步推送故障告警。六、全文总结本案例是一套轻量化、零成本、开箱即用的服务器安全自动化脚本无复杂第三方组件零基础运维、后端开发、在校学生均可快速部署落地。脚本整合文本三剑客、变量、条件判断、输出重定向、邮件告警、定时任务全套Shell核心知识点全部落地真实生产安全场景。学会后可直接复用在服务器巡检工作中替代人工手动分析日志提前拦截CC/DOS攻击大幅降低网站宕机风险。

相关新闻