fail2ban 是 linux 上通过分析应用层日志(如 nginx、ssh、nextcloud)识别恶意扫描并自动封禁 ip 的防御工具;支持 iptables/nftables/firewalld 联动,可配置邮件告警与多服务协同防护。

Fail2ban 是 Linux 上应对应用层恶意扫描最直接有效的自动化防御工具。它不替代防火墙,而是让防火墙“活起来”——通过分析真实服务日志(比如 Nginx 错误日志、SSH 认证日志、Nextcloud 登录日志),识别出扫描行为特征,再调用 iptables 或 nftables 实时封禁源 IP,并可联动邮件或脚本发出告警。
识别应用层扫描的关键日志特征
恶意扫描在日志中留下的痕迹比网络层扫描更具体,也更容易被 Fail2ban 捕捉:
- HTTP 层扫描:大量 404(路径爆破)、401/403(后台试探)、高频 POST 到 /wp-login.php、/admin/login 等;Nginx 的 error.log 中反复出现 “user authentication failed” 或 “no user/password provided” 可匹配自定义 filter
- SSH 暴力破解:/var/log/auth.log 中同一 IP 在短时间内出现多次 “Failed password for …”、“Invalid user …”,是 Fail2ban 默认最擅长识别的模式
- FTP/数据库试探:vsftpd 日志中的 “LOGIN FAILED”、MySQL 的 “Access denied for user” 都可配置专用 filter
- 工具指纹痕迹:部分扫描器(如 Nikto、Nmap HTTP scripts)会在 User-Agent 或请求头中暴露自身,可用正则直接匹配并触发封禁
配置 jail.local 实现多服务协同防护
不要修改 jail.conf,所有定制都写进 /etc/fail2ban/jail.local(该文件优先级更高,升级时不会被覆盖):
- 在 [DEFAULT] 区块统一设定基础策略:
bantime = 72h(封禁 3 天,对扫描 IP 足够震慑)
findtime = 1h(1 小时内累计触发才计数)
maxretry = 5(5 次失败即拉黑,对扫描行为足够敏感) - 启用并微调 SSH 防护:
[sshd]
enabled = true
port = 35222 (若改了非标端口,必须显式指定)
logpath = /var/log/auth.log (CentOS 用 /var/log/secure) - 增加 Web 层防护:
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
filter = nginx-http-auth (使用内置 filter,或自定义更严格的规则) - 保护后台系统(如 Nextcloud):
[nextcloud]
enabled = true
logpath = /var/www/nextcloud/data/nextcloud.log
filter = nextcloud
与防火墙正确联动,避免冲突
Fail2ban 必须明确知道用哪个后端管理封禁规则,否则可能失效或报错:
-
iptables 用户:确认 firewalld 已停用(
sudo systemctl stop firewalld && sudo systemctl disable firewalld),再安装 iptables-services(CentOS)或 iptables(Ubuntu),Fail2ban 默认走 iptables。 -
firewalld 用户:需在 jail.local 中指定:
banaction = firewallcmd-ipset
并确保 ipset 已安装(sudo yum install ipset或sudo apt install ipset),这样封禁效率更高、规则更干净。 - nftables 用户(较新系统):启用 banaction = nftables,并确认 nftables 服务运行中;Fail2ban v1.0+ 原生支持,无需额外适配。
配置邮件告警与状态监控
封禁本身不是终点,及时知晓才是运维闭环的关键:
- 在 jail.local 的 [DEFAULT] 下添加:
destemail = admin@yourdomain.com
sender = fail2ban@yourserver.local
mta = sendmail(或 postfix) - 启用 action_mw(mail-whois)动作,让每封告警附带 WHOIS 查询结果,快速判断攻击来源地域和 ISP。
- 日常检查命令:
sudo fail2ban-client status sshd— 查看当前 SSH 被封 IP 数量sudo fail2ban-client get sshd banned— 列出所有被封 IPsudo journalctl -u fail2ban -n 50 --no-pager— 查看最近 50 条 Fail2ban 运行日志











