nginx的lua语言编程,如何编写一个nginx防火墙?
发布于 作者:苏南大叔 来源:程序如此灵动~nginx
实际上支持插件,这些插件其中就可以使用lua
语言编写。苏南大叔最近看了一个开源的代码,就是使用lua
给nginx
增加了个防火墙功能。功能听起来非常强大,看代码的话,其实也并不复杂。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录一系列计算机编程代码的事情。本文中,苏南大叔将要以一个开源代码为例,讲述一个nginx
防火墙的lua
语言编程的小故事。
测试环境:centos@7.9
,nginx@1.20.2
。其实这个防火墙里面的大部分功能,其实都可以通过nginx
本身的配置来实现的,不过这种lua
的方式是更加灵活的。该防火墙就是nginx
的一个插件,可以用于拦截特定请求,返回指定内容。
ngx_lua_waf
开源代码
这款nginx
防火墙的源码地址是:
gitee
上面也有镜像地址:
这里做一下苏南大叔的安装说明文件理解:
- 关于
ngx_lua_waf
的readme.md
文件呢,也就是要辩证的看,理解其精髓就好。比如,里面会指定存放的位置,实际上是可以移动到任何你喜欢的位置的,只要配置好相对路径关系就好。 - 关于
ngx_lua_waf
的install.sh
文件呢,其实就是安装了一个lua
的解释器及相关环境,然后再次下载了一下nginx
还有当前的ngx_lua_waf
脚本。所以,如果你系统里面已经支持lua
语言的话,或者已经安装好nginx
的话,这个install.sh
脚本就最好别执行了,或者有针对性的执行也可以。千万别无脑执行install.sh
。
安装lua
语言解释环境
lua
语言的官方网站是:
不用担心不会写lua
代码,如果你看了本文中的源码的话,你会觉得分分钟就可以上手lua
语言,看起来和其它已知的高级语言没有啥太大的区别。
因为是在centos
上面做的测试,本文中的开源代码推荐安装的lua
解释器是lujit2.1
。具体可以查看install.sh
文件中的安装逻辑。
nginx
插件原理
这款源码文件非常的少,而且是全部明文的。大家一看就明白啥意思了。
首先,需要在nginx
配置中引入插件,配置三个参数即可:
lua_shared_dict limit 10m;
lua_package_path "/usr/local/nginx/conf/waf/?.lua";
init_by_lua_file /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;
然后再配置一下config.lua
文件中的路径:
RulePath = "/usr/local/nginx/conf/waf/wafconf/"
插件的主要逻辑就存放于waf.lua
之中,非常好理解。主要的流程是:然后对这些nginx
内置变量进行判断,如果没有通过检测,就显示预设的警告内容。
补充说明
这款nginx
防火墙源码,其实也内置在了宝塔面板(测试版本:宝塔@7.9.0)中,只不过是没有默认开启的状态。
而且官方要卖自己的高级防火墙,还有免费可配置的防火墙,所以,开源的这一款就放弃了,仅供参考。
另外,宝塔官方的这一款免费的防火墙下载安装后,查看源码的话,其实和这款开源的ngx_lua_waf
代码逻辑也差不多,就是写法和结构不一样罢了。都是全明文的lua
代码,大家都可以用来做参考。
参考文献
结束语
这款开源的防火墙,还内置防止cc
的功能,不过苏南大叔这边还没有测试效果咋样。nginx
既然支持lua
语言的编程,那么,仔细想想看,应该可以做出一些有意思的功能。不是么?
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。