1. 为什么需要关注fail2ban的封禁记录
fail2ban作为Linux系统上最流行的入侵防御工具之一,它通过监控系统日志文件(如/var/log/auth.log、/var/log/secure等)来检测恶意行为。当某个IP地址在短时间内多次触发预设的失败规则(如SSH密码错误、暴力破解等)时,fail2ban会自动将该IP加入防火墙规则进行封禁。
在实际运维工作中,我们经常需要检查:
- 当前被封锁的IP列表
- 历史上哪些IP被封锁过
- 每个IP被封锁的具体原因和时间
- 封锁是否已经自动解除
这些信息对于安全审计、攻击溯源和规则调优都至关重要。比如发现某个IP频繁尝试暴力破解,可能需要永久封禁;或者发现大量误报,则需要调整fail2ban的匹配规则。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 查看当前被封锁的IP列表
2.1 使用fail2ban-client命令
最直接的方式是使用fail2ban自带的客户端工具:
bash复制sudo fail2ban-client status
这会显示所有已启用的jail(监控规则组),例如:
code复制Status
|- Number of jail: 2
`- Jail list: sshd, nginx-botsearch
要查看具体某个jail的封锁情况,比如sshd:
bash复制sudo fail2ban-client status sshd
输出示例:
code复制Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 125
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 15
`- Banned IP list: 192.168.1.100
其中"Banned IP list"就是当前被封锁的IP。
2.2 直接查询防火墙规则
由于fail2ban底层是通过iptables/nftables实现封禁,也可以直接查看防火墙规则:
对于iptables:
bash复制sudo iptables -L -n
对于nftables:
bash复制sudo nft list ruleset
查找包含"f2b-"前缀的链(chain),这些就是fail2ban创建的规则。
3. 查询历史封禁记录
fail2ban默认不会永久保存历史封禁记录,但我们可以通过以下几种方式获取历史信息:
3.1 查看fail2ban日志
主日志文件通常位于:
bash复制sudo cat /var/log/fail2ban.log
或者使用journalctl(systemd系统):
bash复制sudo journalctl -u fail2ban --no-pager
日志中会记录类似这样的条目:
code复制2024-03-15 14:23:45,413 fail2ban.actions [12345]: NOTICE [sshd] Ban 192.168.1.100
2024-03-15 15:23:45,413 fail2ban.actions [12345]: NOTICE [sshd] Unban 192.168.1.100
3.2 使用fail2ban的数据库功能(需配置)
fail2ban支持将封禁记录存入SQLite数据库,需要在配置文件中启用:
编辑/etc/fail2ban/jail.conf或/etc/fail2ban/jail.local,添加:
ini复制[sshd]
enabled = true
# 其他配置...
dbfile = /var/lib/fail2ban/fail2ban.sqlite3
dbpurgeage = 30d # 保留30天记录
然后重启fail2ban:
bash复制sudo systemctl restart fail2ban
查询数据库:
bash复制sudo sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "SELECT * FROM bans;"
3.3 解析系统日志
原始的系统日志也包含了fail2ban的决策依据,例如查看SSH失败尝试:
bash复制sudo grep 'Failed password' /var/log/auth.log
4. 高级查询与管理技巧
4.1 使用fail2ban-regex测试规则
在调整规则前,可以先测试匹配效果:
bash复制sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
4.2 手动封禁/解封IP
临时封禁某个IP:
bash复制sudo fail2ban-client set sshd banip 192.168.1.100
解封某个IP:
bash复制sudo fail2ban-client set sshd unbanip 192.168.1.100
4.3 查看封禁时长
每个jail的封禁时长定义在配置文件中,通常为:
bash复制sudo grep 'bantime' /etc/fail2ban/jail.local
默认通常是10分钟(600秒)。
4.4 监控fail2ban状态
实时监控fail2ban日志:
bash复制sudo tail -f /var/log/fail2ban.log
5. 常见问题排查
5.1 为什么看不到被封禁的IP?
可能原因:
- 封禁时间已过(检查bantime设置)
- fail2ban服务未正常运行(检查状态:
sudo systemctl status fail2ban) - 防火墙规则被手动清除
5.2 封禁不生效怎么办?
检查步骤:
- 确认jail已启用:
sudo fail2ban-client status - 检查日志匹配:
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf - 确认防火墙类型配置正确(iptables/nftables)
5.3 如何永久封禁某个IP?
在jail配置中添加:
ini复制[sshd]
ignoreip = 192.168.1.100 # 白名单IP
或者手动添加到防火墙:
bash复制sudo iptables -A INPUT -s 192.168.1.100 -j DROP
6. 安全建议与最佳实践
-
日志轮转配置:确保日志不会过快轮转,否则fail2ban可能错过关键事件
bash复制sudo nano /etc/logrotate.d/fail2ban -
定期审计规则:检查是否有误封或漏封情况
bash复制sudo fail2ban-client status -
多维度防护:不要仅依赖fail2ban,还应:
- 修改SSH默认端口
- 使用密钥认证替代密码
- 启用防火墙默认拒绝策略
-
备份配置:修改前备份配置文件
bash复制sudo cp /etc/fail2ban/jail.{conf,local} -
邮件通知:配置邮件提醒(需安装sendmail或postfix)
ini复制[sshd] action = %(action_mwl)s
在长期使用fail2ban的过程中,我发现最有效的策略是结合短期自动封禁和长期人工分析。自动封禁可以应对即时威胁,而定期分析历史记录则能发现潜在的安全隐患。比如曾经通过分析历史记录发现一个IP段持续尝试不同服务的爆破,最终确认是内网扫描行为。
