Nginx 如何防止 DDoS 攻击

 Nginx 如何防止 DDoS 攻击

原创 广智 架构经纬
 2024年09月21日 12:00 上海 听全文
【每天5分钟,了解一个知识点】
 
DDoS(分布式拒绝服务攻击)是一个让很多网站和服务头疼的问题。DDoS 攻击就像是一群不怀好意的人一起堵塞了你的店门,让正常的顾客无法进入。那我们该如何利用 Nginx 来防止这种攻击呢?
 
一、DDoS 攻击的特点
 
DDoS 攻击通常有以下几个特点:
 
攻击流量来源于一些固定的 IP 地址,而且每一个 IP 地址会创建比真实用户多得多的连接和请求。
 
攻击流量全部由机器产生,速率比人类用户高得多。
 
进行攻击的机器其 User-Agent 头不是标准的值,Referer 头有时也会被设置成能够与攻击关联起来的值。
 
二、Nginx 防止 DDoS 攻击的方法
 
限制请求率将 Nginx 可接受的入站请求率限制为适合真实用户的值。比如,通过配置让一个真正的用户每两秒钟才能访问一次登录页面。
 
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
server {
  ...
  location /loginUser.html {
      limit_req zone=one;
      ...
  }
}
限制连接的数量将某个客户端 IP 地址所能打开的连接数限制为真实用户的合理值。例如,限制每一个 IP 对网站/product 部分打开的连接数不超过 10 个。
 
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
  ...
  location /product/ {
      limit_conn addr 10;
      ...
  }
}
关闭慢连接关闭那些一直保持打开同时写数据又特别频繁的连接,因为它们会降低服务器接受新连接的能力。可以通过 client_body_timeout 和 client_header_timeout 指令控制请求体或者请求头的超时时间。
 
server {
  client_body_timeout 5s;
  client_header_timeout 5s;
  ...
}
设置 IP 黑名单如果能识别攻击者所使用的客户端 IP 地址,那么通过 deny 指令将其屏蔽,让 Nginx 拒绝来自这些地址的连接或请求。
 
location / {
  deny 124.123.121.3;
  deny 124.123.121.5;
  deny 124.123.121.7;
  ...
}
设置 IP 白名单如果允许访问的 IP 地址比较固定,那么通过 allow 和 deny 指令让网站或者应用程序只接受来自于某个 IP 地址或者某个 IP 地址段的请求。
 
location / {
  allow 192.168.122.0/24;
  deny all;
  ...
}
通过缓存削减流量峰值通过启用缓存并设置某些缓存参数让 Nginx 吸收攻击所产生的大部分流量峰值。同时,要注意 proxy_cache_key 指令定义的键中不要包含容易被攻击者利用的变量。
 
阻塞请求配置 Nginx 阻塞以下类型的请求:
 
以某个特定 URL 为目标的请求。
 
User-Agent 头中的值不在正常客户端范围之内的请求。
 
Referer 头中的值能够与攻击关联起来的请求。
 
其他头中存在能够与攻击关联在一起的值的请求。
 
限制对后端服务器的连接数通常 Nginx 实例能够处理比后端服务器多得多的连接数,因此可以通过 Nginx 限制到每一个后端服务器的连接数。
 
upstream website {
  server 192.168.100.1:80 max_conns=200;
  server 192.168.100.2:80 max_conns=200;
  queue 10 timeout=30s;
}
 
 
【关联阅读】
 
JVM基础系列
 
网络编程
 
SpringBoot基础
 
SpringCloud(微服务)基础
 
Redis
 
MySQL
 
MyBatis
 
算法
 
消息队列
 
Nginx
 
 
 
 
 
阅读 1468
 
posted @   技术颜良  阅读(172)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
历史上的今天:
2023-09-25 Buildx 来助力
2021-09-25 python事件驱动框架td
2021-09-25 go中只能给接口、指针赋值nil类型
2021-09-25 go可变参数(重要)
点击右上角即可分享
微信分享提示