Nginx如何配置可以限制ddos攻击

Isoracle 2013-01-30 03:31:57
诚心求教各位csdn的大神Nginx的问题:
我们公司现在用Nginx做反向代理,apache做web服务器;为了防止外网用户恶意访问我们的网站,我们希望能在Nginx上设置limit_conn_zone和limit_req_zone模块去限制用户访问并发连接数和一段时间的访问频率,但是领导希望能针对每个用户去限制(例如一个公司局域网内部的每个用户,他们访问Nginx都是同一个IP)。
我想问3个问题:
1.Nginx的limit_conn_zone和limit_req_zone模块是针对session的限制吗?我的意思就是说它们不会仅仅通过ip去区分不同的用户
2.各位大神实际工作中,为了防止外网用户的恶意访问,Nginx都有哪些设置呢?我上面说的利用limit_conn_zone和limit_req_zone模块的思路是不是正确的?
3.我们领导说的希望针对每个不同的用户去限制,而不是针对每个ip去限制(存在同一个ip对应多个用户),这种方式是否有必要?
...全文
1586 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Isoracle 2013-02-04
  • 打赏
  • 举报
回复
引用 25 楼 yifulou 的回复:
引用 24 楼 sbwanghailong 的回复:引用 22 楼 yifulou 的回复:引用 20 楼 sbwanghailong 的回复:引用 17 楼 yufulou 的回复:引用 15 楼 sbwanghailong 的回复:引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 ……
不是这样,现在问题不是关注外网的用户,而是关注在apache 1上的php程序了,正是因为php程序调用了大量接口才导致apache2出现问题的
yifulou 2013-02-04
  • 打赏
  • 举报
回复
引用 24 楼 sbwanghailong 的回复:
引用 22 楼 yifulou 的回复:引用 20 楼 sbwanghailong 的回复:引用 17 楼 yufulou 的回复:引用 15 楼 sbwanghailong 的回复:引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 ……
所以问题还是在如何判断访问apache1的用户呗,首先,你在apache1上写个help类,客户必须没法改啊,但是,你还是没法判断到底是不是同一个用户访问apache1啊,跟以前的问题一样不是么。。。 还是考虑用nginx模块限定最大请求数和每个ip的请求数靠谱。。。
ci1699 2013-02-04
  • 打赏
  • 举报
回复
引用 5 楼 sbwanghailong 的回复:
引用 4 楼 ci1699 的回复:防cc还好, 针对每个不同的用户去限制,这个不好判断吧。 终于有人回了,太感谢了! 领导这么要求,我也没办法。。。 不过我现在还有个问题想向您请教: 前台一个页面,访问后台7个接口;但前台一个哥们把访问后台接口的方法放进了for循环中,循环几百次,差点导致后台崩溃,现在我就想想个办法限制这种情况出现。 我有2个想法: 1.……
limit_req_zone、 limit_req不是可以限制速率么,并限制每秒可访问数,这样就避免频繁查询了。
Isoracle 2013-02-04
  • 打赏
  • 举报
回复
引用 22 楼 yifulou 的回复:
引用 20 楼 sbwanghailong 的回复:引用 17 楼 yufulou 的回复:引用 15 楼 sbwanghailong 的回复:引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7……
大哥,我上面回复了,你再看看吧,下午又要我去讨论这个方案。。。 我现在方案就是在apache 1上的php架构中增加一个help类,apache 1上的所有php程序必须通过我的help类来访问apache 2上的接口,然后help类实现计数的功能,判断访问次数是否超过限制。 大哥,你再给点意见,我心里挺虚的,我就是个菜鸟,还一直要我做什么方案。。。领导只会批评,从来给不了什么有用的建议。。。。
Isoracle 2013-02-04
  • 打赏
  • 举报
回复
我先说下我们这边的架构: 1.最前面是一个Nginx的反向代理服务器; 2.后面连着一台apache服务器,叫做apache 1吧; 3.apache 1后面又连着一台apache服务器,叫做apache 2吧。 我再说下流程: 1.用户访问我们的网站,是先访问Nginx的; 2.Nginx再访问apache1; 3.apache 1如果需要调用后台接口,就通过curl访问apache 2. 我说下现在的问题: 前台的一个人写了个公用的函数放在apache 1上来调用apache 2上的后台接口,因为是公用方法,所以每次都调用很多个后台接口;前台有一个php程序(这个php程序就放在apache 1上)利用这个公用方法来调用后台的接口(其实只需要1个接口,但因为调用的是公用函数,所以每次都会调用很多多余的接口),当用户(在Nginx前面的外网用户)频繁访问apache 1上的这个php程序时,会导致后台apache2出问题。 我其实也不太明白前台和后台的概念,只是公司的同事都说是前台,我也就认为是前台。确实,我这里的前台就是指apache1这台服务器,我这边说的后台就是指apache 2 这台服务器
yifulou 2013-02-04
  • 打赏
  • 举报
