利用 Nginx Lua Redis 实现 CC 防御

前言

之前有写过两篇 利用 NGINX 和 LuaJIT 构建简单的 WAFOpenstar – 基于 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.confhttp{} 块中添加(就是 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 即可。

10 条评论

发表评论

*