nginx
中的lua waf
,建议用openresty
。基于
loveshell/ngx_lua_waf
改造如果需要检测IP所在地区,本库使用
lua-resty-maxminddb
检索,IP地址库使用Loyalsoldier/geoip
的Country.mmdb
IP白名单、IP黑名单、UA白名单(针对搜索引擎)、境外IP过滤、UA过滤、CC攻击检测、URL白名单、URL过滤、GET参数、COOKIE过滤、POST参数过滤
<img alt="waf检测流程">
./cls_lua_waf/ # 项目根目录
| access.lua # access_by_lua_file 对应的文件
| config.lua # cls_lua_waf 配置文件
| init.lua # init_by_lua_file 对应的文件
| log.lua # log_by_lua_file 对应的文件
| README.md
|
+---data/ # 数据目录
| Country.mmdb # geoip数据文件(配合maxminddb用)
|
+---lib/ # 工具库目录
| | ccutil.lua # CC检测工具
| | cc_redis.lua # CC检测redis存储的具体实现
| | cc_shared_dict.lua # CC检测shared_dict存储的具体实现
| | ipmatcher.lua # IP CIDR工具类,支持IPv4 IPv6的CIDR格式匹配(源自api7/lua-resty-ipmatcher)
| | ipmatcher_win.lua # ipmatcher改写,方便windows下开发(调用系统 ws2_32.dll)
| | maxminddb.lua # maxminddb数据检索类(源自lua-resty-maxminddb)
| | util.lua # 自定义工具
| |
| \---libmaxminddb_win/ # maxminddb类的windows动态链接库
| libmaxminddb.dll # windows下使用需要配置 config.lib_libmaxminddb_path = 此文件路径
|
\---rules/ # 规则目录
args # query参数过滤规则
cookie # cookie过滤规则
ip_black # IP黑名单(支持IPv4 IPv6的CIDR格式)
ip_white # IP白名单(支持IPv4 IPv6的CIDR格式)
post # post参数过滤规则
url # url过滤规则
url_white # url白名单
user_agent # user-agent过滤规则
user_agent_white # user-agent白名单,针对搜索引擎蜘蛛要放行
安装好
openresty
或nginx
+luajit
+lua-nginx-module
(安装教程请自行度娘)当前文档假设已安装好
openresty
- 安装目录为
/usr/local/openresty
- 配置文件目录为
/usr/local/openresty/nginx/conf/
nginx
主配置文件为/usr/local/openresty/nginx/conf/nginx.conf
本库使用
libmaxminddb
(https://github.com/maxmind/libmaxminddb) 作为IP地址查询工具请下载最新
libmaxminddb
库并安装 (写此文档时版本为 1.7.1)
$ wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz
$ tar -zxvf libmaxminddb-1.7.1
$ cd libmaxminddb-1.7.1
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig
# 默认安装路径 /usr/local/lib/libmaxminddb.so
# 此路径需要在 ./cls_lua_waf/config.lua 文件中使用
补充: 定期更新 IP地址库
IP地址库保存路径
./cls_lua_waf/data/Country.mmdb
IP地址库项目地址 https://github.com/Loyalsoldier/geoip
下载
Country.mmdb
即可
# 项目备用下载地址 # https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/Country.mmdb # 也可自定义定时任务自动下载 # 每周六00:00下载文件保存到 /usr/local/openresty/nginx/conf/cls_lua_waf/data/Country.mmdb 0 0 * * 6 wget -O /usr/local/openresty/nginx/conf/cls_lua_waf/data/Country.mmdb https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/Country.mmdb
cls_lua_waf
目录整个复制到 /usr/local/openresty/nginx/conf/
下./cls_lua_waf/config.lua
相关配置(具体配置参考 完整配置文件 )nginx
主配置文件的 http
段中添加如下几行# ============= cls_lua_waf配置 START =============
# cls_waf_cc_dict 此共享内存主要保存cc相关特征变量,内存大小可自行设置(此处为50MB大小)
# 如果 ./cls_lua_waf/config.lua 配置文件中使用redis作为cc_dict_type(配置为 config.cc_dict_type = 'redis' ),则 cls_waf_cc_dict 这一行可注释
lua_shared_dict cls_waf_cc_dict 50m;
# 设置lua库加载路径(注意最后的 ;; 不可写错了)
lua_package_path "/usr/local/openresty/nginx/conf/cls_lua_waf/?.lua;;";
init_by_lua_file /usr/local/openresty/nginx/conf/cls_lua_waf/init.lua;
access_by_lua_file /usr/local/openresty/nginx/conf/cls_lua_waf/access.lua;
log_by_lua_file /usr/local/openresty/nginx/conf/cls_lua_waf/log.lua;
# ============= cls_lua_waf配置 END =============
(此步骤非必须) 在 ./cls_lua_waf/rules/ 规则目录下各个文件可自行添加自定义规则
规则文件中,以 ## 开头的行是注释行,不作为规则(不支持行内注释)
重载/重启 nginx
** 任何 lua
文件的修改,都需要重载/重启 nginx
# 如果使用 systemd
$ systemctl reload nginx # 重载 nginx (生产环境下建议重载)
$ systemctl restart nginx # 重启 nginx
# 如果其他linux
# 检测配置文件正确性
$ /usr/local/openresty/nginx/sbin/nginx -t -c /usr/local/openresty/nginx/conf/nginx.conf
# 重载 nginx
$ /usr/local/openresty/nginx/sbin/nginx -s reload -c /usr/local/openresty/nginx/conf/nginx.conf
# 停止 nginx
$ /usr/local/openresty/nginx/sbin/nginx -s stop
# 启动 nginx
$ /usr/local/openresty/nginx/sbin/nginx -s start
-- ./cls_lua_waf/config.lua 文件
local config = {}
-- 总开关
config.waf_enable = "on"
-- 记录waf拦截日志
config.waf_log = "on"
-- waf拦截日志路径(绝对路径,确保nginx用户有写权限;文件未生成前,所属目录需要有写权限)
-- 文件名可自定义,只要nginx用户有写权限即可。
-- 我的配置值 "/www/wwwlogs/cls_lua_waf_nginx.log"
-- 此处文件名以 _nginx.log 结尾,是因为我的环境用 logrotate 定时处理日志,已经有 *nginx.log 的规则,省点事。
config.waf_log_file = "/www/wwwlogs/cls_lua_waf_nginx.log"
-- waf基础目录(绝对路径,库中规则目录及某些文件路径依此路径)
-- 比如: "/usr/local/openresty/nginx/conf/cls_lua_waf"
config.cls_waf_base_path = "/usr/local/openresty/nginx/conf/cls_lua_waf"
-- libmaxminddb编译安装后的库文件路径(绝对路径)
-- 主要用于境外IP检测,如果不需要检测境外IP(如ip_foreign_check="off"时),可忽略此配置项
-- linux下需要先安装libmaxminddb(项目地址 https://github.com/maxmind/libmaxminddb)
-- 默认安装路径 "/usr/local/lib/libmaxminddb.so"
-- windows下设置 config.cls_waf_base_path.."/lib/libmaxminddb_win/libmaxminddb.dll"
config.lib_libmaxminddb_path = "/usr/local/lib/libmaxminddb.so"
-- 是否开启IP白名单校验(白名单命中,后续校验都不做)
config.ip_white_check = "on"
-- IP白名单命中时是否记录日志(关闭可减少日志)
config.ip_white_log = "off"
-- 是否开启IP黑名单校验
config.ip_black_check = "on"
-- IP黑名单校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.ip_black_deny_return = 404
-- 是否开启境外IP禁止访问
config.ip_foreign_check = "off"
-- 境外IP禁止访问时,返回内容 (填写错误码或者'default'或者自定义内容)
config.ip_foreign_deny_return = 404
-- 是否开启user-agent白名单校验(开启可放行搜索引擎蜘蛛UA白名单)
config.user_agent_white_check = "on"
-- user-agent白名单命中时是否记录日志(关闭可减少日志)
config.user_agent_white_log = "off"
-- 是否开启user-agent校验
config.user_agent_check = "on"
-- user-agent校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.user_agent_deny_return = 404
-- 是否开启url白名单校验
config.url_white_check = "on"
-- url白名单命中时是否记录日志(关闭可减少日志)
config.url_white_log = "off"
-- 是否开启url校验
config.url_check = "on"
-- url校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.url_deny_return = 404
-- 是否开启args参数校验
config.args_check = "on"
-- args参数校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.args_deny_return = 404
-- 是否开启cookie校验
config.cookie_check = "on"
-- cookie校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.cookie_deny_return = 404
-- 是否开启post参数校验
config.post_check = "on"
-- post参数校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.post_deny_return = 404
-- 是否开启CC校验
config.cc_check = "on"
-- CC频率 单位:请求次数N/M秒 默认100/60:60秒请求100次即触发CC攻击
config.cc_rate = "100/60"
-- CC校验不通过时,返回内容 (填写错误码或者'default'或者自定义内容)
config.cc_deny_return = 404
-- CC检测命中,封锁IP时长(单位:秒,如果为0则永久封锁)
config.cc_ip_lock_time = 300
-- CC防护使用的数据存储类型('redis'/'shared_dict')
-- 如果使用redis,需要正确配置下方redis相关配置项
-- 如果使用shared_dict,需要在 http 段配置 lua_shared_dict cls_waf_cc_dict 50m;
config.cc_dict_type = 'redis'
-- redis主机
config.redis_host = "127.0.0.1"
-- redis端口
config.redis_port = 6379
-- redis数据库编号(默认0号库,通常可选0-15)
config.redis_db_index = 0
-- redis密码(没有留空字符串)
config.redis_password = ''
-- 防火墙拦截后,默认返回内容
config.default_return_html = [[MMP...]]
return config
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。