ngx_waf--完整、简单、高性能的 nginx 防火墙模块

2021-03-31 20:25:24 +08:00
 c137rick

ngx_waf 是一个用 C 语言开发的 nginx 防火墙模块。

相关链接

Github: https://github.com/ADD-SP/ngx_waf

文档也可以在 Github 上找到,文档自认为很详细。

功能完整

使用简单

配置简单,配置只需要五行。提供默认规则,开箱即用。

# on 表示启用,off 表示关闭。
waf on;

# 规则文件所在目录的绝对路径,必须以 / 结尾。
waf_rule_path /path/to/rules/;

# 防火墙工作模式,STD 表示标准模式。
waf_mode STD;

# CC 防御参数,1000 每分钟请求次数上限,60 表示超出上限后封禁对应 ip 60 分钟。
waf_cc_deny_limit 1000 60;

# 用于缓存检查结果的内存空间的大小,设置为 10 MB 。目前仅开发版可用。
waf_cache_size 10m;

高性能

IP 黑白名单的检查花费常数时间,即花费的时间与 IP 黑白名单的规模无关。

其余的检查会挨个匹配正则,直到匹配到为止。匹配结果会被缓存起来,下次检查时就可以直接读取缓存的结果。目前仅开发版启用了缓存,经过测试已经基本稳定。

POST 检查的结果不会缓存,因为太占内存。

如果你愿意的话也可以测试性能哦,有问题的话欢迎指教。

其它

之前的帖子:一个 nginx 防火墙模块: ngx_waf

之前在 V2EX 宣传过这个项目,现在再发一次的理由是优化了性能,原本都是暴力循环的,现在都已经优化了。

再发一次的目的自然是想多涨点 star,所以如果觉得好用的话记得点个 star ~

2434 次点击
所在节点    分享创造
3 条回复
no1xsyzy
2021-04-01 00:27:39 +08:00
话说正则引擎这东西能够被恰当地优化来避免它造成损伤吗?
最近看到 https://blog.doyensec.com/ 这个思路非常神奇
(也不妨在该项目相关文档中推荐一下如何“避免被 ReDoS”)
(话说 benchmark(,,,,,) 这种恶意负载该条规则的匹配时间会是随逗号数量的平方时间吧)
c137rick
2021-04-01 11:19:06 +08:00
@no1xsyzy #1 这个问题之前有考虑过,不过貌似不需要做优化。因为本模块使用 pcre 库,而 pcre 已经提供了两种方式可以在一定程度上限制了回溯的次数。

第一种方式就是在编译时通过指定 `--with-match-limit=n` 参数来限制主循环计数器的上限,超出上限自动结束。

第二种方式就是在运行时修改计数器的上限,有相应的函数。

再加上开发版中已经开始缓存正则的匹配结果,故本模块有一定的抗 ReDos 能力。

我在项目文档里提一下这个问题吧,不过似乎并不那么严重。

如果我说的有什么问题欢迎指教。
c137rick
2021-04-01 11:34:38 +08:00
@no1xsyzy #1 如果不谈本模块,想要通过优化正则引擎来避免 ReDoS 的话我暂时我没想到什么好的办法。我想要不然限制回溯次数,要不然用不会回溯的正则引擎。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766989

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX