服务器被 DDoS 攻击,如何判断攻击类型?
服务器突然卡顿、网站打不开,第一反应是DDoS攻击。
但攻击类型不同,应对方法天差地别。
对新手来说,先看清是网络层洪水还是应用层冲击,比盲目封IP更重要。
准备工作:确认你能接触到这些工具
在动手之前,确保你已经:
- 通过SSH登录服务器(Windows用Putty,Mac/Linux直接终端)。
- 拥有root或sudo权限(临时提权用
sudo su)。 - 常用命令已安装:
netstat、ss、tcpdump、iftop。如果缺少,用包管理器安装:yum install -y net-tools iftop tcpdump(CentOS)或apt install -y net-tools iftop tcpdump(Ubuntu)。 - 网站如果是Nginx,记下日志路径:一般位于
/var/log/nginx/access.log。
第一步:看表象,缩小攻击范围
远程连接不上或SSH卡顿,通常说明网络层遭受大流量攻击。
如果SSH能连但网站响应极慢,可能是应用层攻击。
执行以下命令快速判断:
# 查看服务器整体负载
top -bn1 | head -10
如果CPU或内存利用率异常高(比如接近100%),说明攻击可能消耗了运算资源。
接着看网络接口流量:
# 监控实时带宽(Ctrl+C退出)
iftop -i eth0
观察流入流量是否远超服务器带宽(比如100M带宽显示500M),明显是带宽型攻击。
如果没有明显带宽暴涨,但网站卡,要怀疑应用层爬虫或CC攻击。
第二步:检查连接状态,锁定原始痕迹
使用 netstat 统计当前连接,是区分攻击层级的利器。
# 统计所有TCP连接状态数量
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn
输出类似:
500 SYN_RECV
300 ESTABLISHED
120 TIME_WAIT
如果 SYN_RECV 数量异常多(成百上千),基本是 SYN Flood 攻击。 这是网络层攻击。
接着查看来源IP:
# 查看哪个IP发起的SYN请求最多
netstat -ant | grep SYN_RECV | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
如果来源IP分散且每个IP连接数少,可能是分布式攻击。
如果单个IP连接数极高,先检查是不是合法服务。
如果 SYN_RECV 很少,ESTABLISHED 数量巨大(几千),且来源IP集中,可能是应用层爬虫或HTTP Flood。 此时需要看日志。
第三步:翻日志,揪出应用层异常
登录Nginx日志,用下面命令快速过滤异常请求:
# 查看最近10000条日志,统计请求最多的IP
tail -10000 /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20
如果前几个IP请求量远超正常(比如几百次/秒),且请求路径单一(尤其是 /?、/index.php),很可能是HTTP Flood。
再针对性过滤:
# 查看某个IP的请求特征
grep '192.168.1.100' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -10
如果都是 /index.html 等静态资源,是CC攻击;
如果大量POST到登录接口,可能是撞库或应用层攻击。
避坑指南:新手最容易犯的错
- 不要立刻封所有SYN_RECV的IP。合法用户的SYN包也会进入SYN_RECV状态,过度封禁会导致误伤。建议先确认攻击特征(如源IP分布是否随机、请求包大小是否异常)。
- 不要忽略HTTPS攻击。443端口的TLS握手也会消耗CPU,用
ss -tlnp | grep 443检查连接数。 - 不可靠现象判断。如果服务器响应突然变慢,先排除自身程序Bug(比如死循环或慢查询),再怀疑DDoS。可以用
strace跟踪进程。 - 别直接用iptables封整个IP段。如果攻击IP来自多个国家随机,封IP段可能误伤正常用户。优先考虑限流(rate limit)或启用防DDoS服务(如Cloudflare、高防IP)。
验证效果:判断是否已经定性
执行完上面步骤后,你应该能初步回答以下问题:
- 攻击主要消耗带宽还是CPU?
- 连接状态中SYN_RECV多还是ESTABLISHED多?
- 日志中请求是否来自同一路径且频率异常?
如果以上三条分别对应:带宽暴涨且SYN_RECV多 → SYN Flood;
CPU高且ESTABLISHED多 → HTTP Flood;
日志中单一IP高频请求 → CC攻击。
最后,用 iptables -L -n 或云服务商防护面板观察流量是否稳定。
如果攻击仍在,建议升级专业防护方案。
新手先学会判断类型,再对症下药,这是最核心的第一步。