Fail2Ban保护FTP服务的关键在于精准识别失败登录、及时封禁且不误伤合法用户,需确认服务类型与日志路径,定制jail规则,验证filter匹配有效性,并确保banaction与防火墙(如firewalld)协同正确。

Fail2Ban 保护 FTP 服务,关键不在装上,而在精准识别失败登录、及时封禁、不误伤合法用户。生产环境的 FTP(如 vsftpd 或 proftpd)常暴露在公网,日志里频繁出现“530 Login incorrect”或“USER anonymous failed”这类记录,就是攻击信号。直接靠人工盯日志已不可行,Fail2Ban 是自动化响应的核心环节。
确认 FTP 服务类型与日志路径
Fail2Ban 必须知道从哪读日志、怎么识别失败行为。不同 FTP 服务日志格式差异大,不能套用默认规则:
-
vsftpd:默认日志路径为
/var/log/vsftpd.log,需确保配置中启用了xferlog_enable=YES和log_ftp_protocol=YES -
proftpd:常用日志路径是
/var/log/proftpd/proftpd.log或/var/log/proftpd/auth.log,取决于SystemLog和ExtendedLog设置 -
pure-ftpd:日志通常由
pure-uploadscript或系统日志统一输出,建议启用-d调试模式并重定向到独立文件,如/var/log/pure-ftpd.log
运行 sudo tail -f /var/log/your-ftp-log 实时观察几次错误登录,确认日志中是否包含 IP 地址、时间戳和明确的失败标识(如 FAIL LOGIN、530、authentication failure)。
启用并定制 FTP 的 jail 规则
不要改 /etc/fail2ban/jail.conf,直接编辑 /etc/fail2ban/jail.local,添加对应服务段:
[proftpd] enabled = true port = ftp,ftp-data filter = proftpd logpath = /var/log/proftpd/proftpd.log maxretry = 3 findtime = 600 bantime = 3600 ignoreip = 127.0.0.1/8 192.168.0.0/16 10.0.0.0/8
说明:
-
filter = proftpd表示使用/etc/fail2ban/filter.d/proftpd.conf中预置的正则匹配规则;若你用的是 vsftpd,对应写filter = vsftpd -
port填 FTP 主端口(21)及数据端口(20),Fail2Ban 会自动关联防火墙规则 -
ignoreip务必加入内网段和运维固定出口 IP,避免自己被锁在外面
验证过滤器是否真正生效
预置 filter 可能不完全匹配你的日志格式。例如,某些 vsftpd 日志含中文或特殊字段,会导致正则失效。检查方法:
- 执行
sudo fail2ban-regex /var/log/vsftpd.log /etc/fail2ban/filter.d/vsftpd.conf,看输出中Number of matches是否大于 0 - 若无匹配,打开
/etc/fail2ban/filter.d/vsftpd.conf,修改failregex行,例如将原正则替换为更宽松的:^.*\[(?<host>\S+)\].*530.*$ - 修改后重启服务:
sudo systemctl restart fail2ban,再用sudo fail2ban-client status proftpd查看当前封禁数
封禁动作与防火墙协同
Fail2Ban 默认调用 iptables,但 OpenEuler 或新版 CentOS 默认用 firewalld。需确认 action 配置正确:
- 检查
/etc/fail2ban/jail.local中是否设置了:banaction = firewallcmd-ipset(推荐)或banaction = firewallcmd-rich-rules - 确保 firewalld 正在运行:
sudo systemctl status firewalld,且未被 iptables 服务冲突 - 手动测试封禁:
sudo fail2ban-client set proftpd banip 192.168.1.100,再查sudo firewall-cmd --list-rich-rules | grep 192.168.1.100确认规则已写入
不复杂但容易忽略

















