Fail2Ban使用心得
起因
最近租了两个“肉鸡”服务器用于个人开发学习,因为有公网暴露,频繁被机器人恶意登录,导致经常会出现如下提示:
1 | There were * failed login attempts since the last successful login. |
通过修改 /etc/ssh/sshd_config
禁止root用户密码登录也拦不住,于是就找到一个第三方工具 - Fail2Ban。
介绍
Fail2Ban 是一个开源的入侵防御软件,主要用于防止恶意的暴力破解攻击。
它通过监控系统日志文件(例如 /var/log/auth.log
、/var/log/apache2/error.log
等)中的可疑行为(如重复的登录失败、异常的 IP 请求等),根据预定义的规则识别出恶意行为,然后对恶意 IP 地址采取临时封禁措施。Fail2ban 主要通过修改防火墙规则来实现这一点。
安装
Linux下执行如下命令即可:
1 | yum install -y fail2ban |
配置
Fail2Ban 有一个名为 jail.conf
的主(默认)配置文件,它可以与 jail.local
配置文件共存,jail.local
配置优先级高于 jail.conf
。
建议不要修改 jail.conf
配置文件,推荐将 jail.conf
文件复制到名为 jail.local
的文件中,然后在 jail.local
文件中自定义自己的配置。
1 | cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local |
jail.local
文件中的每个监狱定义由一组 [监狱名称]
标记组成,包含一系列指令来指定监控服务、日志路径、过滤器规则、封禁时长等。
常用配置字段
-
[监狱名称] 每个监狱名称标识 Fail2ban 应监控的服务或日志源。例如:
1
[sshd]
该部分用于定义 SSH 服务的监控规则。
-
enabled 该字段用于启用或禁用某个监狱。如果要启用某个监狱,设置为
true
。1
enabled = true
-
port 指定监控的端口号或服务名称。可以是具体的端口号,也可以使用协议名称(如
ssh
、http
等)。例如:1
port = ssh
或者指定端口号:
1
port = 22
-
filter 该字段指定 Fail2ban 用于分析日志的过滤器文件名。过滤器定义了如何解析日志文件中的特定模式。例如:
1
filter = sshd
这会使用
/etc/fail2ban/filter.d/sshd.conf
中定义的过滤规则。 -
logpath 定义日志文件的路径,Fail2ban 将监控这些文件并根据过滤器规则分析其内容。例如:
1
logpath = /var/log/auth.log
-
maxretry 指定在指定时间段内失败的最大次数,超过该次数后 Fail2ban 将封禁对应 IP 地址。例如:
1
maxretry = 5
表示在超过 5 次登录失败后触发封禁。
-
bantime 设置封禁的时间(秒为单位)。如果不需要永久封禁,可以设置一个合理的时间长度,例如:
1
bantime = 3600
该设置表示封禁时间为 1 小时(3600 秒)。如果希望永久封禁,可以将其设置为负数:
1
bantime = -1
-
findtime 该字段定义检测攻击行为的时间窗口(单位为秒)。例如:
1
findtime = 600
这表示在 600 秒(10 分钟)内,如果有
maxretry
次失败,则封禁 IP。 -
action 定义在封禁时执行的操作,通常是修改防火墙规则封禁 IP,也可以发送邮件通知等。例如:
1
action = iptables[name=SSH, port=ssh, protocol=tcp]
或者使用默认的
action_
操作模板:1
action = %(action_mw)s
action_mw
表示发送邮件通知管理员,并封禁 IP。
配置示例
1 | [DEFAULT] |
提示:每次修改 jail.local
文件后,记得重启 Fail2ban 服务以应用更改。
命令
-
启动 Fail2ban 服务:
1
sudo systemctl start fail2ban
-
配置开机启动:
1
sudo systemctl enable fail2ban
-
查看服务状态:
1
sudo systemctl status fail2ban
-
列出当前所有活动的监狱:
1
sudo fail2ban-client status
-
查看某个监狱的详细信息(如 SSH):
1
sudo fail2ban-client status sshd
-
解封 IP 地址:
1
sudo fail2ban-client unban <IP地址>
-
重启服务
1
sudo systemctl restart fail2ban
-
检查配置文件
1
2## 检查配置文件的语法,并输出任何配置错误
sudo fail2ban-client -d