如何通过精细化调优香港服务器的防火墙规则,避免DDoS攻击对Web应用的影响?

如何通过精细化调优香港服务器的防火墙规则,避免DDoS攻击对Web应用的影响?

几个月前,我们的一套部署在香港的数据服务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攻击的缓解与精准阻断的。

我的建议是:不要等攻击发生再调防火墙,提前建立基线模型、动态封锁策略和多层缓解机制,才能真正做到“打不死”的服务”。

未经允许不得转载:A5数据 » 如何通过精细化调优香港服务器的防火墙规则,避免DDoS攻击对Web应用的影响?

相关文章

contact