<p>Fail2ban封禁phpMyAdmin暴力登录IP的核心前提是启用auth_log并验证日志写入成功;需在config.inc.php中配置$cfg['Servers'][$i]['auth_log']指向可写路径,如/var/log/phpmyadmin/auth.log,并设置正确权限,再通过tail验证失败记录是否生成,随后配置精准failregex锚定整行匹配“Failed login for .* from <HOST>”,并在jail.local中启用对应jail规则。</p>
fail2ban 要封 phpmyadmin 的暴力登录 ip,核心前提不是“配不配得上”,而是 auth_log 是否启用、日志里有没有带 <host></host> 的明确失败记录。默认完全不记录,直接配 fail2ban 一定无效。
phpMyAdmin 必须开启 auth_log 并验证写入成功
phpMyAdmin 不像 SSH 那样自动往 /var/log/auth.log 写失败记录,它需要手动启用认证日志功能,且路径必须可写。
- 编辑
config.inc.php,在$cfg['Servers'][$i]区块内添加:$cfg['Servers'][$i]['auth_log'] = '/var/log/phpmyadmin/auth.log'; - 确保目录存在且权限正确:
sudo mkdir -p /var/log/phpmyadmin && sudo chown www-data:www-data /var/log/phpmyadmin(Apache 下可能是apache或nginx用户) - 输错一次密码后执行:
tail -n 1 /var/log/phpmyadmin/auth.log,应看到类似Failed login for 'root' from 192.168.1.100的行;没输出就说明没生效,优先查 SELinux(ausearch -m avc -ts recent)和父目录属组
failregex 必须锚定整行且只匹配失败行为
日志里只要出现 Failed login 四个字,不代表就能直接用——可能混在调试信息或正常响应中。正则太宽会误封,太窄会漏封。
- 推荐 filter 文件
/etc/fail2ban/filter.d/phpmyadmin-auth.conf内容:[Definition] failregex = ^Failed login for .* from <HOST>$ ignoreregex =
-
^和$强制整行匹配,避免匹配到INFO: Failed login attempt...这类中间含关键词的行 - 不要写
.*Failed login.*<host></host>——开头结尾的.*会让正则失去边界控制 - 如果日志带时间戳(如
Jul 30 12:05:22 ...),需前置匹配:^\w{3} \d{1,2} \d{2}:\d{2}:\d{2} Failed login for .* from <host>$</host>
jail 配置要禁用默认 sshd 规则干扰
很多人配完发现 IP 没被封,其实是 jail 启用了 sshd 但没启用 phpmyadmin-auth,或者 logpath 指向了错误位置。
- 在
/etc/fail2ban/jail.local中添加:[phpmyadmin-auth] enabled = true filter = phpmyadmin-auth logpath = /var/log/phpmyadmin/auth.log maxretry = 3 findtime = 600 bantime = 3600
-
logpath必须和auth_log设置的路径完全一致,注意末尾不能多斜杠 - 确认没在
[DEFAULT]里设enabled = true——这会导致所有 jail 默认启用,而多数 filter 缺少对应日志,启动失败 - 重启后检查状态:
sudo fail2ban-client status phpmyadmin-auth,若显示Number of jail's failures: 0,说明日志路径或正则没匹配上
封禁动作依赖防火墙后端,不是 nginx 配置
Fail2ban 封 IP 是调用系统防火墙(iptables/nftables/firewalld),跟 Nginx 的 deny 指令无关。配置错后端,日志里能看到“ban”但实际 IP 仍能访问。
立即学习“PHP免费学习笔记(深入)”;
- 运行
sudo fail2ban-client status,看 “firewallcmd” 或 “nftables” 是否活跃;CentOS/RHEL 8+ 推荐用backend = firewallcmd-nft - 验证是否真封了:
sudo nft list chain inet filter f2b-phpmyadmin-auth(nftables)或sudo iptables -L f2b-phpmyadmin-auth -n(iptables) - 别在 nginx 配置里加
if ($remote_addr = xxx) { return 403; }——这是静态黑名单,和 Fail2ban 的动态封禁逻辑冲突,还容易拖慢请求处理
最常卡住的地方是:日志文件压根没生成、<host></host> 提取失败(正则没锚定)、jail 名称和 filter 名称不一致、防火墙后端未激活。每一步都得用 tail -f + fail2ban-client status 实时交叉验证,而不是凭感觉改完就等效果。



















