Elastic Search规则配置求助:排除特定IP的防火墙拒绝告警
排除特定IP的Elastic Search监控规则配置方法
你之前尝试用正则负向预查的思路是对的,但有几个细节需要调整,另外还有更高效的配置方式,我给你详细说明:
推荐方法:使用Bool查询的must_not(性能更优)
比起正则表达式,用bool查询的must_not来精确排除IP是更清晰、性能更好的选择,尤其适合精确匹配场景。假设你的监控规则是基于Elastic Alerting(比如Watcher),配置示例如下:
{ "query": { "bool": { "must": [ // 这里是你原本匹配firewall_rejects的条件 { "match": { "event.action": "firewall_rejects" } } ], "must_not": [ // 精确排除目标IP,注意用keyword字段确保精确匹配 { "term": { "ip_address.keyword": "192.168.0.2" } } ] } } }
关键点:
- 确保使用
ip_address.keyword而不是ip_address(如果你的字段有keyword子字段的话),因为term查询是精确匹配,而默认的text字段会分词,可能导致匹配异常。 - 如果你的
ip_address本身就是keyword类型(没有text子字段),直接用ip_address即可。
修正你的正则表达式配置
如果你坚持要用正则,需要修正两个问题:正则里的点号要转义,并且要确保匹配整个IP字符串,避免误排除类似192.168.0.20这样的IP。正确的配置如下:
{ "filter": [ { "regexp": { "ip_address.keyword": "^(?!192\\.168\\.0\\.2$).*$" } } ] }
修正细节:
- 正则中的
.要转义成\\.(因为JSON里需要双重转义),否则.会匹配任意字符。 - 结尾加上
$,确保只有完全等于192.168.0.2的IP才会被排除,而不是开头匹配的IP。
额外思路:在Ingest Pipeline提前过滤
如果希望从源头就过滤掉这个IP的日志,可以在Ingest Pipeline中添加drop处理器,直接丢弃该IP的文档,这样后续监控规则就不会处理这些数据了:
{ "processors": [ { "drop": { "if": "ctx.ip_address == '192.168.0.2'" } } ] }
内容的提问来源于stack exchange,提问作者Pellegrini




