Citadel邮件服务器的fail2ban failregex规则失效问题求助
问题重现
示例系统日志条目
Jul 15 10:23:45 mail-server citadel[1472]: Login failed for user 'john' from 192.168.0.201
Jul 15 10:24:01 mail-server citadel[1473]: Authentication failed for 'jane' from 203.0.113.12
Jul 15 10:24:15 mail-server citadel[1474]: Login failed for user 'admin' from 172.16.0.5
Jul 15 10:24:30 mail-server citadel[1475]: Authentication failed for 'guest' from 198.51.100.33
Jul 15 10:24:45 mail-server citadel[1476]: Login failed for user 'test' from 10.0.0.12
Jul 15 10:25:00 mail-server citadel[1477]: Authentication failed for 'dummy' from 169.254.1.1
失效的failregex规则
failregex = ^%(__prefix_line)sLogin failed for user .* from <HOST>$
测试结果
使用fail2ban-regex test.log /etc/fail2ban/filter.d/citadel.conf测试后,6条日志均未匹配成功。
原因分析
- 规则覆盖范围不足:原规则仅匹配
Login failed类型的日志,但Citadel登录失败还会输出Authentication failed类型的日志,这部分完全被遗漏。 - 进程格式匹配问题:原规则未显式匹配Citadel进程的
[PID]后缀(比如citadel[1472]),如果__prefix_line变量未包含进程ID部分,会导致前缀匹配失败。
修复后的failregex规则
替换原有规则为以下内容,可覆盖所有登录失败场景并正确匹配IP:
failregex = ^%(__prefix_line)scitadel\[\d+\]: (Login failed for user .* from|Authentication failed for .* from) <HOST>$
规则说明
%(__prefix_line)s:匹配fail2ban内置的系统日志前缀(包含日期、主机名)citadel\[\d+\]:匹配带进程ID的Citadel进程名(转义[和]避免正则语法冲突)(Login failed...|Authentication failed...):同时匹配两种登录失败的日志文本<HOST>:fail2ban内置变量,自动匹配IPv4/IPv6地址
验证方法
重新执行测试命令,确认所有日志均被匹配:
fail2ban-regex test.log /etc/fail2ban/filter.d/citadel.conf
正常情况下会输出6 matched的结果,说明规则生效。
内容的提问来源于stack exchange,提问作者ksimp

