前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >『学习笔记』配置 Nginx 实现站点限流与防止 DDOS 攻击

『学习笔记』配置 Nginx 实现站点限流与防止 DDOS 攻击

原创
作者头像
数字扫地僧
发布2024-12-01 23:51:25
发布2024-12-01 23:51:25
2100
举报
文章被收录于专栏:活动活动

🎈今日推荐——https://cloud.tencent.com/developer/article/2472492

网络诊断指南:网络故障排查步骤与技巧——这篇文章提供了网络故障排查的详细步骤和技巧。首先检查物理连接和网络配置,然后测试基本网络连接。如果问题依旧,深入检查路由器、交换机、网络流量和防火墙配置。文章还讨论了常见网络故障及其解决方法,如IP地址冲突、DNS解析失败、网络拥堵和设备故障,旨在帮助网络管理员快速定位并解决网络问题。


在现代网站的部署中,防止恶意流量(如 DDOS 攻击)和保护服务器资源是系统管理员的重要任务。Nginx 作为高性能的反向代理和 Web 服务器,提供了丰富的模块来实现流量控制和防护策略。

某在线平台因突发流量导致服务器宕机,后分析发现攻击者通过多线程发送大量请求,试图耗尽服务器资源。为此,平台需要对流量进行限速并部署 DDOS 防御机制。

限流功能:

  • 针对单个 IP 地址限制请求速率,避免恶意访问影响正常用户。
  • 支持全局和细粒度的限流策略。

防止 DDOS 攻击:

  • 阻止频繁请求的 IP 地址。
  • 实现黑白名单管理,拦截恶意流量。

监控与报警 :

  • 提供日志记录和分析工具,实时监控异常流量。

Nginx 限流模块概述

Nginx 提供两个模块用于流量控制:

模块名称

功能描述

ngx_http_limit_req_module

基于请求速率的限流(Rate Limiting)。

ngx_http_limit_conn_module

基于并发连接的限流(Connection Limiting)。


配置 Nginx 实现站点限流

基于请求速率的限流

limit_req_zonelimit_req 指令用于实现速率限制:

  • limit_req_zone:定义一个共享内存区域,用于存储客户端的请求速率。
  • limit_req:在具体的 location 配置中应用限流策略。

在 Nginx 配置文件中添加以下代码:

代码语言:nginx
复制
http {
    # 定义一个限流区域,每秒允许最多 10 个请求,漏桶算法
    limit_req_zone $binary_remote_addr zone=limit_zone:10m rate=10r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=limit_zone burst=20 nodelay;  # 每秒最多允许 10 个请求,允许 20 个突发请求
            proxy_pass http://backend_server;
        }
    }
}

配置项

描述

rate=10r/s

每秒允许的请求速率为 10 个。

burst=20

设置允许的突发请求数量,当超过限制时,后续请求将被延迟或拒绝。

nodelay

禁用延迟处理,超过突发请求限制后立即返回错误。

基于并发连接的限流

limit_conn_zonelimit_conn 指令用于限制客户端的并发连接数。

代码语言:nginx
复制
http {
    # 定义一个并发连接限制区域
    limit_conn_zone $binary_remote_addr zone=conn_limit_zone:10m;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_conn conn_limit_zone 10;  # 每个 IP 地址最多允许 10 个并发连接
            proxy_pass http://backend_server;
        }
    }
}

配置项

描述

limit_conn_zone

定义限流区域和存储空间,用于记录连接数据。

limit_conn

限制每个客户端的最大并发连接数。


防止 DDOS 攻击的 Nginx 配置

使用黑白名单

通过 denyallow 指令实现黑白名单:

代码语言:nginx
复制
server {
    listen 80;
    server_name example.com;

    location / {
        allow 192.168.1.0/24;   # 允许的 IP 段
        deny all;               # 拒绝其他所有 IP
    }
}

阻止频繁请求的 IP 地址

借助 ngx_http_realip_module 和第三方工具(如 fail2ban)实现动态阻止。


综合限流与防护策略

Nginx 的灵活性使其能够结合多种限流和防护机制,应对不同的流量压力和安全威胁。以下是一个综合示例,结合速率限制、并发连接限制以及黑白名单,达到全面保护服务器的目的。

综合配置详细说明

以下配置示例包括了三部分核心内容:请求速率限制并发连接限制IP 黑白名单规则。这些配置项相辅相成,用于限制恶意流量,优化资源利用率,同时确保正常用户的访问体验。

