利用 Nginx Lua Redis 实现 CC 防御
- 技术架构
- 2017-03-23
- 5热度
- 10评论
前言
之前有写过两篇 利用 NGINX 和 LuaJIT 构建简单的 WAF 和 Openstar – 基于 OpenResty 的高性能 WAF 拓展,不过两者其实都蛮复杂的,很多情况下像一些管理员的正常操作可能也会被误判,所以今天讲一个简单点的 WAF。
介绍
Nginx Lua Redis 防止CC攻击实现原理:同一个外网IP、同一个网址(ngx.var.request_uri)、同一个客户端(http_user_agent)在某一段时间(CCseconds)内访问某个网址(ngx.var.request_uri)超过指定次数(CCcount),则禁止这个外网IP+同一个客户端(md5(IP+ngx.var.http_user_agent)访问这个网址(ngx.var.request_uri)一段时间(blackseconds)。
设置
Nginx Lua Redis 依赖 Lua,推荐使用 OpenResty,因为这货就是 OpenResty 的作者写的,而且 Nginx 安装 Lua 还麻烦。
教程,假设 OpenResty 安装在 /usr/local/openresty ,Nginx 配置文件在 /usr/local/openresty/nginx/conf/nginx.conf
加载 Redis
cd /usr/local/openresty/lualib/redis
wget https://github.com/openresty/lua-resty-redis/raw/master/lib/resty/redis.lua
在 /usr/local/openresty/nginx/conf/nginx.conf 的 http{} 块中添加(就是 server{}块的上一层):
lua_package_path "/usr/local/openresty/lualib/redis/redis.lua;;";
配置 WAF
/usr/local/openresty/lualib/redis/
https://gist.github.com/ivmm/231e974afba1edcde6776e1e827e238a/raw/4eef07d2c7d42695c1abcba3876c437c4f4cb0b7/waf.lua
如果 Redis 不是 6379 端口或者不在本机记得改一下
加载WAF
在虚拟主机配置文件中加入:
access_by_lua_file "/usr/local/openresty/lualib/redis/waf.lua";
然后重启 Nginx/OpenResty 即可。





