Fail2ban(自动封禁工具)

tmx8911
13
2025-05-15

fail2ban 是一种非常有效的自动封禁工具,它可以基于 Apache 的日志分析频繁访问者,并自动将其 IP 封禁。以下是配置 fail2ban 来封禁频繁请求的步骤:

一、Linux上安装fail2ban

1.1 安装 fail2ban

首先,确保 fail2ban 已安装:

sudo apt update
sudo apt install fail2ban

1.2创建Apache封禁规则

1.2.1 创建 Apache 过滤规则

编辑或创建 /etc/fail2ban/jail.local 文件,增加以下规则来保护 Apache:

[apache-overload]
enabled  = true
port     = http,https
filter   = apache-overload
logpath  = /var/log/apache2/access.log
maxretry = 20
findtime = 60
bantime  = 600
  • **maxretry**:在 findtime 时间段内,允许的最大请求次数(这里设置为每分钟 20 次)。
  • **findtime**:检测频繁访问的时间窗口,单位为秒(设置为 60 秒)。
  • **bantime**:封禁时间,单位为秒(这里是 600 秒)。

1.2.2 创建过滤器

创建或编辑 /etc/fail2ban/filter.d/apache-overload.conf 文件,定义过滤规则:

[Definition]
failregex = ^<HOST> -.*"(GET|POST).*"$

此规则会捕获 Apache 的所有 GETPOST 请求,并计算请求频率。

1.3 创建sshd封禁规则

1.3.1 创建 sshd 过滤规则

为了自定义配置,最好在 jail.local 文件中进行修改,而不是直接编辑 jail.conf

编辑或创建 /etc/fail2ban/jail.local 文件,增加以下规则来保护 ssh:

[sshd]
enabled  = true
port     = ssh
logpath  = /var/log/auth.log
maxretry = 10
findtime = 60
bantime  = 3600

参数说明:

  • **enabled**:设置为 true 启用此规则。
  • **port**:指定 SSH 服务的端口,默认为 ssh
  • **logpath**:指定 SSH 登录尝试记录的日志路径。
  • **maxretry**:在 findtime 时间段内允许的最大失败尝试次数。
  • **findtime**:时间窗口(秒),在此时间段内计数失败尝试。
  • **bantime**:超过 maxretry 后,封禁 IP 的时间(秒)。

1.4 启动 fail2ban

重启并启用 fail2ban

sudo systemctl restart fail2ban

确保 fail2ban 在系统启动时自动运行:

sudo systemctl enable fail2ban

二、查看被封禁的IP

2.1 查看Apache封禁情况

使用以下命令查看当前被封禁的 IP:

sudo fail2ban-client status apache-overload

你可以看到哪些 IP 被封禁以及规则的运行情况。

2.2 查看sshd封禁情况

使用以下命令查看当前被封禁的 IP:

sudo fail2ban-client status sshd

你可以看到哪些 IP 被封禁以及规则的运行情况。

三、解封被封禁的IP

3.1. 查看被封禁的 IP

首先,查看某个 jail(规则)下当前被封禁的 IP 列表。

运行以下命令列出所有 jail 及其状态:

sudo fail2ban-client status

3.1.1 查看Apache服务封禁的IP:

找到你需要解封的 jail,例如 apache-overload,然后运行以下命令查看该 jail 下被封禁的 IP:

sudo fail2ban-client status apache-overload

输出会显示被封禁的 IP 列表。

3.1.2 查看sshd服务封禁的IP:

找到你需要解封的 jail,例如 sshd,然后运行以下命令查看该 jail 下被封禁的 IP:

sudo fail2ban-client status sshd

3.2. 解封指定的 IP

3.2.1 解封Apache的 IP 地址

如果你知道要解封的 IP 地址,比如 95.146.156.135,可以使用以下命令解封:

sudo fail2ban-client set apache-overload unbanip 95.146.156.135

这将立即解封该 IP 地址。返回1则成功

3.2.2 解封sshd的 IP 地址

如果你知道要解封的 IP 地址,比如 183.146.156.135,可以使用以下命令解封:

sudo fail2ban-client set sshd unbanip 183.146.156.135

这将立即解封该 IP 地址。返回1则成功

3. 解封所有 IP(可选)

如果你想清除某个 jail 中所有被封禁的 IP,最简单的方式是重新启动 fail2ban,这会清除所有当前的封禁:

sudo systemctl restart fail2ban

或者,重新加载某个特定的 jail

sudo fail2ban-client reload apache-overload

4. 查看解封后的状态

解封之后,可以再次运行以下命令来确认 IP 已被解封:

sudo fail2ban-client status apache-overload
sudo fail2ban-client status sshd

你应该看到封禁的 IP 列表已被更新或清空。

四、定期发送邮件通知

邮件服务使用的是 Postfix。这是一个开源的邮件传输代理(MTA),用于发送和接收电子邮件。你在系统中配置了 Postfix,以便通过 SMTP 协议发送邮件到指定的邮箱地址。

4.2 定时脚本:

#!/bin/bash

# 获取被封 IP
banned_ips=$(fail2ban-client status apache-overload | grep 'Banned IP list:' | awk -F ':' '{print $2}' | xargs)

# 输出调试信息
echo "Banned IPs: $banned_ips"

# 如果没有被封 IP,直接退出
if [ -z "$banned_ips" ]; then
    echo "No banned IPs found."
    exit 0
fi

# 检查并初始化 BanIP.txt
ban_file="/var/log/BanIP.txt"

# 检查 BanIP.txt 是否存在或为空
if [ ! -f "$ban_file" ] || [ ! -s "$ban_file" ]; then
    touch "$ban_file"
    echo "BanIP.txt created."
fi

# 获取之前的被封 IP
previous_ips=$(tail -n 1 "$ban_file")

# 只有当当前被封 IP 和之前的 IP 不同的时候发送邮件
if [ "$banned_ips" != "$previous_ips" ]; then
    # 更新 BanIP.txt 文件
    echo "Banned IPs as of $(date):" >> "$ban_file"
    echo "$banned_ips" >> "$ban_file"
    echo "-------------------------------------" >> "$ban_file"
    
    # 发送邮件
    echo "现在是 $(date),被封禁的 IP 列表: $banned_ips" | mail -s "New Banned IPs Alert" -r root@mail.域名.cn xxxx@qq.com
    
    # 输出提示信息
    echo "邮件已成功发送,包含新的被封 IP: $banned_ips"
else
    echo "没有检测到新的被封 IP."
fi
0 * * * * /usr/local/bin/Ban_ip.sh >> /var/log/Ban_ip.log 2>&1

邮件服务器的配置信息(mail.tmxll.cn是可以公网解析的)

动物装饰