代码语言:nginx
复制
http {
    # 请求速率限制
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;

    # 并发连接限制
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    server {
        listen 80;
        server_name example.com;

        location / {
            # 应用限流规则
            limit_req zone=req_limit burst=10 nodelay;  # 限制速率:每秒最多 5 个请求,突发最大 10 个
            limit_conn conn_limit 5;                   # 限制并发连接:每个 IP 最大 5 个连接

            # 黑白名单规则
            allow 192.168.1.0/24;  # 允许 IP 段
            deny all;              # 拒绝其他所有 IP

            proxy_pass http://backend_server;  # 转发到后端服务器
        }
    }
}

配置分点说明

通过下表详细解释各配置项的作用及意义:

配置项

描述

limit_req_zone

定义一个速率限制的共享区域,req_limit 是区域名称,大小为 10MB,每秒最多允许 5 个请求。

rate=5r/s

限制每秒允许的最大请求速率为 5。

burst=10

设置突发请求的缓冲区,允许额外的 10 个请求进入缓冲区。

nodelay

禁用延迟处理,超过缓冲区的请求立即被拒绝。

limit_conn_zone

定义并发连接限制的共享区域,conn_limit 是区域名称,大小为 10MB。

limit_conn conn_limit 5

限制每个 IP 地址的最大并发连接数为 5。

allowdeny 指令

配置 IP 黑白名单:允许 192.168.1.0/24 范围的 IP 访问,拒绝其他所有 IP。

proxy_pass

将请求转发到后端服务器,减轻 Nginx 处理压力。

配置示例的增强与细化

  • 多级限流配置 针对不同路径设置不同的限流规则。例如,对于关键接口设置更严格的速率限制:
代码语言:nginx
复制
location /api/ {
    limit_req zone=req_limit burst=5 nodelay;  # 更严格的请求速率限制
    limit_conn conn_limit 3;                  # 降低并发连接数
}

location /static/ {
    # 对静态资源不进行限流
    proxy_pass http://static_server;
}
  • 日志记录与监控 配置日志格式,便于监控和分析限流效果:
代码语言:nginx
复制
log_format custom_format '$remote_addr [$time_local] "$request" '
                            'status=$status req_limit=$limit_req_status conn_limit=$limit_conn_status';
access_log /var/log/nginx/traffic.log custom_format;

日志字段

描述

$limit_req_status

限流状态(passed:通过,delayed:延迟,rejected:拒绝)。

$limit_conn_status

并发连接状态(passedrejected)。

  • 动态黑白名单管理 使用 Lua 模块或 Fail2Ban 实现动态添加和删除黑白名单 IP:
代码语言:bash
复制
# Fail2Ban 示例
iptables -A INPUT -s <malicious_ip> -j DROP

配置效果与优化建议

通过上述综合配置,可以显著提高系统的抗压能力,并有效防止恶意流量影响正常用户体验。以下是配置效果对比:

配置项

配置前情况

配置后改善

请求速率控制

每秒数百个恶意请求耗尽资源

每秒超过 5 个请求立即被拒绝

并发连接限制

恶意 IP 占用大量并发连接

单个 IP 最大连接数限制在 5 以内

黑白名单

无法区分正常与恶意流量

有效拦截恶意 IP,正常用户畅通无阻

服务器稳定性

服务器经常宕机,正常用户访问受阻

资源利用率优化,系统稳定性显著提升


效果监控与日志分析

日志记录与分析

通过访问日志和错误日志监控限流效果:

代码语言:nginx
复制
http {
    log_format custom_format '$remote_addr - $remote_user [$time_local] "$request" '
                              'status=$status body_bytes_sent=$body_bytes_sent '
                              'req_time=$request_time limit=$limit_req_status';
    access_log /var/log/nginx/access.log custom_format;
}

日志字段

描述

$limit_req_status

限流状态(passedrejected)。

$request_time

请求处理时间。

通过合理配置 Nginx 的限流和防护策略,可以有效应对突发流量和恶意攻击。以下是关键点:

  1. 使用 limit_reqlimit_conn 配置请求速率和并发连接限制。
  2. 借助黑白名单阻止恶意 IP 地址。
  3. 结合日志分析工具,监控流量并优化策略。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nginx 限流模块概述
  • 配置 Nginx 实现站点限流
    • 基于请求速率的限流
    • 基于并发连接的限流
  • 防止 DDOS 攻击的 Nginx 配置
    • 使用黑白名单
    • 阻止频繁请求的 IP 地址
  • 综合限流与防护策略
    • 综合配置详细说明
    • 配置分点说明
    • 配置示例的增强与细化
    • 配置效果与优化建议
  • 效果监控与日志分析
    • 日志记录与分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档