推荐答案
Nginx 可以通过以下几种方式来防止 DDoS 攻击:
- 限制请求速率:使用
limit_req
模块来限制每个 IP 地址的请求速率,防止单个 IP 地址发送过多请求。 - 限制连接数:使用
limit_conn
模块来限制每个 IP 地址的并发连接数,防止单个 IP 地址占用过多连接资源。 - 使用防火墙:结合防火墙(如 iptables 或云服务商的防火墙)来过滤恶意流量。
- 启用缓存:通过启用 Nginx 的缓存功能,减少后端服务器的负载。
- 使用 WAF:部署 Web 应用防火墙(WAF)来检测和阻止恶意请求。
- 配置负载均衡:通过负载均衡将流量分散到多个服务器,避免单点过载。
本题详细解读
1. 限制请求速率
Nginx 的 limit_req
模块可以限制每个 IP 地址的请求速率。通过配置 limit_req_zone
和 limit_req
指令,可以设置请求速率限制。例如:
-- -------------------- ---- ------- ---- - -------------- ------------------- ------------ ---------- ------ - -------- - - --------- -------- -------- ---------- --------------- - - -
limit_req_zone
定义了一个名为one
的共享内存区域,用于存储请求速率信息。rate=1r/s
表示每秒允许 1 个请求。burst=5
表示允许突发 5 个请求。
2. 限制连接数
Nginx 的 limit_conn
模块可以限制每个 IP 地址的并发连接数。通过配置 limit_conn_zone
和 limit_conn
指令,可以设置连接数限制。例如:
-- -------------------- ---- ------- ---- - --------------- ------------------- -------------- ------ - -------- - - ---------- ---- --- ---------- --------------- - - -
limit_conn_zone
定义了一个名为addr
的共享内存区域,用于存储连接数信息。limit_conn addr 10
表示每个 IP 地址最多允许 10 个并发连接。
3. 使用防火墙
结合防火墙可以进一步过滤恶意流量。例如,使用 iptables 限制每个 IP 地址的连接数:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j DROP
这条规则表示如果某个 IP 地址的连接数超过 20,则丢弃该 IP 的所有新连接。
4. 启用缓存
启用 Nginx 的缓存功能可以减少后端服务器的负载。例如:
-- -------------------- ---- ------- ---- - ---------------- ----------------- ---------- ---------------------- ------------ ------------ ------------------ ------ - -------- - - ----------- --------- ---------- --------------- - - -
proxy_cache_path
定义了缓存路径和大小。proxy_cache
启用了缓存功能。
5. 使用 WAF
Web 应用防火墙(WAF)可以检测和阻止恶意请求。常见的 WAF 有 ModSecurity,可以通过 Nginx 集成使用。
6. 配置负载均衡
通过负载均衡将流量分散到多个服务器,避免单点过载。例如:
-- -------------------- ---- ------- ---- - -------- ------- - ------ --------------------- ------ --------------------- - ------ - -------- - - ---------- --------------- - - -
upstream
定义了后端服务器组。proxy_pass
将请求转发到后端服务器组。