Nginx黑名单与Django中间件:应对CC攻击的轻量级方案
本文针对Django项目遭遇CC攻击导致服务器CPU满载的问题,提供两种简单有效的防御策略。首先介绍通过Nginx配置文件设置IP黑名单以在接入层拦截恶意请求;其次展示如何在Django中编写自定义Middleware,基于Session实现简单的请求频率限制。这两种方法代码量少、部署快,能有效缓解高并发恶意请求对后端应用的冲击。
CC攻击下的服务器异常与排查
当Django项目遭遇CC攻击时,无需过度紧张,本文推荐两种简单且实用的应对技巧。
通常项目架构中,Nginx作为HTTP接入层负责分发请求至Django应用,后端启动10个uwsgi worker进程处理业务。
若突然发现网页打开严重卡顿,检查服务器状态会发现CPU使用率飙升至100%。

查看uwsgi日志后,往往能发现某个特定IP发起了大量请求,占用了所有worker资源。
针对此类情况,主要总结两种解决思路:
Nginx接入层黑名单配置
第一种方法是配置Nginx黑名单。
首先使用vi命令创建blockip.conf文件,并在其中输入需要封禁的IP地址。
deny x.x.x.x;
接着编辑nginx.conf主配置文件,在http{}配置块内添加对该黑名单文件的引用。
include blockip.conf;
配置完成后,需验证Nginx配置语法是否正确。
[root@server nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
确认无误后,执行命令重启Nginx服务使配置生效。
nginx -s reload
Django应用层中间件限速实现
第二种方法是在Django应用内部添加自定义中间件。
新建RequestBlockingMiddleware.py文件,实现具体的拦截逻辑。
import time
from django.core.exceptions import PermissionDenied
from django.utils.deprecation import MiddlewareMixin
MAX_REQUEST_PER_SECOND=2 #每秒访问次数
class RequestBlockingMiddleware(MiddlewareMixin):
def process_request(self,request):
now=time.time()
request_queue = request.session.get('request_queue',[])
if len(request_queue) < MAX_REQUEST_PER_SECOND:
request_queue.append(now)
request.session['request_queue']=request_queue
else:
time0=request_queue[0]
if (now-time0)<1:
raise PermissionDenied('Forbidden user agent')
request_queue.append(time.time())
request.session['request_queue']=request_queue[1:]
最后在setting.py配置文件中注册该中间件,确保其按顺序加载。
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'common.middleware.RequestBlockingMiddleware', #在sessions之后,auth之前
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
该中间件代码不足100行,部署后日志中不再出现恶意IP的请求记录,攻击者可能正对着被禁用的页面感到沮丧。
以上关于Nginx黑名单与Django限速的防恶意请求方法分享完毕,希望能为读者提供参考,欢迎支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