回复
引用 20 楼 sbwanghailong 的回复:
引用 17 楼 yufulou 的回复:引用 15 楼 sbwanghailong 的回复:引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 ……
看前面已经看晕了,如果help类是一个php类,内网用户怎么可能还有能力修改里面代码??? 你这流程到底是怎样的?最好从用户输入开始,一步步说清楚 help类可以只实例化一个,但这和静态不静态变量,单例不单例就没关系了,需要有一个一直存在的进程,他去实例化help类,其他进程去访问这个进程的help实例 前台用curl发送请求?前台还是php,那你的所谓要判断的用户,实际是一个个服务器是吗?
Isoracle 2013-02-04
  • 打赏
  • 举报
回复
引用 19 楼 craboy1 的回复:
ip都能伪装,何况用户那。至于接口重复调用,那应该是程序责任,没必要再加上统计,浪费资源。不过统计出接口每天的访问量。突然多了,说明那出问题了,DDOS软件很难防得住吧
“接口重复调用”我也觉得这个是调用接口的程序自己来限制调用次数最方便了,但也有人说,万一有坏人就是写了个程序,大量调用你的接口,你该怎么办呢?
Isoracle 2013-02-04
  • 打赏
  • 举报
回复
引用 17 楼 yufulou 的回复:
引用 15 楼 sbwanghailong 的回复:引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要……
今天早上和领导讨论了下,领导的方案就是:在前台写个help类,help类作用就是统计调用次数,如果调用次数不超过限制就去调用后台接口,否则就报错。 其实这个就是我一开始的方案,不过当时领导说这种方法不行,只要内网用户把help类代码一修改就没用了。 我现在想问问: 1.help类用什么方式来计数?第一种方法是用一个全局变量(其实前台就是一个php程序,然后通过help类来调用后台接口,所以一个页面请求就执行一次前台的php程序,可以用全局变量来统计调用的次数);第二种方法是在help类里定义一个私有的静态变量来计数,但这样的话就要限制help类一次只能实例化一个;我不知道那种方法更好,亦或者还有更好的方法。 2.help类能不能通过某种方式让前台用户只能用而不能去修改其中的代码,这样我觉得有1个好处:help类中的计数值不会被修改,这样就可以正确统计程序中接口调用的次数。 3.我们现在前台其实是通过curl发送http请求来调用后台接口,这样我觉完全可以不通过help类来访问后台接口,有没有什么方法来限制前台用户只能通过help类来访问(我能想到的就是help类发送一个标志位,表示这个http请求时help类发出的,或者更高级一点help类发送一个消息认证码)
craboy1 2013-02-04
  • 打赏
  • 举报
回复
ip都能伪装,何况用户那。至于接口重复调用,那应该是程序责任,没必要再加上统计,浪费资源。不过统计出接口每天的访问量。突然多了,说明那出问题了,DDOS软件很难防得住吧
yufulou 2013-02-04
  • 打赏
  • 举报
回复
关键用ip判断除了内网问题,并且也防不住DDOS啊。。。愿你领导给个思路,毕竟都想了这么多了,可能就真是我能力问题了。。。你可以跟他说说这些想法,着实求思路。。。
yufulou 2013-02-04
  • 打赏
  • 举报
回复
引用 15 楼 sbwanghailong 的回复:
引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要根据用户来设置限制呢? DDOS攻击的频率是任何一……
那我能想到的就是用nginx模块对每个ip并发连接数做限制了,虽然有内网ip问题,但还能咋判断呢?让你们领导给个思路最好。。。 后台除了ip,也没别的办法定位到人了啊,毕竟也拿不到mac地址,还能怎么判断呢。。。?但也只能靠后台记录,因为靠前台记录的话,客户想改,怎么都能改,比如前台用session(我的意思虽然后台保存session,但需要前台记录session值以保持连接)或者cookie记录次数的话,客户清一下cookie就都搞定了,再请求上来,次数还是空的,session的话还是没有,照样没法判断。 如果你领导最后告诉你思路的话,麻烦也告诉我一下~~谢谢~~
Isoracle 2013-02-04
  • 打赏
  • 举报
