fail2ban 是一个开源的Linux 系统安全的重要工具,通过自动检测和阻止恶意行为,有效防止Linux 服务器遭受暴力破解攻击。它通过监控系统日志文件(如 /var/log/auth.log)来检测恶意行为,如多次失败的 SSH 登录尝试,然后自动更新防火墙规则来阻止这些攻击者的 IP 地址。正确配置和使用 fail2ban 可以显著提高服务器的安全性,同时减少管理员手动干预的工作量。
Debian/Ubuntu 安装
sudo apt update
sudo apt install fail2ban
RHEL/CentOS 安装
sudo yum install epel-release
sudo yum install fail2ban
fail2ban 配置文件:
/etc/fail2ban/jail.conf #主配置文件(不建议直接修改)
/etc/fail2ban/jail.local #用户自定义配置(推荐在此修改)
创建自定义配置文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
fail2ban 常用命令
启动/停止/重启服务
sudo systemctl start fail2ban # 启动服务
sudo systemctl stop fail2ban # 停止服务
sudo systemctl restart fail2ban # 重启服务
sudo systemctl enable fail2ban # 设置开机自启
#查看服务状态
sudo systemctl status fail2ban
#查看被封禁的 IP
sudo fail2ban-client status sshd
#解封特定 IP
sudo fail2ban-client set sshd unbanip 192.168.1.100
#手动封禁 IP
sudo fail2ban-client set sshd banip 192.168.1.100
fail2ban 配置文件详解
主要配置参数实例
[DEFAULT]
# 忽略的 IP 地址(白名单)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# 封禁时间(秒)
bantime = 600
# 检测时间窗口(秒)
findtime = 600
# 最大尝试次数
maxretry = 6
# 使用的防火墙后端
banaction = iptables-multiport
[sshd]
# 是否启用 SSH 保护
enabled = true
# 日志文件路径
logpath = %(sshd_log)s
# 过滤器名称
filter = sshd
# 端口号
port = ssh
自定义过滤器
过滤器定义在 /etc/fail2ban/filter.d/ 目录中。例如,创建自定义 SSH 过滤器:
复制默认 SSH 过滤器:
sudo cp /etc/fail2ban/filter.d/sshd.conf /etc/fail2ban/filter.d/sshd-custom.conf
编辑自定义过滤器,修改正则表达式以匹配特定的失败模式。
fail2ban 实战示例
保护 SSH 服务
编辑 jail.local 文件:
sudo nano /etc/fail2ban/jail.local
添加或修改以下内容:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
重启 fail2ban 服务:
sudo systemctl restart fail2ban
保护 Apache 服务
确保 jail.local 中包含以下内容:
[apache]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/error.log
maxretry = 3
bantime = 86400
重启服务使配置生效。
fail2ban 高级用法
使用 fail2ban 保护自定义服务,创建自定义过滤器文件:
sudo nano /etc/fail2ban/filter.d/myapp.conf
添加过滤规则(示例):
[Definition]
failregex = ^.* .* "POST /login.php.* 401
ignoreregex =
在 jail.local 中添加对应的 jail:
enabled = true
port = http,https
filter = myapp
logpath = /var/log/myapp/access.log
maxretry = 5
bantime = 3600
设置邮件通知
编辑 jail.local 文件:
[DEFAULT]
destemail = admin@example.com
sender = fail2ban@example.com
mta = sendmail
action = %(action_mwl)s
确保系统已安装并配置了邮件发送工具(如 sendmail 或 postfix)。
fail2ban 日志与故障排除
查看 fail2ban 日志
sudo tail -f /var/log/fail2ban.log
常见问题
fail2ban 不工作
检查服务是否运行:
sudo systemctl status fail2ban
检查日志是否有错误:
sudo journalctl -u fail2ban
IP 未被封禁:
确认日志路径正确
检查过滤器正则表达式是否匹配日志条目
增加日志级别调试:在 jail.local 中设置 loglevel = DEBUG
误封 IP:
将可信 IP 添加到 ignoreip 列表
减少 maxretry 或增加 findtime
合理配置:
设置适当的 maxretry 和 bantime,不要将 bantime 设置过长,以免误封合法用户。也不要设置过短,否则防护效果有限。
监控与审查:
定期检查被封禁的 IP 列表,分析日志了解攻击模式。
多层防护:
结合 fail2ban 与其他安全措施(如防火墙、强密码策略),修改 SSH 默认端口。
备份配置:
备份自定义配置文件和过滤器,记录所有修改以便故障恢复。
