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 的所有 GET 或 POST 请求,并计算请求频率。
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是可以公网解析的)
