V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
c137rick
V2EX  ›  分享创造

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

  •  
  •   c137rick · 2021-03-31 20:25:24 +08:00 · 2429 次点击
    这是一个创建于 1359 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    相关链接

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

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

    功能完整

    • IP 黑白名单,支持 IPV4 和 IPV6,支持地址块的表示。
    • CC 防护,自动拉黑恶意 IP 一段时间。
    • URL 和 Referer 黑白名单,使用正则写规则。
    • POST 、User-Agent 、Query String 和 Cookie 黑名单,使用正则写规则。

    使用简单

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

    # 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 ~

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

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

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

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

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

    如果我说的有什么问题欢迎指教。
    c137rick
        3
    c137rick  
    OP
       2021-04-01 11:34:38 +08:00
    @no1xsyzy #1 如果不谈本模块,想要通过优化正则引擎来避免 ReDoS 的话我暂时我没想到什么好的办法。我想要不然限制回溯次数,要不然用不会回溯的正则引擎。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1231 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 18:06 · PVG 02:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.