1、首先NGINX安装lua模块,参考前面文章
Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP-CSDN博客
ngx_lua_module 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本。
ngx_lua模块的原理
1. 每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;
2. 将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;
3. 每个外部请求都由一个Lua协程处理,协程之间数据隔离;
4. Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;
5. I/O等异步操作完成时还原相关协程上下文数据,并继续运行
2、安装
# 进入目录
cd /user/local/src/
# 下载v0.10.9rc7.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
# 解压
tar -xzvf v0.10.9rc7.tar.gz
#安装Nginx和依赖模块
# 进入目录
cd /user/local/src/
# 下载
wget http://nginx.org/download/nginx-1.21.0.tar.gz
# 解压
tar xf nginx-1.21.0.tar.gz
# 进入nginx目录
cd nginx-1.21.0
# 编译加入如下语句
--add-module=/usr/local/src/lua-nginx-module-0.10.9rc7
# 安装
make
make install #这步视情况执行,之前编译过NGINX不需要执行,没编译过需执行
添加nginx配置,在server块里添加下面内容
root@localhost\]# vim /usr/local/nginx/conf/nginx.conf location /lua { default_type 'text/plain'; content_by_lua 'ngx.say("hello, lua")'; } # 检查语法 \[root@localhost\]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful # 启动 \[root@localhost\]# nginx # 测试 curl 127.0.0.1/lua #安装ngx_lua_waf # 进入目录 cd /user/local/src/ # 把ngx_lua_waf下载到conf目录下 wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip # 解压命名为waf unzip master.zip -d /usr/local/nginx/conf/ # 更改目录名 mv /usr/local/nginx/conf/ngx_lua_waf-master /usr/local/nginx/conf/waf # 在nginx.conf的http段添加 lua_package_path "/usr/local/nginx/conf/waf/?.lua"; lua_shared_dict limit 10m; init_by_lua_file /usr/local/nginx/conf/waf/init.lua; access_by_lua_file /usr/local/nginx/conf/waf/waf.lua; # 创建日志目录 mkdir /usr/local/nginx/logs/hack chown www /usr/local/nginx/logs/hack # Lua_waf 配置 \[root@localhost\]# cat config.lua # 规则存放路径 RulePath = "/usr/local/nginx/conf/waf/wafconf/" # 是否开启攻击信息记录,需要配置logdir attacklog = "on" # log存储目录,该目录需要用户自己新建,切需要nginx用户的可写权限 logdir = "/usr/local/nginx/logs/hack/" # 是否拦截url访问 UrlDeny="on" # 是否拦截后重定向 Redirect="on" # 是否拦截cookie攻击 CookieMatch="on" # 是否拦截post攻击 postMatch="on" # 是否开启URL白名单 whiteModule="on" # 填写不允许上传文件后缀类型 black_fileExt={"php","jsp"} # ip白名单,多个ip用逗号分隔 ipWhitelist={"127.0.0.1"} # ip黑名单,多个ip用逗号分隔 ipBlocklist={"192.168.10.1"} # 是否开启拦截cc攻击(需要nginx.conf的http段增加lua_shared_dict limit 10m;) CCDeny="off" # 设置cc攻击频率,单位为秒. # 默认1分钟同一个IP只能请求同一个地址100次 CCrate="100/60" # 告警内容 html= \[
规则文件
root@localhost\]# ll wafconf/ total 24 -rw-r--r-- 1 root root 749 Apr 6 2016 args -rw-r--r-- 1 root root 652 Apr 6 2016 cookie -rw-r--r-- 1 root root 733 Apr 6 2016 post -rw-r--r-- 1 root root 335 Apr 6 2016 url -rw-r--r-- 1 root root 177 Apr 6 2016 user-agent -rw-r--r-- 1 root root 8 Apr 6 2016 whiteurl args里面的规则get参数进行过滤的 cookie是对请求过滤的cookie过滤 url是只在get请求url过滤的规则 post是只在post请求过滤的规则 whiteurl是白名单,里面的url匹配到不做过滤 user-agent是对user-agent的过滤规则 # 加载Nginx \[root@localhost\]# nginx -s reload #测试效果 访问带有参数的URL http://192.168.20.205/?id=\