网站突然变慢,你的第一反应可能是服务器不行了,或者代码有bug。但很多时候,真正的元凶是网络攻击。流量异常激增、资源被耗尽、连接数爆表,都会导致访问瘫痪。这时候,盲目重启服务器或者升级配置是治标不治本,你必须先像一个侦探一样,精准判断出正在遭受哪种攻击,才能进行有效反击。排查的核心顺序是:先看现象,定位源头,再定性攻击类型。不要一上来就想着封IP或者上高防,打错了地方,浪费资源还解决不了问题。
第一步:立即检查核心性能指标,锁定异常范围
打开你的服务器监控面板或运维工具,重点看以下几组数据,它们直接告诉你“病”在哪儿:
1. CPU使用率与负载(Load Average):如果CPU长时间接近100%,负载值远高于CPU核心数(例如4核CPU负载长期在10以上),说明有进程在疯狂消耗计算资源。这可能是CC攻击(HTTP Flood)或恶意爬虫在动态请求上“打桩”,也可能是被植入了挖矿木马。
2. 内存使用率:内存被耗尽,会导致系统频繁使用Swap分区,磁盘IO暴增,整体响应变慢。大量突发连接可能导致此现象。
3. 网络流量(入向/出向带宽):这是关键指标。如果入向带宽被完全打满(例如100Mbps的带宽持续跑在99Mbps),这极有可能是流量型攻击,如DDoS(分布式拒绝服务)或DNS/ NTP放大攻击。如果出向带宽异常高,则可能是服务器被当作攻击跳板,对外发包。
4. 磁盘IO:检查磁盘读写等待时间(await)和利用率。如果异常高,可能是攻击者在暴力扫描、写入大量日志(如通过漏洞攻击尝试),或是数据库被大量恶意查询拖垮。
5. 连接数:查看服务器的网络连接状态。使用命令
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'重点观察 TIME_WAIT 和 ESTABLISHED 连接数。如果TIME_WAIT连接数异常多,可能是短连接攻击;如果ESTABLISHED连接数巨大且持续不减,则可能是慢速攻击(如Slowloris)或连接耗尽型攻击。
第二步:分析网络流量与请求特征,初步定性攻击类型
根据第一步的指标,你已经有了方向。现在需要深入流量内部,看数据包的具体内容。这步需要借助Web服务器日志、网络抓包工具(如tcpdump)或专业的WAF(Web应用防火墙)日志。
场景A:带宽被打满,但服务器CPU/内存不高
现象:入站流量洪峰,但你的网站页面其实很简单,不应该产生这么大流量。
判断:这很可能是网络层或传输层DDoS攻击,比如SYN Flood、UDP Flood、ICMP Flood,或者是利用反射放大技术的DNS/NTP/SSDP攻击。攻击者的目的是用垃圾流量堵塞你的网络管道,让正常用户的数据包进不来。这类攻击的请求可能根本不针对你的Web应用端口(80/443),而是攻击整个IP的所有端口。
场景B:CPU或数据库被拖垮,带宽可能正常
现象:带宽没满,但服务器响应极慢,CPU飙高,数据库服务器负载沉重。
判断:这通常是应用层攻击。
- 查看Web访问日志(如Nginx的access.log),如果发现大量密集请求来自少量IP,针对同一个消耗资源的动态URL(如搜索页面、登录接口、复杂查询API),那就是典型的CC攻击(HTTP Flood)。攻击者模拟大量用户,快速发起合法HTTP请求,耗尽你的后端计算资源。
- 如果日志里充满了奇怪的参数、大量的SQL语句片段(如‘ UNION SELECT)、‘ OR ‘1’=‘1等),那无疑是SQL注入攻击,攻击者在尝试拖库,低效的恶意查询会严重拖慢数据库。
- 如果发现大量404错误,请求一些不存在的敏感路径(如/wp-admin, /phpmyadmin, /config.xml),这是目录扫描或漏洞探测,虽然单次请求消耗小,但海量请求会占用连接池和IO资源。
场景C:连接数异常高,但单个请求流量很小
现象:服务器达到最大连接数限制,新用户无法连接,但已建立的连接长时间不释放。
判断:这指向慢速攻击。最著名的是Slowloris攻击:攻击者与服务器建立大量HTTP连接,但每次只发送一个字节的头部,并保持连接不关闭,慢慢耗光你的可用连接数。检查你的Web服务器,会发现有很多处于“Reading”状态、持续几分钟甚至更长的连接。
第三步:使用关键命令与工具进行深度验证
怀疑某种攻击后,需要用工具快速验证。
1. 确认连接异常:使用
ss -nt state established sport = :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20这个命令可以列出与你的80端口建立连接最多的前20个IP。如果发现某个IP建立了成百上千个连接,那它几乎肯定是恶意IP。
2. 实时查看恶意请求:使用
tail -f /var/log/nginx/access.log | grep -E "(某个可疑IP|某个可疑URL)"
或者直接使用
tcpdump -i eth0 -nn -s0 port 80
抓取HTTP流量,观察请求内容。
3. 识别流量型DDoS:对于带宽打满的情况,在网关或高防设备上查看流量图是最直接的。如果没有,可以在服务器上使用
iftop -i eth0
或
nethogs
查看实时带宽占用最高的IP和端口。如果看到大量流量来自非Web端口或来自伪造的IP段,就是DDoS的证据。
第四步:根据攻击类型采取针对性应急措施
判断出攻击类型后,应对策略完全不同:
对于网络层/传输层DDoS(流量型):
这是最“暴力”的攻击,个人或普通企业服务器几乎无法独自抵御。核心策略是引流和清洗。
1. 立即联系你的主机商或云服务商,告知遭受DDoS攻击。正规的云服务商通常提供基础流量清洗服务。
2. 如果攻击持续且严重,必须紧急启用专业的DDoS高防IP服务。将你的网站域名CNAME解析到高防IP,所有流量会先经过高防的清洗中心,过滤掉恶意流量,再将干净流量回源到你的服务器。
3. 在服务器层面,可以临时调整内核参数缓解小规模SYN Flood,例如:
sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_max_syn_backlog=2048 sysctl -w net.ipv4.tcp_synack_retries=2
对于应用层CC攻击:
应对的关键在于识别和拦截恶意会话与请求。
1. 频率限制(Rate Limiting):在Web服务器(Nginx/Apache)或WAF上,对单个IP的请求频率进行严格限制。例如,在Nginx中:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
location / {
limit_req zone=one burst=20 nodelay;
}这表示每秒只允许每个IP处理10个请求,最多允许突发20个。
2. 人机验证:对访问关键资源(登录、提交、搜索)的请求,启用验证码(Captcha),可以有效阻断自动化攻击脚本。
3. 封禁IP段:根据第二步查出的恶意IP,使用防火墙(如iptables)或云平台安全组进行封禁。对于来自某个国家或地区的异常流量,可以直接屏蔽该地区IP段。
对于慢速攻击(如Slowloris):
应对的关键是调整超时时间和连接限制。
1. 调整Web服务器配置,缩短连接超时、头部读取超时时间。例如Nginx:
client_header_timeout 10s; client_body_timeout 10s; keepalive_timeout 30s;
2. 限制单个IP的并发连接数。Nginx示例:
limit_conn_zone $binary_remote_addr zone=addr:10m;
location / {
limit_conn addr 20; # 每个IP同时最多20个连接
}
3. 使用专门防御慢速攻击的模块,如Nginx的 "ngx_http_limit_req_module" 结合超时设置。
第五步:建立长期防御与监控体系
应急处理只是救火,长远之计在于构建主动防御。
1. 部署WAF(Web应用防火墙):这是防御应用层攻击的利器。WAF可以内置规则库,自动识别并拦截SQL注入、XSS、CC攻击、扫描器等常见攻击行为。无论是云WAF服务还是自建开源WAF(如ModSecurity),都应成为标配。
2. 全站启用HTTPS(SSL/TLS):这不仅能加密数据,还能在一定程度上增加攻击者发起复杂攻击的成本。配合严格的SSL/TLS配置,可以过滤掉一些低级的扫描工具。
3. 隐藏真实服务器IP:使用CDN(内容分发网络)。CDN节点分布广泛,能天然分散和吸收一部分攻击流量,并且你的源站IP被隐藏,降低了被直接攻击的风险。确保CDN服务具备一定的安全防护能力。
4. 加强服务器自身安全:最小化服务原则,关闭不必要的端口;定期更新系统和软件补丁;使用强密码和密钥认证;对数据库等重要服务设置严格的访问控制(仅允许特定IP访问)。
5. 建立监控告警机制:对第一步提到的CPU、内存、带宽、连接数等核心指标设置阈值告警。一旦指标异常,能第一时间收到通知,为应急响应争取时间。
总结来说,网站访问慢时排查攻击,切忌慌乱。遵循“指标监控 -> 流量分析 -> 类型判断 -> 精准打击”的顺序。流量打满找DDoS高防,资源耗尽查CC攻击和恶意扫描,连接数爆表想慢速攻击。先诊断,后下药,结合短期应急与长期布防,才能让你的网站在复杂的网络环境中保持稳定与敏捷。
