DDoS 攻击用大量垃圾流量把服务器打满,让它没法正常响应合法请求。和入侵不同,DDoS 没有漏洞可以补——它就是靠流量体积取胜。防护必须分层:内核、防火墙、应用、CDN,每层做每层该做的事。
DDoS 攻击类型与防护
| 类型 | 特征 | 防护手段 |
|---|---|---|
| SYN Flood | 大量半连接 | sysctl 调 SYN 参数 |
| HTTP Flood | 真实请求耗资源 | 限速 + WAF |
| DNS Amplification | 放大反射攻击 | 关 DNS 递归 |
| 慢速攻击 | Slowloris 占连接 | 调超时 + 限并发 |
判断攻击类型
先搞清楚自己面对的是什么攻击:
tcpdump -nn -c 1000 -i eth0 | awk '{print $3}' | sort | uniq -c | sort -rn | head -20
如果源 IP 成千上万,每个发几个包,那是分布式攻击,靠封 IP 没用。如果只有少数 IP 疯狂发 SYN 或 UDP,本地过滤可能有效。
再看连接状态:
ss -s
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c | sort -rn
正常服务器大部分是 ESTABLISHED。如果 SYN_RECV 上万,说明正在被 SYN flood。
内核层防护:SYN Flood
SYN flood 是最常见的 VPS 级 DDoS。开启 SYN cookies:
sysctl net.ipv4.tcp_syncookies
# 如果是 0,开启
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
sysctl -w net.ipv4.tcp_synack_retries=2
持久化到 /etc/sysctl.d/99-ddos.conf:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.conf.all.rp_filter = 1
防火墙层:速率限制
对连接数做限制:
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 20 -j DROP
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
应用层:Nginx 限速
针对 HTTP 层的攻击,在 Nginx 里限流:
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
location / {
limit_req zone=general burst=20 nodelay;
}
location /wp-login.php {
limit_req zone=login burst=5 nodelay;
}
location = /xmlrpc.php {
deny all;
}
CDN 前置:真正的流量吸收层
当攻击流量超过你的上行带宽时,服务器端做什么都没用——包已经到门口了。Cloudflare 免费版就能吸收大部分 3/4 层攻击。把 DNS 切到 Cloudflare,开启 Under Attack 模式,配置 rate limiting。
其他选择:主机商的 DDoS 防护(Vultr、Hetzner、OVH 都有)、AWS Shield、专业清洗服务。
上游带宽被占满怎么办
如果上游带宽已经饱和,联系你的 VPS 提供商。他们通常会临时 null-route 被攻击的 IP,这会中断服务,但能保护他们的网络。长期方案必须是用 CDN 或专业清洗服务。
更多服务器安全教程,请访问 fenij.com。
常见问题
问:SYN cookies 会影响性能吗?
答:几乎不会。只有发生 SYN flood 时才会启用,正常流量走标准握手。现代 CPU 生成 cookies 的开销可以忽略。
问:Cloudflare 前面还需要 iptables 限速吗?
答:需要。如果攻击者找到了源站 IP,就能绕过 Cloudflare。iptables 是最后一道防线。
问:怎么隐藏源站 IP?
答:所有 DNS 记录都要走 Cloudflare 代理(橙色云)。检查证书透明度日志、邮件头、子域名,确保没有其他地方泄露真实 IP。
IP 分片攻击是 DDoS 的一种变体,完整原理见IP 分片攻击完整指南。