服务器深夜告警?可能是攻击前兆!
凌晨三点,刺耳的告警铃声把你从梦中惊醒:服务器CPU 100%,内存耗尽!你手忙脚乱地登录服务器,发现某个进程疯狂占用资源。是程序Bug?还是业务突增?排查半天,最后在角落的日志里发现蛛丝马迹——你的服务器正在遭受攻击!这种资源被“悄悄”耗尽的攻击,往往比直接的流量洪峰更难察觉,危害却同样巨大。本文将深入探讨这类资源消耗型攻击的原理,并提供一个实用的监控脚本,助你早发现、早处置。
一、资源消耗型攻击:服务器“慢性中毒”
这类攻击的核心不是瞬间打垮网络带宽,而是通过持续消耗服务器关键资源(CPU、内存、进程数、磁盘IO、数据库连接),导致服务逐渐不可用。常见类型:
-
进程/连接耗尽攻击:
- 原理: 攻击者快速建立大量TCP连接(如HTTP半连接、数据库连接)或启动大量进程/线程,但不完成正常交互,使服务器达到最大连接/进程限制,拒绝为真实用户服务。
- 现象:
netstat
显示大量SYN_RECV
,ESTABLISHED
(但无数据传输),TIME_WAIT
状态连接;ps
/top
显示进程数激增;应用报“Too many open files”或“Connection pool exhausted”错误。 - 隐蔽性: 初期资源消耗缓慢上升,易与正常业务增长混淆;攻击停止后残留的连接/进程需要时间释放,影响持续。
-
CPU/内存耗尽型攻击:
- 原理:
- 恶意计算: 利用服务器执行高复杂度运算(如故意构造消耗CPU的加密/解密、正则匹配)。
- 内存泄漏诱导: 通过特定请求触发应用程序的内存泄漏Bug。
- 文件描述符耗尽: 大量打开文件但不关闭,间接导致内存耗尽或新连接失败。
- 现象:
top
/htop
显示某个用户或进程持续高占CPU/MEM;系统Load Average
飙升;free
显示可用内存持续减少直至OOM Killer触发。 - 隐蔽性: 单个请求消耗可能不大,但海量请求累加效果显著;内存泄漏初期不易察觉。
- 原理:
-
磁盘IO型攻击:
- 原理: 疯狂写入日志文件、临时文件,或进行大量小文件读写,耗尽磁盘IOPS或空间。
- 现象:
iostat
显示磁盘利用率持续100%;df
显示磁盘空间骤减;应用报“No space left on device”。 - 隐蔽性: 磁盘写操作相对CPU/内存消耗更不易被实时监控注意到,直到空间告警或IO阻塞。
二、实战:Bash脚本监控关键资源指标,触发预警
被动等待告警太迟。以下Bash脚本定期检查关键资源指标(CPU Load, 内存使用率, TCP连接数, 进程数),在超过设定阈值时发出告警(示例为打印到屏幕和syslog,可集成邮件/微信告警)。
#!/bin/bash
# resource_monitor.sh - 关键服务器资源消耗监控告警脚本# 配置告警阈值 (根据服务器配置调整)
LOAD_THRESHOLD=5.0 # 15分钟平均负载告警阈值
MEM_PERCENT_THRESHOLD=90 # 内存使用率百分比告警阈值
TCP_CONN_THRESHOLD=3000 # ESTABLISHED状态TCP连接数告警阈值
PROCESS_THRESHOLD=1000 # 总进程数告警阈值# 获取当前时间戳
TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S")# 1. 获取15分钟平均负载
LOAD_15=$(uptime | awk -F 'load average: ' '{print $2}' | awk -F, '{print $3}' | tr -d ' ')
# 转换为浮点数比较
LOAD_15_FLOAT=$(echo "$LOAD_15" | bc -l)# 2. 获取内存使用率百分比 (使用free命令)
MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
# 计算使用率百分比 (保留整数)
MEM_PERCENT=$(( (MEM_USED * 100) / MEM_TOTAL ))# 3. 获取ESTABLISHED状态TCP连接数 (更关注活动连接)
TCP_ESTABLISHED=$(ss -ant | grep 'ESTAB' | wc -l)# 4. 获取总进程数
PROCESS_COUNT=$(ps -e --no-headers | wc -l)# 初始化告警信息变量
ALARM_MESSAGE=""# 检查阈值并构建告警信息
if (( $(echo "$LOAD_15_FLOAT > $LOAD_THRESHOLD" | bc -l) )); thenALARM_MESSAGE+="[高负载] 15分钟负载: $LOAD_15 (阈值: $LOAD_THRESHOLD)\n"
fiif [ "$MEM_PERCENT" -gt "$MEM_PERCENT_THRESHOLD" ]; thenALARM_MESSAGE+="[高内存] 内存使用率: ${MEM_PERCENT}% (阈值: ${MEM_PERCENT_THRESHOLD}%)\n"
fiif [ "$TCP_ESTABLISHED" -gt "$TCP_CONN_THRESHOLD" ]; thenALARM_MESSAGE+="[高连接] ESTABLISHED连接数: $TCP_ESTABLISHED (阈值: $TCP_CONN_THRESHOLD)\n"
fiif [ "$PROCESS_COUNT" -gt "$PROCESS_THRESHOLD" ]; thenALARM_MESSAGE+="[高进程] 总进程数: $PROCESS_COUNT (阈值: $PROCESS_THRESHOLD)\n"
fi# 如果有告警,则输出并记录到syslog
if [ -n "$ALARM_MESSAGE" ]; thenecho -e "=== 资源告警 ($TIMESTAMP) ===\n$ALARM_MESSAGE"logger -t "ResourceMonitor" -p local0.warning "$(echo -e "资源告警:\n$ALARM_MESSAGE")"
fi# 可选:定期输出到控制台或日志文件查看
echo "[$TIMESTAMP] Load15: $LOAD_15, Mem%: ${MEM_PERCENT}%, Conn: $TCP_ESTABLISHED, Procs: $PROCESS_COUNT" >> /var/log/resource_monitor.log
使用说明:
- 将脚本保存为
resource_monitor.sh
。 - 赋予执行权限:
chmod +x resource_monitor.sh
。 - 修改脚本开头的阈值 (
LOAD_THRESHOLD
,MEM_PERCENT_THRESHOLD
,TCP_CONN_THRESHOLD
,PROCESS_THRESHOLD
) 以适应你的服务器规格。 - 使用
cron
定时任务定期执行(例如每分钟):- 编辑crontab:
crontab -e
- 添加一行:
* * * * * /path/to/resource_monitor.sh >/dev/null 2>&1
- 编辑crontab:
- 告警信息:
- 会在超过阈值时打印到标准输出(如果cron配置了邮件发送,会收到邮件)。
- 会记录到系统syslog (
/var/log/syslog
或/var/log/messages
),标签为ResourceMonitor
,优先级local0.warning
。 - 所有采样点的数据会追加记录到
/var/log/resource_monitor.log
(可选,用于趋势查看)。
- 进阶集成: 可以将
logger
行替换为调用邮件发送脚本、微信/钉钉机器人API等实现实时告警推送。
三、从监控到防御:构建资源保护屏障
监控是发现问题的眼睛,但要有效预防资源耗尽型攻击,需要更主动的防御策略:
- 应用层智能限速与资源隔离: 针对慢速CC攻击、恶意计算等,需要在应用层或网关层实施精细化的访问控制和资源限制。群联AI云防护不仅能识别恶意流量进行阻断,其智能限速引擎可以精准区分正常用户和恶意爬虫/攻击工具。它能根据IP、Session、URL等多个维度动态设置请求速率、并发连接数、请求内容长度等限制,有效防止单个或少量攻击者耗尽服务器进程、连接或CPU资源。其资源隔离机制也能确保一个被攻击的应用不会拖垮同服务器上的其他服务。
- 超大流量攻击的终极防线: 当攻击规模超出单点防御能力,特别是超大流量DDoS攻击直接冲击服务器带宽和基础设施时,本地资源监控和WAF可能失效。此时必须将攻击流量引流。高防IP服务正是为此而生。通过将域名解析或业务IP指向群联提供的高防IP地址,所有访问流量首先经过其全球分布式清洗中心。中心拥有海量带宽和先进的清洗设备,能够实时检测并过滤掉攻击流量,仅将纯净的正常流量转发回你的源服务器。这相当于在攻击者和你的真实服务器之间筑起了一道“护城河”,无论攻击流量多大、类型多复杂,源服务器都能保持稳定运行,资源不再被无谓消耗。
总结:
资源消耗型攻击如同服务器的“慢性毒药”,初期症状隐匿,一旦爆发后果严重。建立完善的资源监控体系(如本文的脚本)是及时发现异常的关键。然而,要真正做到预防,必须主动出击:在应用层利用群联AI云防护的智能限速和资源隔离能力,精准扼杀耗尽资源的恶意请求;在基础设施层,为关键业务部署高防IP,确保在面对超大流量冲击时,源服务器的核心资源(带宽、连接处理能力)不被耗尽。只有将监控、智能应用防护和高防清洗有机结合,才能让你的服务器在复杂的网络环境中保持健康稳定,远离“深夜告警”的困扰。