
几个月前,我们的一套部署在香港的数据服务API频繁遭遇L7 DDoS攻击。流量并不算极大,但由于攻击模拟合法请求,频繁消耗Nginx连接数和后端PHP-FPM资源,几度把服务压垮。传统的黑名单封锁根本不够用,于是我决定从网络层和会话层同时着手,深入调优防火墙规则,实现更智能的DDoS缓解机制。
这篇文章将完整分享我如何在实际生产环境中,基于香港裸金属服务器和边缘硬件防火墙(如FortiGate),结合iptables和ipset等工具,构建了一个动态防御系统,成功缓解了层级式DDoS威胁。
一、环境与前提条件
我的目标服务器环境如下:
- 位置:香港本地 BGP 多线数据中心(A5数据专线)
- 操作系统:Debian 11 + Nginx 1.24
- 防火墙组件:
- 内核防火墙:iptables + ipset + conntrack
- 边缘防火墙:FortiGate 100F,带IPS/WAF模块
- DDoS防护网关:流量清洗由服务商提供,主要防御 SYN Flood 与 UDP Flood
- 攻击特征:高度模拟正常访问、并发连接在2000+、HTTP头部随机化、不带明显UA特征
二、核心防御策略架构图
[Internet]
|
[流量清洗网关] --- SYN/UDP Filter
|
[边界防火墙 FortiGate] --- IP Reputation, WAF, Rate Limit
|
[服务器防火墙 iptables] --- 精细化规则
|
[Web服务/Nginx] --- Proxy缓冲,限速
三、Linux服务器端防火墙调优实操
3.1 iptables + conntrack 基础限速规则
我先从连接控制入手,限制单位时间内单IP并发连接数,防止连接耗尽。
# 限制每个 IP 每 10 秒最多新建 20 个连接
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW \
-m recent --set --name http_limit
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW \
-m recent --update --seconds 10 --hitcount 20 --rttl --name http_limit -j DROP
实测可以挡掉约30%模拟UA随机刷流的攻击连接。
3.2 利用 ipset 黑名单动态封堵高频IP
对于触发一定连接频率的IP,我将其自动加入ipset黑名单中,封禁60分钟。
ipset create blacklist hash:ip timeout 3600
# 封禁规则
iptables -I INPUT -m set --match-set blacklist src -j DROP
# 加入IP到黑名单(通过脚本触发或fail2ban)
ipset add blacklist 203.90.122.1
并结合 fail2ban 编写自定义filter:
[nginx-ddos]
enabled = true
filter = nginx-ddos
logpath = /var/log/nginx/access.log
maxretry = 100
findtime = 60
bantime = 3600
action = ipset[name=blacklist, port=http, protocol=tcp]
3.3 限制连接速率 + TCP连接状态过滤
配合hashlimit模块可以精准控制连接速率:
# 每个 IP 每秒不超过 2 个新连接,超出直接丢弃
iptables -A INPUT -p tcp --dport 80 \
-m state --state NEW \
-m hashlimit --hashlimit 2/sec --hashlimit-burst 5 \
--hashlimit-mode srcip --hashlimit-name http_rate_limit \
-j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j DROP
3.4 加强 TCP 层抗攻击能力
内核层调优(位于 /etc/sysctl.conf 或通过 runtime 修改):
# 降低TIME_WAIT保留时间,加快连接释放
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
# 防止 SYN Flood
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
# 减缓半连接队列攻击
net.ipv4.tcp_abort_on_overflow = 0
四、边界防火墙策略:FortiGate 实战规则
在边缘设备 FortiGate 上,我启用了如下策略:
4.1 WAF 模块规则配置
启用 URL 访问路径规则,限制非标准请求如:
- /admin.php
- SQL注入尝试:’ OR 1=1 —
- 启用 User-Agent 白名单匹配,仅允许常见浏览器访问入口页面。
4.2 每IP会话数限制
配置策略中启用会话数限制:
- 每源IP:最大并发连接数 100
- TCP会话持续时间上限:180秒
4.3 Geo-IP 过滤 + ASN 限制
针对异常国家流量进行软封禁处理(比如海外代理大量伪装访问):
config firewall address
edit "Blocked_Countries"
set type geography
set country "CN" "RU" "IR"
next
end
config firewall policy
edit 10
set srcaddr "Blocked_Countries"
set action deny
next
end
五、流量可视化与响应机制
为提升响应效率,我部署了如下监控方案:
- netdata + Prometheus + Grafana:实时连接数、攻击高峰、流量异常曲线展示
- suricata + eve.json:分析L7请求包中的攻击特征
- 自定义Nginx日志报警脚本:频繁访问非业务路径触发报警并调用API封禁IP
六、典型案例总结
在某次凌晨攻击中,我们监控到:
- 请求频率达到 3000 req/s
- 连接数峰值超过 8 万
- Nginx卡死、CPU飙升至 90%
通过上述防火墙规则配合边界限流和ipset黑名单,在不到 5 分钟内自动识别并阻断异常IP段,业务最终无须人工介入成功自愈。
七、结语与经验教训
在香港节点部署服务,尤其面向全球开放时,L7攻击极具隐蔽性,单靠传统的硬防清洗难以完全覆盖。而防火墙作为“最后一公里”的守门人,只要策略足够灵活精细,是完全有可能实现对DDoS攻击的缓解与精准阻断的。
我的建议是:不要等攻击发生再调防火墙,提前建立基线模型、动态封锁策略和多层缓解机制,才能真正做到“打不死”的服务”。











