Nginx 如何防止 DDoS 攻击?

推荐答案

Nginx 可以通过以下几种方式来防止 DDoS 攻击:

  1. 限制请求速率:使用 limit_req 模块来限制每个 IP 地址的请求速率,防止单个 IP 地址发送过多请求。
  2. 限制连接数:使用 limit_conn 模块来限制每个 IP 地址的并发连接数,防止单个 IP 地址占用过多连接资源。
  3. 使用防火墙:结合防火墙(如 iptables 或云服务商的防火墙)来过滤恶意流量。
  4. 启用缓存:通过启用 Nginx 的缓存功能,减少后端服务器的负载。
  5. 使用 WAF:部署 Web 应用防火墙(WAF)来检测和阻止恶意请求。
  6. 配置负载均衡:通过负载均衡将流量分散到多个服务器,避免单点过载。

本题详细解读

1. 限制请求速率

Nginx 的 limit_req 模块可以限制每个 IP 地址的请求速率。通过配置 limit_req_zonelimit_req 指令,可以设置请求速率限制。例如:

-- -------------------- ---- -------
---- -
    -------------- ------------------- ------------ ----------

    ------ -
        -------- - -
            --------- -------- --------
            ---------- ---------------
        -
    -
-
  • limit_req_zone 定义了一个名为 one 的共享内存区域,用于存储请求速率信息。
  • rate=1r/s 表示每秒允许 1 个请求。
  • burst=5 表示允许突发 5 个请求。

2. 限制连接数

Nginx 的 limit_conn 模块可以限制每个 IP 地址的并发连接数。通过配置 limit_conn_zonelimit_conn 指令,可以设置连接数限制。例如:

-- -------------------- ---- -------
---- -
    --------------- ------------------- --------------

    ------ -
        -------- - -
            ---------- ---- ---
            ---------- ---------------
        -
    -
-
  • limit_conn_zone 定义了一个名为 addr 的共享内存区域,用于存储连接数信息。
  • limit_conn addr 10 表示每个 IP 地址最多允许 10 个并发连接。

3. 使用防火墙

结合防火墙可以进一步过滤恶意流量。例如,使用 iptables 限制每个 IP 地址的连接数:

这条规则表示如果某个 IP 地址的连接数超过 20,则丢弃该 IP 的所有新连接。

4. 启用缓存

启用 Nginx 的缓存功能可以减少后端服务器的负载。例如:

-- -------------------- ---- -------
---- -
    ---------------- ----------------- ---------- ---------------------- ------------ ------------ ------------------

    ------ -
        -------- - -
            ----------- ---------
            ---------- ---------------
        -
    -
-
  • proxy_cache_path 定义了缓存路径和大小。
  • proxy_cache 启用了缓存功能。

5. 使用 WAF

Web 应用防火墙(WAF)可以检测和阻止恶意请求。常见的 WAF 有 ModSecurity,可以通过 Nginx 集成使用。

6. 配置负载均衡

通过负载均衡将流量分散到多个服务器,避免单点过载。例如:

-- -------------------- ---- -------
---- -
    -------- ------- -
        ------ ---------------------
        ------ ---------------------
    -

    ------ -
        -------- - -
            ---------- ---------------
        -
    -
-
  • upstream 定义了后端服务器组。
  • proxy_pass 将请求转发到后端服务器组。
纠错
反馈