我在这里遇到了一个问题,Fail2ban 无法识别 IP,因此我尝试禁止失败的 MySQL 访问,以下是系统日志受到监控
Sep 6 01:45:18 vps6XXXXX mysqld: 2019-09-06 1:45:18 140581192722176 [Warning] IP address '120.160.120.60' has been resolved to the host name '67.subnet120-160-120.speedy.telkom.net.id', which resembles IPv4-address itself.
Sep 6 01:45:18 vps6XXXXX mysqld: 2019-09-06 1:45:18 140581192722176 [Warning] Access denied for user 'global'@'120.160.120.60' (using password:YES)
但是,fail2ban 无法从120.160.120.60检测为0.0.0.7. 来自的日志文件fail2ban.log如下面所述
2019-09-06 01:45:18,742 fail2ban.filter [3793]: WARNING Determined IP using DNS Lookup: 7 = ['0.0.0.7']
2019-09-06 01:45:18,742 fail2ban.filter [3793]: INFO [mysql] Found 0.0.0.7
这是我的习惯filter.d mysql.conf正则表达式
[Definition]
failregex = ^.*\[Warning\] Access denied for user.*<HOST>.*\(using password: YES\)$
ignoreregex =
我不确定是 fail2ban 无法确定 IP 还是我的正则表达式无法完成工作。
我将非常感激任何针对此问题的建议或解决方案。谢谢。
答案1
原始问题中的正则表达式<HOST>
仅解析部分:
IP_V4_RE
:0.160.120.60
DNS
:0
(看https://github.com/fail2ban/fail2ban/search?q=IP_4_RE&unscoped_q=IP_4_RE有关 fail2ban 内部表达式的详细信息<HOST>
)
当调整到以下内容时,主机部分将被正确考虑:
failregex = ^.*\[Warning\] Access denied for user '[^']+'@'<HOST>' \(using password: YES\)$
自定义正则表达式似乎没有考虑其他可能性,例如在https://github.com/fail2ban/fail2ban/blob/0.11/config/filter.d/mysqld-auth.conf#L20
failregex = ^%(__prefix_line)s(?:\d+ |\d{6} \s?\d{1,2}:\d{2}:\d{2} )?\[\w+\] (?:\[[^\]]+\] )*Access denied for user '[^']+'@'<HOST>' (to database '[^']*'|\(using password: (YES|NO)\))*\s*$
答案2
尽管已知存在类似恼人的双时间戳问题(某些服务或 syslog 会写入双重日期时间,一个在前面,另一个在消息正文中),但我不知道为什么日志消息中的格式会因系统而异。
无论如何,现在应该修复了(见https://github.com/fail2ban/fail2ban/commit/50595b70fd4e2563ba816acf4877775eda36e248)。
顺便说一句。您的正则表达式有点“脆弱”,因为未锚定(^.*
没有意义)并且.*
在 之前和 之后包含 catch-all()<HOST>
。