nginx 限制ip访问频率和限速 (摘录)

摘要:
CC攻击通常使用有限数量的IP地址频繁向服务器发送数据,以达到攻击目的。nginx可以通过HttpLimitReqModule和HttpLimitZoneModule配置限制同一时间段内的IP访问次数,以防止cc攻击。HttpLimitReqModule用于限制每单位时间的连接数。使用limit_req_Zone和limit_req指令一起使用以达到极限。

限制某个IP同一时间段的访问次数

如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包, 造成对方服务器资源耗尽,一直到宕机崩溃。

   cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数来防cc攻击。

HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。

   HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令

这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制

HttpLimitReqModul 限制某一段时间内同一ip访问数实例

http{
  ...
  #定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
  #以$binary_remote_addr 为key,限制平均每秒的请求为20个,
  #1M能存储16000个状态,rete的值必须为整数,
  #如果限制两秒钟一个请求,可以设置成30r/m
  limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
  ...
  server{
    ...
    location {
      ...
      #限制每ip每秒不超过20个请求,漏桶数burst为5
      #brust的意思就是,如果第1秒、2,3,4秒请求为19个,
      #第5秒的请求为25个是被允许的。
      #但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
      #nodelay,如果不设置该选项,严格使用平均速率限制请求数,
      #第1秒25个请求时,5个请求放到第2秒执行,
      #设置nodelay,25个请求将在第1秒执行。
      limit_req zone=allips burst=5 nodelay;
      ...
    }
    ...
  }
  ...
}

limit_zone只能定义在http作用域,limit_conn可以定义在http server location作用域


服务器全局限IP

http{
  ...
  #定义一个名为one的limit_zone,大小10M内存来存储session,
  #以$binary_remote_addr 为key
  #nginx 1.18以后用limit_conn_zone替换了limit_conn
  #且只能放在http作用域
  limit_conn_zone  one $binary_remote_addr 10m;
  ...
  server{
    ...
    location {
      ...
      limit_conn one 20;     #连接数限制
      #带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k
      limit_rate 500k;    
      ...
    }
    ...
  }
  ...
}
#vi nginx.conf
  allow 10.57.22.172;
  deny all;


指定目录的IP访问限制

实现重点

    正则表达式中()和|的使用,()代表一个原则,|代表或
    nginx的location匹配规则中,有一条按照文件顺序进行正则匹配(ps:可以把需要匹配的目录放置在server模块开始的位置)
    allow和deny的使用


示例
目录结构

根目录/srv/
test1 / --  hello.php
test2/  --  hello.php
test3/  --  hello.php
test4/  --  {hello.php,1.php,2.php}

访问需求
对于test1,test2目录,只允许指定的192.168.1.101ip地址访问,禁止其它ip访问
对于其他目录的php程序,所有ip地址均可以访问

实现的nginx配置文件

#指定目录实行白名单访问机制
location ~ ^/(test1|test2)/ {
  allow 192.168.1.101;
  deny all;
  
  root /srv/; 
  fastcgi_param  HTTPS  on;
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass  php5_fpm;
}
  
  # proxy the PHP scripts to fpm
  location ~ .php$ {
  root /srv/; 
  fastcgi_param  HTTPS  on;
    include /etc/nginx/fastcgi_params; 
    fastcgi_pass  php5_fpm;
  }

注意事项:
  1. deny 一定要加一个ip,否则直接跳转到403,不往下执行了;如果403默认页是同一域名下,会造成死循环访问;
  2. allow的ip段
  从允许访问的段位从小到大排列,如127.0.0.0/24 下面才能是10.10.0.0/16
  24表示子网掩码:255.255.255.0
  16表示子网掩码:255.255.0.0
  8表示子网掩码:255.0.0.0
  3. deny all;结尾 表示除了上面allow的其他都禁止
如:

 
复制代码代码如下:
 
deny 192.168.1.1;           
allow 127.0.0.0/24;
allo w 192.168.0.0/16;
allow 10.10.0.0/16;
deny all;

免责声明:文章转载自《nginx 限制ip访问频率和限速 (摘录)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jmeter远程多机负载进行性能测试bootstrap添加多个模态对话框支持下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Nginx安装与配置(Nginx服务器和Tomcat服务器是不同的服务器)

1.【nginx-server】将nginx的源代码上传到nginx服务器之中,同时还需要上传一些其他的辅助组件 2.【nginx-server】如果当前的主机上没有特定的编译环境,那么一定要在系统下载如下的环境包: •apt-get update •apt-get -y install make g++ gcc libpcre3 libpcrecpp*...

在阿里云创建子域名,配置nginx,使用pm2部署node项目到ubuntu服务器

配置域名 在阿里云找到主域名   进入主域名之后,右上角添加解析,添加子域名, 记录类型选择cname,主机记录填写子域名的名称,记录值为主域名,至此阿里云已经配置好了。 检查nginx安装 首先检查服务器是否安装nginx:   find / -name 'nginx.conf'  -ls   或者   ps -ef|grep nginx   安装ng...

[MySQL] mysql地理位置服务geometry字段类型

这个字段类型是mysql5.7新增的功能,主要就是解决坐标存储和距离计算的常见问题 创建表:CREATE TABLE `service` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(128) NOT NULL DEFAULT '',`content` varchar(128) NOT NU...

nginx的反向代理缓存

假设有两台物理机,他们分属于不同的域名,以webgame的游戏运营商和开发商为例,运营商需要获取游戏中的排行数据,开发商为了过多对游戏服务器的请求,会在发起请求的机器上设置缓存(或是让运营商定时过来抓取一次数据) nginx设置web缓存,需要用到的相关指令: 1、proxy_cache 2、proxy_cache_path 3、proxy_cache_v...

Spring boot中最大连接数、最大线程数与最大等待数在生产中的异常场景

在上周三下午时,客户、业务和测试人员同时反溃生产环境登录进入不了系统,我亲自测试时,第一次登录进去了,待退出后再登录时,复现了客户的问题,场景像是请求连接被拒绝了,分析后判断是spring boot的连接数使用完了,于是重启了服务,客户访问都恢复正常。虽然问题暂时解决了,但实质原因还无法确定。根据分析,判断是spring boot服务连接被拒绝,查看配置的...

Nginx核心知识100讲学习笔记(陶辉)Nginx架构基础(四)

一、红黑树 1、红黑树 2、红黑树复杂度 3、使用红黑树的模块 1、本地内存做的红黑树 ngx_conf_module ngx_event_timer_rbtree #管理定时器的红黑树 2、管理定时器的红黑树 Ngx_http_file_cache Ngx_http_geo_module Ngx_http_limit_conn_module Ng...