nginx实际上支持插件,这些插件其中就可以使用lua语言编写。苏南大叔最近看了一个开源的代码,就是使用luanginx增加了个防火墙功能。功能听起来非常强大,看代码的话,其实也并不复杂。

苏南大叔:nginx的lua语言编程,如何编写一个nginx防火墙? - nginx-lua
nginx的lua语言编程,如何编写一个nginx防火墙?(图6-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录一系列计算机编程代码的事情。本文中,苏南大叔将要以一个开源代码为例,讲述一个nginx防火墙的lua语言编程的小故事。

测试环境:centos@7.9nginx@1.20.2。其实这个防火墙里面的大部分功能,其实都可以通过nginx本身的配置来实现的,不过这种lua的方式是更加灵活的。该防火墙就是nginx的一个插件,可以用于拦截特定请求,返回指定内容。

ngx_lua_waf开源代码

这款nginx防火墙的源码地址是:

苏南大叔:nginx的lua语言编程,如何编写一个nginx防火墙? - ngx_lua_waf
nginx的lua语言编程,如何编写一个nginx防火墙?(图6-2)

gitee上面也有镜像地址:

这里做一下苏南大叔的安装说明文件理解:

  • 关于ngx_lua_wafreadme.md文件呢,也就是要辩证的看,理解其精髓就好。比如,里面会指定存放的位置,实际上是可以移动到任何你喜欢的位置的,只要配置好相对路径关系就好。
  • 关于ngx_lua_wafinstall.sh文件呢,其实就是安装了一个lua的解释器及相关环境,然后再次下载了一下nginx还有当前的ngx_lua_waf脚本。所以,如果你系统里面已经支持lua语言的话,或者已经安装好nginx的话,这个install.sh脚本就最好别执行了,或者有针对性的执行也可以。千万别无脑执行install.sh

安装lua语言解释环境

lua语言的官方网站是:

不用担心不会写lua代码,如果你看了本文中的源码的话,你会觉得分分钟就可以上手lua语言,看起来和其它已知的高级语言没有啥太大的区别。

苏南大叔:nginx的lua语言编程,如何编写一个nginx防火墙? - lua-jit
nginx的lua语言编程,如何编写一个nginx防火墙?(图6-3)

因为是在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的lua语言编程,如何编写一个nginx防火墙? - lua-waf
nginx的lua语言编程,如何编写一个nginx防火墙?(图6-4)

补充说明

这款nginx防火墙源码,其实也内置在了宝塔面板(测试版本:宝塔@7.9.0)中,只不过是没有默认开启的状态。
而且官方要卖自己的高级防火墙,还有免费可配置的防火墙,所以,开源的这一款就放弃了,仅供参考。

苏南大叔:nginx的lua语言编程,如何编写一个nginx防火墙? - waf-conf
nginx的lua语言编程,如何编写一个nginx防火墙?(图6-5)

另外,宝塔官方的这一款免费的防火墙下载安装后,查看源码的话,其实和这款开源的ngx_lua_waf代码逻辑也差不多,就是写法和结构不一样罢了。都是全明文的lua代码,大家都可以用来做参考。

苏南大叔:nginx的lua语言编程,如何编写一个nginx防火墙? - nginx-free-firewall
nginx的lua语言编程,如何编写一个nginx防火墙?(图6-6)

参考文献

结束语

这款开源的防火墙,还内置防止cc的功能,不过苏南大叔这边还没有测试效果咋样。nginx既然支持lua语言的编程,那么,仔细想想看,应该可以做出一些有意思的功能。不是么?

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。