如何在Fail2ban中编写匹配带端口或逗号后缀IP地址的正则表达式
如何在Fail2ban中编写匹配带端口或逗号后缀IP地址的正则表达式
嗨Storm,别担心英语的问题~我来帮你搞定这个Fail2ban的正则匹配难题!
从你给出的日志片段来看,问题确实出在IP地址后面跟着的:端口,或者直接,——默认的<HOST>占位符没法自动忽略这些后缀,所以我们需要自定义正则来精准提取纯IP地址。
核心思路
我们需要写一个正则,既能匹配IP:端口,的格式,也能匹配IP,的格式,同时只捕获前面的IP部分作为封禁目标。
具体配置方法
- 编辑你的Fail2ban过滤规则文件(比如
/etc/fail2ban/filter.d/smtp-spam.conf,文件名可以自定义) - 写入以下配置内容:
[Definition] # 先定义一个匹配IPv4地址的正则(如果需要严格匹配0-255的网段,可以用注释里的版本) _host = \b(?:\d{1,3}\.){3}\d{1,3}\b # 严格版IPv4正则:_host = \b(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\b # 匹配日志行的完整正则,覆盖两种IP后缀情况 failregex = ^\[[^\]]+\] SMTP Spam attack detected from <_host>(?::\d+,|,).*$ ignoreregex =
配置解释
^\[[^\]]+\]:匹配日志开头的时间戳部分(比如[08/Apr/2023 17:48:27])<_host>:就是我们上面定义的IP地址正则,负责捕获纯IP(?::\d+,|,):非捕获组,用来匹配IP后面的两种后缀情况——要么是:端口号,,要么是直接,.*$:匹配日志行剩下的所有内容
验证正则是否有效
配置好后,你可以用Fail2ban自带的测试工具验证:
fail2ban-regex "/var/log/your-smtp-log.log" "/etc/fail2ban/filter.d/smtp-spam.conf"
如果输出里显示“Matches”数量正确,就说明正则生效了。
额外扩展
如果你的日志里还存在IP后面没有任何后缀的情况(比如直接以IP结尾),可以把正则里的后缀部分改成(?::\d+,|,|$),这样就能同时匹配IP单独出现的场景。
这样应该就能完美匹配你日志里的各种IP格式啦,有问题再随时问~
备注:内容来源于stack exchange,提问作者Storm
相关产品推荐
相关产品推荐

