起因

最近租了两个“肉鸡”服务器用于个人开发学习,因为有公网暴露,频繁被机器人恶意登录,导致经常会出现如下提示:

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 文件中的每个监狱定义由一组 [监狱名称] 标记组成,包含一系列指令来指定监控服务、日志路径、过滤器规则、封禁时长等。

常用配置字段

  1. [监狱名称] 每个监狱名称标识 Fail2ban 应监控的服务或日志源。例如:

    1
    [sshd]

    该部分用于定义 SSH 服务的监控规则。

  2. enabled 该字段用于启用或禁用某个监狱。如果要启用某个监狱,设置为 true

    1
    enabled = true
  3. port 指定监控的端口号或服务名称。可以是具体的端口号,也可以使用协议名称(如 sshhttp 等)。例如:

    1
    port = ssh

    或者指定端口号:

    1
    port = 22
  4. filter 该字段指定 Fail2ban 用于分析日志的过滤器文件名。过滤器定义了如何解析日志文件中的特定模式。例如:

    1
    filter = sshd

    这会使用 /etc/fail2ban/filter.d/sshd.conf 中定义的过滤规则。

  5. logpath 定义日志文件的路径,Fail2ban 将监控这些文件并根据过滤器规则分析其内容。例如:

    1
    logpath = /var/log/auth.log
  6. maxretry 指定在指定时间段内失败的最大次数,超过该次数后 Fail2ban 将封禁对应 IP 地址。例如:

    1
    maxretry = 5

    表示在超过 5 次登录失败后触发封禁。

  7. bantime 设置封禁的时间(秒为单位)。如果不需要永久封禁,可以设置一个合理的时间长度,例如:

    1
    bantime = 3600

    该设置表示封禁时间为 1 小时(3600 秒)。如果希望永久封禁,可以将其设置为负数:

    1
    bantime = -1
  8. findtime 该字段定义检测攻击行为的时间窗口(单位为秒)。例如:

    1
    findtime = 600

    这表示在 600 秒(10 分钟)内,如果有 maxretry 次失败,则封禁 IP。

  9. action 定义在封禁时执行的操作,通常是修改防火墙规则封禁 IP,也可以发送邮件通知等。例如:

    1
    action = iptables[name=SSH, port=ssh, protocol=tcp]

    或者使用默认的 action_ 操作模板:

    1
    action = %(action_mw)s

    action_mw 表示发送邮件通知管理员,并封禁 IP。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[DEFAULT]
## 默认封禁时间为 1 小时
bantime = 3600
## 在 10 分钟内检测到 5 次失败则封禁
findtime = 600
maxretry = 5

## 发送邮件通知管理员
destemail = admin@example.com
sender = fail2ban@example.com
action = %(action_mw)s

## 监控 SSH 服务
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = -1

提示:每次修改 jail.local 文件后,记得重启 Fail2ban 服务以应用更改。

命令

  1. 启动 Fail2ban 服务:

    1
    sudo systemctl start fail2ban
  2. 配置开机启动:

    1
    sudo systemctl enable fail2ban
  3. 查看服务状态:

    1
    sudo systemctl status fail2ban
  4. 列出当前所有活动的监狱:

    1
    sudo fail2ban-client status
  5. 查看某个监狱的详细信息(如 SSH):

    1
    sudo fail2ban-client status sshd
  6. 解封 IP 地址:

    1
    sudo fail2ban-client unban <IP地址>
  7. 重启服务

    1
    sudo systemctl restart fail2ban
  8. 检查配置文件

    1
    2
    ## 检查配置文件的语法,并输出任何配置错误
    sudo fail2ban-client -d