如何设置能限制某个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访问数实例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

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:10mrate=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=5nodelay;

...

}

...

}

...

}

HttpLimitZoneModule 限制并发连接数实例

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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 one20;         #连接数限制

#带宽限制,对单个连接限数,如果一个ip两个连接,就是500x2k

limit_rate500k;

...

}

...

}

...

}

nginx白名单设置

以上配置会对所有的ip都进行限制,有些时候我们不希望对搜索引擎的蜘蛛或者自己测试ip进行限制,

对于特定的白名单ip我们可以借助geo指令实现。

1.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

http{

geo$limited{

default1;

#google

64.233.160.0/190;

65.52.0.0/140;

66.102.0.0/200;

66.249.64.0/190;

72.14.192.0/180;

74.125.0.0/160;

209.85.128.0/170;

216.239.32.0/190;

#M$

64.4.0.0/180;

157.60.0.0/160;

157.54.0.0/150;

157.56.0.0/140;

207.46.0.0/160;

207.68.192.0/200;

207.68.128.0/180;

#yahoo

8.12.144.0/240;

66.196.64.0/180;

66.228.160.0/190;

67.195.0.0/160;

74.6.0.0/160;

68.142.192.0/180;

72.30.0.0/160;

209.191.64.0/180;

#My IPs

127.0.0.1/320;

123.456.0.0/280;#example for your server CIDR

}

geo指令定义了一个白名单$limited变量,默认值为1,如果客户端ip在上面的范围内,$limited的值为0

2.使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真是的ip,这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问

map $limited $limit {

1 $binary_remote_addr;

0 "";

}

3.设置limit_req_zone和limit_req

limit_req_zone $limit zone=foo:1m rate=10r/m;

limit_req zone=foo burst=5;

最后我们使用ab压php-fpm的方式,对上面的方法效果实际测试下

例1:限制只允许一分钟内只允许一个ip访问60次配置,也就是平均每秒1次

首先我们准备一个php脚本放在根目录下$document_root

test.php

nginx配置增加limit_req_zone 和 limit_req

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

http{

...

limit_req_zone$binary_remote_addr zone=allips:10mrate=60r/m;

...

server{

...

location{

...

limit_req zone=allips;

...

}

...

}

...

}

ab -n 5 -c 1 http://www.weizhang.org/test.php

118.144.94.193 - - [22/Dec/2012:06:27:06 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:06:27:06 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:06:27:07 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

未设置brust和nodelay可以看到该配置只允许每秒访问1次,超出的请求返回503错误

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

http{

...

limit_req_zone$binary_remote_addr zone=allips:10mrate=60r/m;

...

server{

...

location{

...

limit_req zone=allips burst=1nodelay;

...

}

...

}

...

}

ab -n 5 -c 1 http://www.weizhang.org/test.php

118.144.94.193 - - [22/Dec/2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:07:01:00 +0000] "GET /test.php HTTP/1.0" 200 11000 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

118.144.94.193 - - [22/Dec/2012:07:01:01 +0000] "GET /test.php HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

设置brust=1和nodelay后允许第1秒处理两个请求。

转自:http://www.nginx.cn/446.html

php限制ip访问次数 并发_[转]nginx限制某个IP同一时间段的访问次数相关推荐

  1. php限制ip访问次数 并发_PHP实现redis限制单ip、单用户的访问次数功能示例

    本文实例讲述了PHP实现redis限制单ip.单用户的访问次数功能.分享给大家供大家参考,具体如下: 有时候我们需要限制一个api或页面访问的频率,例如单ip或单用户一分钟之内只能访问多少次 类似于这 ...

  2. ip访问次数统计 nginx_Linux分析Nginx日志统计IP访问次数的shell脚本

    平时运维遇到最多的就是nginx的日志分析了,要时常做系统监控,检查IP的访问次数是否有异常,防止恶意访问. 假设我的nginx日志如下: ....... 211.253.43.23 - - [03/ ...

  3. ip地址 默认网关_如何查找默认网关IP地址?

    ip地址 默认网关 The default gateway is a network term used to specify a special host that is used to acces ...

  4. java 根据ip获取mac地址_利用java如何根据IP获取mac地址

    利用java如何根据IP获取mac地址 发布时间:2020-11-25 15:49:42 来源:亿速云 阅读:74 作者:Leah 利用java如何根据IP获取mac地址?针对这个问题,这篇文章详细介 ...

  5. 易语言单窗口单ip软件源码_梦幻西游怎样多开ip转金?十大攻略秘籍速来看

    各位好!,我依然是小芝麻,近期几日总是有盆友在私聊我,"小芝麻看着你的转金专缉,那么多方式,能够 帮我建议一类,最安全可靠能用的吗?""小芝麻,你的转金攻略大全,我有点儿 ...

  6. ip申请 web应用_网络协议端口TCP/IP概览

    TCP TCP 用于从应用程序到网络的数据传输控制. TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组. =============================== ...

  7. tomcat加上了https后访问不了_西部数码使用指南:部署https后访问提示存在安全隐患的排查解决方法...

    版权归西部数码所有,原文链接:https://www.west.cn/faq/list.asp?unid=2374 部署https后访问域名出现如下提示: 您的连接存在安全隐患 此网站使用的安全性配置 ...

  8. 安卓studio访问mysql数据库_小白通过JDBC在AndroidStudio一步步来访问MYSQL数据库-Go语言中文社区...

    许久没来写博客了,不是因为没有时间,而是把时间拿来敲一些设计模式,数据结构了,毕业不是科班出身,还是得练习下基本功. 今天突然想玩玩JDBC,说做就做,这里记录我的整个操作过程,数据的流程参与互联网上 ...

  9. nginx 防止恶意域名解析_配置nginx只允许域名访问,禁止ip访问【图文教程】

    平凡也就两个字: 懒和惰;成功也就两个字: 苦和勤;优秀也就两个字: 你和我.跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!每一篇文章都是心 ...

最新文章

  1. sql server 2005 T-SQL BEGIN TRANSACTION (Transact-SQL)
  2. Forbidden Attack:7万台web服务器陷入被攻击的险境
  3. android之下载416错误
  4. 框架:@Bean注解
  5. html input或textarea 如何在光标处插入内容
  6. 寻找GridView中模板列中的控件
  7. 保留数据给硬盘增加分区
  8. java datasource 配置_Spring boot 基于注解方式配置datasource
  9. LINUX编译OPENJDK:The tested endian intarget (big) differs from the endian expected to be found in the
  10. Yii2的redis扩展
  11. 刘汝佳第二章习题(前四)
  12. pdf打不开无法启动计算机丢失,电脑打开PDF文档时发生错误文件已损坏怎么修复...
  13. 对泊松分布的一点理解
  14. 海龟交易法则(中译文)
  15. 关于阿里云服务器的使用(入门级)
  16. leetcode 笨阶乘
  17. 什么是堆漏洞挖掘?堆的glibc实现、Arena(main_arena、thread_arena)
  18. 辰视携3D机器视觉技术亮相第九届中国电子信息博览会
  19. 基于 uni-app 和 uni-cloud 小程序项目开发实战
  20. 讲真话、求真知、做真我——Facebook COO桑德伯格2012哈佛商学院毕业演讲

热门文章

  1. (72)进程挂靠(attach)使用备用APC队列 SavedApcState 保存父进程 APC 队列,分析 NtReadVirtualMemory
  2. 【内网渗透】利用非常规手段突破安全策略上线CS
  3. 【Web安全】JSP内存马研究
  4. 【技术原创】MailEnable开发指南
  5. 1.API的调用过程(3环部分)
  6. do while循环猜电脑给出的随机数
  7. C语言常见的错误类型
  8. python开发跟淘宝有关联微_使用Python分析淘宝用户行为
  9. 系统设计说明书案例_案例 | 太阳能+热泵枸杞烘干系统设计及经济性分析
  10. 架构评审,技术总监怒了,丢给我 400 个架构案例,先研究透!