回复
引用 28 楼 yifulou 的回复:
刚看你上面的提问,是说你能确定用户,但是不能知道调用完以后的返回信息处理吗? 但根本用不着后台知道谁在调用接口,这是你前台php去检查的啊,你前台计数完了,没到调用上限,就调用后台接口,你等后台调用完了,自然会给你返回一个完成信息,你再把那个人调用的总数-1(这个计数你存到一个所有进程都能访问的公共地方不就不用考虑单例不单例的了么。。。),再把结果返回给用户,如果接……
大哥,谢谢你的回复!其实关于这个限频的问题确实我一开始理解错了,ddos攻击和内网用户调用后台接口不是一回事。我现在的方案也是Nginx那边用limit模块去限制,apache这边的话我准备用一个help的代理类来做。 刚刚和领导这边过了方案,领导大体说方案基本可以,但对于help类领导有更高的需求,他的意思是希望能利用help类来隔离前台和后台(我的理解就是隔离apache1和apache2),而且help类不仅能统计调用后台接口的次数,还能统计访问memcache次数,访问数据库次数等等,统计信息还要能打日志,最后还要是分布式的日志,并且help类的处理方式不能是简单的终止程序,要更符合实际,不然线网会崩溃的。 我感觉这个help类是个大项目,不是那么好做的,现在也没什么思路。
yifulou 2013-02-04
  • 打赏
  • 举报
回复
刚看你上面的提问,是说你能确定用户,但是不能知道调用完以后的返回信息处理吗? 但根本用不着后台知道谁在调用接口,这是你前台php去检查的啊,你前台计数完了,没到调用上限,就调用后台接口,你等后台调用完了,自然会给你返回一个完成信息,你再把那个人调用的总数-1(这个计数你存到一个所有进程都能访问的公共地方不就不用考虑单例不单例的了么。。。),再把结果返回给用户,如果接收后台接口的完成信息是同步的,就这样按顺序写下去不就行了? 如果接收完成信息是异步的,那这个完成信息里必须包含一个能让你前台找到是谁调用的一个标记,否则,必须找不到到底是哪个完成了啊,那后台必须得改啊
yifulou 2013-02-04
  • 打赏
  • 举报
回复
引用 26 楼 sbwanghailong 的回复:
引用 25 楼 yifulou 的回复:引用 24 楼 sbwanghailong 的回复:引用 22 楼 yifulou 的回复:引用 20 楼 sbwanghailong 的回复:引用 17 楼 yufulou 的回复:引用 15 楼 sbwanghailong 的回复:引用 14 楼 yufulou 的回复:引用 13 楼 sbwanghailong 的回复:引用 ……
那如果是这样,你就在apache1上来个计数不就行了么?这跟你提问时候所说的不就根本不是一回事了么。。。:“3.我们领导说的希望针对每个不同的用户去限制,而不是针对每个ip去限制(存在同一个ip对应多个用户)”
Isoracle 2013-02-03
  • 打赏
  • 举报
回复
引用 14 楼 yufulou 的回复:
引用 13 楼 sbwanghailong 的回复:引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要根据用户来设置限制呢? DDOS攻击的频率是任何一个用户都做不到的,不然怎么可能随便搞垮服……
你这个方法是不是不能区别谁在调用方法f1?也就是说,不管谁调用了方法f1,只要调用方法f1的次数达到一定数量,我就禁止了(这是我对你说的方案的理解,不知道对不对)。 我们领导的原话是:“一个页面的请求一般也就调用后台5个接口,如果一个页面调用了50个接口,是不是有问题?但是,如果10个相同页面同时请求,虽然也是调用50个接口,但这个是合理的,你不能禁止这种情况。。。”所以我感觉你说的这个方法还是不能解决我的问题。 我是小白,有说错的地方,您多见谅。。。
yufulou 2013-02-03
  • 打赏
  • 举报
回复
引用 13 楼 sbwanghailong 的回复:
引用 12 楼 yufulou 的回复:引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要根据用户来设置限制呢? DDOS攻击的频率是任何一个用户都做不到的,不然怎么可能随便搞垮服务器。大可不必如此 嗯,我也觉得是这样的,周一我要……
直接返回那就按我上面说的“B的f1做的工作就是:检查执行了的次数,如果超过,就返回不让调用的信息,否则,调用类A的f1” 执行次数方面,要把执行次数存储在一个存储器中,B里的f1方法,在你执行他的时候,先把次数从存储器中取出来,检查次数超没超,没超,加1再存回去,执行A的f1,存储器可用互斥文件或者memcached或者数据库等等,但一定要用相关的锁机制保证进程安全(就为保证你别刚读出来,结果被别的进程给改了,然后你覆盖回去的时候又把之前人家写的给覆盖了)这三种都有各自的办法,上网找找吧。等执行完了,你再按上面的办法减1再存回去就行啦。
Isoracle 2013-02-03
  • 打赏
  • 举报
