mirror of
https://github.com/ADD-SP/ngx_waf.git
synced 2026-04-26 22:15:55 +03:00
[GH-ISSUE #29] 一些问题希望得到帮助 #11
Labels
No labels
MacOS
Nginx
OpenResty
Tengine
bug
documentation
enhancement
needs-investigation
pull-request
question
stale
stale
stale
timeout
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
starred/ngx_waf#11
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @hibobmaster on GitHub (Apr 1, 2021).
Original GitHub issue: https://github.com/ADD-SP/ngx_waf/issues/29
规则优先级问题
在文档中写着CC防御检测高于IP 白名单检测
如果原站使用CDN比如cloudflare, 会不会出现cloudflare ip 触发cc被拉黑的情况?
我想的是将cf的ip添加到白名单中,但是看文档的优先级我不知道这样是否会起作用
url黑白名单检测
这个url是指location吗?比如 https://github.com/ADD-SP/ngx_waf
那么文档中的url指的是 location=/ADD-SP/ngx_waf 吗?
我看了看rules目录下的url规则,我有一点小混乱~
规则正则的书写
我想请教一下user-agent中的 (?i)(?:zgrab) 这个正则的意思
我看了http://www.pcre.org/current/doc/html/pcre2syntax.html的说明
(?...) named capture group (Perl)
(?:...) non-capture group
将说明代入到上面的正则不太理解,我推测是UA包含zgrab的意思,望大佬解答一二
可能问题有点小白,但还是想问问,感谢!
@ADD-SP commented on GitHub (Apr 1, 2021):
规则优先级问题
CC 防护的优先级确实高于 IP 白名单,即白名单中的 IP 也可能会被 CC 防护拦截,这是有意为之。不过确实对于 CDN 有点不友好,或许我应该改一下,如果你觉得需要改一下的话,麻烦说一下理由,我考虑一下。
url黑白名单检测
URL 指的就是 location,比如
https://www.example.com/test?a=b&c=d,对于本模块来说,url 就是test。规则正则的书写
(?i):i是 perl 的一个标志,表示不区分大小写。(?:): 一个非捕获组。(?i)(?:zgrab): 不区分大小写地测试非捕获组内的正则。其实如果区分大小写的话直接写
zgrab也行。@hibobmaster commented on GitHub (Apr 1, 2021):
关于优先级:
情景一:
比如有的服务器被直接ddos了, vps供应商有提供保护清洗,但是会屏蔽比如中国等地区,这个时候把cloudflare上的云朵点亮,国内用户也可以访问了
情景二:
有的网站希望只允许通过cloudflare访问
情景三:
有些网站程序非常消耗服务器的性能,非常的怕CC,比如phpbb, 你访问一下首页都会有mysql查询,而且缓存不了(设计上的原因),随便用apache的ab或者wrk测一下nginx就直接返回503了,所以对这种情况希望能用cloudflare的5秒盾或者验证码缓解一下(同时屏蔽非cf ip的访问),因此CDN还是很重要的
规则正则的书写:
(?i)(?:zgrab): 不区分大小写地测试非捕获组内的正则为什么是非捕获组,这些UA不是应该被捕获嘛(被抓起来)~
字面上的意思让人有点困惑
@ADD-SP commented on GitHub (Apr 1, 2021):
关于优先级
有道理,我会在下一个测试版中将 IP 白名单的优先级提高到 CC 防护之前。
规则正则的书写
正则中的捕获组通常是用来进行高级字符串处理的。比如正则
([0-9]+)\.([0-9]+),它可以匹配到浮点数,它有两个捕获组,分别用两个括号捕获。第一个捕获组用来取得整数部分,第二个捕获组用来取得小数部分。这样在编程的时候就能更方便地处理浮点数了。而非捕获组通常是起到一个调整优先级的作用。类似 C 语言的括号运算。算式
1 + 2 * 3,我希望先计算1 + 2,那么我就可以写成(1 + 2) * 3,即使用括号调整优先级。非捕获组就可以起到这种作用。(?i)(?:zgrab)我之所以这么写是懒得看 Perl 的优先级了,万一(?:i)只对后面的第一个字符有效呢。所以干脆用非捕获组括起来,就不用考虑优先级问题了。@hibobmaster commented on GitHub (Apr 1, 2021):
谢谢大佬,懂了!
@ADD-SP commented on GitHub (Apr 1, 2021):
@hibobmaster 测试版已经发布,可以试一下,已经调整了优先级。
v4.1.0-beta.2
@hibobmaster commented on GitHub (Apr 1, 2021):
@ADD-SP 由于不是很熟悉编译,花了些时间去学,回复晚了抱歉
网站在DNS处配置了中国大陆直连,海外走cf
经过在本地和服务器用wrk测试,优先级调整是成功的
1.本地用wrk测试之后,不开代理直连网站返回503
2.在vps上用wrk测试后,通过curl发现仍能正常访问
3.本地挂vps的代理访问网站不会出现403
综上,大佬的v4.1.0-beta2优先级调整是Okay的
不过这里又引出了一个问题,网站的服务器日志如果要记录访客的真实ip,使用下面的配置会导致白名单失效
我不加上面的配置,只要服务器没炸,任意情况通过cloudflare访问都是正常的
加了上面的配置,用vps curl 通过cloudflare访问也会返回503
我推测cc模块检测请求用的头或者某些逻辑是不是不太合理
用wrk分别连续测3次
网站加了获取真实ip配置的测试情况


没加获取真实ip配置的测试情况
前者第三次测试出现了大量非 2xx 或 3xx的响应(说明被ngx_waf拦截了)
日志: (173.82是我发起请求的vps的ip)
173.82.xxx.xxx - - [01/Apr/2021:03:35:43 -0400] "GET / HTTP/1.1" 503 197 "-" "Railgun/5.3.3"
173.82.xxx.xxx - - [01/Apr/2021:03:35:48 -0400] "GET / HTTP/1.1" 503 197 "-" "curl/7.64.0"
后者三次连续测试都没有遇到被拦截的情况,说明此时白名单是生效的
而且因为后者命中的是白名单规则,可以看出请求的效率也高得多
@hibobmaster commented on GitHub (Apr 1, 2021):
不确定cc检测请求依据的是什么来进行判断~
假设是上面能在日志记录访客真实ip的情况,拦截拦的是cf的ip还是依据cf传过来的头,做出动态的响应?
比如坏人A的ip是173.82.xxx.xxx那个ip做坏事,cloudflare的回源ip是 1.1.1.1
有一个好人B的ip是119.29.xxx.xxx,cloudflare的回源ip也是 1.1.1.1
然后A返回503,而B是什么情况?
我觉得理想状况是A返回503, B返回2xx或3xx
@ADD-SP commented on GitHub (Apr 1, 2021):
@hibobmaster
set_real_ip_from为模块ngx_http_realip_module的指令。如果使用
ngx_http_realip_module获取真实 IP 地址的话,本模块检查所使用的 IP 地址均为ngx_http_realip_module获取的 IP 地址。所以真实的情况就是 A 返回 503,B 则返回 2xx 或 3xx。
顺便问个问题,
ngx_http_realip_module获取真实 IP 后 access_log 中记录的 IP 是 CDN 的还是真实的?@hibobmaster commented on GitHub (Apr 1, 2021):
使用ngx_http_realip_module后access_log记录的是真实ip
完美!
@hibobmaster commented on GitHub (Apr 1, 2021):
大佬我还有一个问题
我是通过apt的方式安装nginx的,用的是nginx.io的包
下次更新的时候,我需不需要重新编译这个模块呢?
如果要我是不是得在更新前,先将模块编译好,放到指定位置
然后再apt upgrade
@ADD-SP commented on GitHub (Apr 1, 2021):
如果更新了版本,或者没有更新版本但是编译参数发生变化,都需要重新编译整个模块。不过保险起见,建议每次更新 nginx 都重新编译模块。并且是升级完成后重新编译。编译时需要用相同版本的 nginx 的源代码。
其实还有一个简单的办法我没有在文档里提,后续我补上。这个方法能减少编译的时间,但是仍然需要在升级后重新编译。
另一种安装动态模块的方式
运行下列命令,检查是否存在
--with-compat参数,如果存在则可以使用下文提到的方式编译安装动态模块。此时编译动态模块只需要在 nginx 源码目录下运行下面的命令
剩余的操作不变,拷贝动态模块然后加载即可。
性能问题的讨论
我发现你提供的图中请求被白名单放行时每秒 30 个请求,反之每秒 20 个请求。性能下降了三成左右,我觉得这并不高性能。所以想问一下你的配置,因为我这里测试的时候性能下降并没有这么多。
ps -elf | grep nginx查看。@hibobmaster commented on GitHub (Apr 1, 2021):
感谢大佬的回复,另一种安装动态模块的方式我晚点试试看
性能问题的讨论
正常的cc检测



关闭了真实ip,纯白名单
本地不走代理直接发起请求
可以看出后者性能高,由于服务器炸了,所以才报错
white-ipv4
white-ipv6
nginx.conf
@ADD-SP commented on GitHub (Apr 1, 2021):
好的,了解了,感谢支持!如果没什么问题的话就关掉 issue 吧,如果后续出现问题可以重新打开。
@hibobmaster commented on GitHub (Apr 1, 2021):
wordpress程序需要在white-url中加入
(?i)(?:wp-json\/wp\/v2\/posts)写文章的时候会出现 更新失败。 此响应不是合法的JSON响应
调出开发者控制台显示403 forbidden
然后将上述路径加入到了white-url中重启nginx,之后刷新页面,问题消失
@ADD-SP commented on GitHub (Apr 1, 2021):
我没有遇到这个情况,建议检查防护日志是否真的被防火墙拦截,并贴出拦截日志,我看看能不能修改默认规则。
@hibobmaster commented on GitHub (Apr 1, 2021):
在error log中找到了
提示Black-Post
可是这个请求是很正常的吧
@ADD-SP commented on GitHub (Apr 1, 2021):
可能是 wordpress 的文章中含有一些触发了规则的东西。可以将相关 URL 添加到白名单里,暂时不打算修改默认规则。
@hibobmaster commented on GitHub (Apr 1, 2021):
没关系,反正知道如何解决就行,谢谢大佬
@ADD-SP commented on GitHub (Apr 4, 2021):
@hibobmaster
最新的测试版 v5.0.0-beta.2,已经发布且比较稳定,如果两三天后没有大问题的话就会作为稳定版发布。
这个测试版包含了不兼容的更新,建议先熟悉一下。
@hibobmaster commented on GitHub (Apr 5, 2021):
感谢大佬,测试无问题~
规则命名更规范了而且更好用了
@ADD-SP commented on GitHub (Apr 5, 2021):
@hibobmaster
大问题,IP 黑白名单检测的代码被我手滑删掉了,更新一下吧,已经修复了。这个问题存在于好几个测试版。
@hibobmaster commented on GitHub (Apr 5, 2021):
哈哈,没事,难怪我今天给网站测压的时候效果不明显,装个beta.4试试看
@hibobmaster commented on GitHub (Apr 5, 2021):
@ADD-SP 大佬,我邮件发了个测压脚本给你,你有时间能试试不?
怎么样较好的防那种脚本的攻击~
@ADD-SP commented on GitHub (Apr 5, 2021):
已经回复邮件。
kerem referenced this issue2026-03-04 12:19:05 +03:00