回复
引用 12 楼 yufulou 的回复:
引用 11 楼 sbwanghailong 的回复:引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要根据用户来设置限制呢? DDOS攻击的频率是任何一个用户都做不到的,不然怎么可能随便搞垮服务器。大可不必如此 嗯,我也觉得是这样的,周一我要和领导说说这个。。 另外,我想问下:假……
太感谢你的回复!大神,怎么把你说的代理类用到下面的消息队列模式中?这个我还是不太明白。 还有你说的这个消息队列我感觉有点复杂,有没有简单一点的,比如直接返回禁止执行的
yufulou 2013-02-03
  • 打赏
  • 举报
回复
引用 11 楼 sbwanghailong 的回复:
引用 8 楼 yufulou 的回复:引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要根据用户来设置限制呢? DDOS攻击的频率是任何一个用户都做不到的,不然怎么可能随便搞垮服务器。大可不必如此 嗯,我也觉得是这样的,周一我要和领导说说这个。。 另外,我想问下:假设web前台写了个程序A来调用web后台的接口,因为……
你领导说的办法对,其实他想做的就是你说那个意思呗,代理模式的意思就是,如果你有个类A,有个方法f1,代理类就是一个类B,里面也有个方法f1(可以叫别的哈,叫这个好理解),B的f1做的工作就是:检查执行了的次数(如果困扰你的是这个,往下看),如果超过,就返回不让调用的信息,否则,调用类A的f1,这就叫代理模式了~~ 如果走消息队列的模式,即目标让所有请求都执行,哪怕等待,而不是返回禁止执行的消息: 第一步: 前台程序 --》 任务管理器(接收前台信息,并创建唯一id,把时间戳和id写入该消息成员中,记入消息队列,再把id返回给前台) --》 按消息队列顺序,调用应用程序 --》 记录结果入文件(或数据库,或memcached等等存储容器中) 第二步: 前台程序(收到唯一id) --》 定时ajax请求后台,带着唯一id --》 后台任务管理器检查该id的消息是否已执行,1、执行完了,读取记录结果,返回给用户,2)没执行,更新消息时间戳,3)正在执行,返回相应信息 第三步: 任务管理器每隔一段时间检查消息队列中是否存在过期的消息,即时间超过一定限制,则在消息队列中删除,说明前台任务关闭,不需要执行该消息了 没细想,可能可以简化一下,但大体意思是这样~~
Isoracle 2013-02-03
  • 打赏
  • 举报
回复
引用 8 楼 yufulou 的回复:
引用 7 楼 sbwanghailong 的回复:引用 6 楼 dream1206 的回复:为什么要根据用户来设置限制呢? DDOS攻击的频率是任何一个用户都做不到的,不然怎么可能随便搞垮服务器。大可不必如此 嗯,我也觉得是这样的,周一我要和领导说说这个。。 另外,我想问下:假设web前台写了个程序A来调用web后台的接口,因为程序A就是返回一个web页面给用户,所……
原来你回复了我后来的问题,不好意思没看到。对于这个问题,我领导的意思是希望我做一个代理类出来,使得每个访问后台接口的程序都先经过这个代理类处理,这个类的作用就是对于一个前台程序中调用后台接口的次数计数,如果一个前台程序调用后台接口太频繁就不让调用。但是我觉得困难的地方就是,从后台的角度看,我根本不知道调用后台接口的是同一个前台程序还是几个前台程序,我的理解就是不管多少个程序调用后台接口,只要频率太快我就限制不让调用,我觉得这样比较好实现,也比较合理,不知道我的理解是否正确。大神请赐教啊,这个问题困扰我很久了,在公司被人鄙视,说我连这个小问题都解决不了,哎,郁闷。。。。
Isoracle 2013-02-03
  • 打赏
  • 举报
回复
引用 9 楼 yufulou 的回复:
引用 楼主 sbwanghailong 的回复:诚心求教各位csdn的大神Nginx的问题: 我们公司现在用Nginx做反向代理,apache做web服务器;为了防止外网用户恶意访问我们的网站,我们希望能在Nginx上设置limit_conn_zone和limit_req_zone模块去限制用户访问并发连接数和一段时间的访问频率,但是领导希望能针对每个用户去限制(例如一……
谢谢你的回复!你的意思是我在后台程序里直接对每个接口的调用次数计数,如果调用太频繁,我就待会在执行,或者干脆不执行。不知道我的理解对不对? 你在看看我后来提的问题,你觉得该怎么解决呢?跪求大神了。。。。
加载更多回复(9)

4,250

社区成员

发帖
与我相关
我的任务
社区描述
国内外优秀PHP框架讨论学习
社区管理员
  • Framework
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