Installing and Configuring Fail2ban on Ubuntu

前言

Fail2ban 是免费的开源 IPS(入侵防御软件),可帮助管理员保护 Linux 服务器免受恶意登录和暴力攻击。 Fail2ban 是用 Python 编写的,带有针对 Apache2、SSH、FTP 等各种服务的过滤器。Fail2ban 通过阻止源攻击的 IP 地址来减少恶意登录尝试。

Fail2ban 的工作原理是扫描服务的日志文件 (e.f /var/log/auth.log) 并禁止显示恶意登录尝试的 IP 地址,例如太多不正确的密码、寻求漏洞利用等。Fail2ban 还支持多个防火墙后端,例如 iptables、 ufw 和 firewalld。还允许您为每次被阻止的登录尝试设置电子邮件通知。

在本教程中,我们将向您展示如何安装和配置 Fail2ban 以保护 Ubuntu 22.04 服务器。本指南还涵盖了用于管理 Fail2ban 服务和监狱的 fail2ban-client 的基本命令。

准备

  • Ubuntu 服务器 22.04
  • 具有 sudo 权限的非根用户。

防火墙

在开始安装 Fail2ban 之前,您需要在 Ubuntu 服务器上设置防火墙。

默认的 Ubuntu 服务器安装带有 UFW 防火墙,它比其他防火墙(如 iptables)更易于管理。

现在使用以下命令检查 UFW 防火墙状态。

1
sudo ufw status

如果您收到诸如 \Status: inactive\ 之类的输出消息,则您的 UFW 防火墙尚未启动。但是,如果您收到诸如 \Command ufw not found\ 之类的输出消息,则表明您的服务器上未安装 UFW 防火墙。

截屏2024-03-05 20.15.44

要安装 UFW 防火墙包,请运行下面的 apt 命令。

1
sudo apt install ufw -y

UFW 安装完成后,运行以下命令将 SSH 服务添加到 UFW 防火墙。

1
sudo ufw allow ssh

接下来,运行以下命令启动并启用 UFW 防火墙。

1
sudo ufw enable

输入 y 确认并启动 UFW 防火墙。

最后,使用以下命令再次检查 UFW 防火墙。

1
sudo ufw status

您可以在下方看到 UFW 防火墙“状态:活动”,防火墙规则中添加了 SSH 端口 22。

截屏2024-03-05 20.20.30

安装 Fail2ban

安装和配置 UFW 防火墙后,现在您将在服务器上安装 Fail2ban 包。

运行以下命令来更新和刷新您的 Ubuntu 存储库。

1
sudo apt update

现在使用以下命令安装 Fail2ban 包。

1
sudo apt install fail2ban -y

Fail2ban 安装完成后,启用 Fail2ban 服务并使用以下命令启动该服务。

1
sudo systemctl enable fail2ban
1
sudo systemctl start fail2ban

设置开机自动启动

1
systemctl enable fail2ban.service

使用以下命令检查 Fail2ban 服务状态。

1
sudo systemctl status fail2ban

截屏2024-03-05 20.24.38

普通用户到这里就可以了,无须下面的配置

============

配置 Fail2ban(option)

所有 Fail2ban 配置都存储在 /etc/fail2ban 目录中。下面详细的Fail2ban配置你必须要知道:

  • 配置fail2ban.conf是Fail2ban的主要配置。
  • 配置jail.conf 是Fail2ban 监狱配置的一个例子。
  • action.d 目录包含 fail2ban 操作设置,例如邮件设置和防火墙设置。
  • 目录 jail.d 包含 fail2ban jail 的额外配置。

要开始配置 Fail2ban,您需要使用以下命令将默认监狱配置 jail.conf 复制到 jail.local

1
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

现在使用 nano 编辑器编辑配置 jail.local

1
sudo vim /etc/fail2ban/jail.local

首先,取消注释 ignoreip 选项并添加您的 IP 地址。 ignoreip 选项内的所有 IP 地址都不会被 Fail2ban 阻止。

1
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 192.168.10.20

于禁止设置,您可以根据需要更改配置。在这个例子中,global bantime 为 1day,findtime 为 10minutes,maxretry 为 5 次。

bantime选项是IP地址将被禁止访问服务器的时间。 findtime 选项是禁止操作之前失败次数之间的持续时间。而 maxretry 选项是 IP 地址被禁止的失败次数。

1
2
3
bantime  = 1d
findtime = 10m
maxretry = 5

Fail2ban 的默认操作只是禁止 IP 地址。但您也可以在 IP 地址被禁止时设置邮件通知。

如下更改操作选项并更改默认发件人和目标邮件地址。

1
2
action = %(action_mw)s
destemail =

接下来,对于 UFW 防火墙集成,您需要将 banaction 选项更改为 ufw,如下所示。

1
banaction = ufw

最后,对于监狱配置。此部分是您添加服务并使用 fail2ban 保护它的地方。

在此示例中,我们将为 SSH 服务启用监狱,但我们也会覆盖 sshd 监狱的全局默认配置。 bantime 将是 1 周,最大失败重试次数为 3 次,查找时间为 10 分钟。

1
2
3
4
5
6
7
8
9
[sshd]
enabled = true
maxretry = 3
findtime = 1d
bantime = 1w

port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

完成后保存并关闭文件。

现在运行以下命令重新启动 Fail2ban 服务并将新更改应用于 jail.local 配置。

1
sudo systemctl restart fail2ban

您现在已经完成了 Fail2ban 配置,启用了电子邮件通知并启用了 sshd 监狱以保护 SSH 服务。

使用 Fail2ban-client 验证 Fail2ban 状态

ail2ban 提供了一个命令行 fail2ban-client 用于与 Fail2ban 服务进行交互。这允许您从命令行管理和配置 Fail2ban,还允许您管理 Fail2ban 监狱。

要验证 fail2ban 安装和配置,请运行以下命令的 fail2ban-client

1
sudo fail2ban-client ping

如果您收到诸如“服务器回复:pong”之类的输出消息,这意味着 Fail2ban 正在正常运行。

接下来,运行下面的 fail2ban-client 命令来检查 sshd jail 的状态。

1
sudo fail2ban-client status sshd

下面你可以看到 sshd jail 的详细状态。这包括 SSH 服务的日志文件和 sshd jail 上被禁止的 IP 地址列表。

截屏2024-03-05 20.39.20

现在如果你想获得 sshd 监狱的详细配置,你可以使用 fail2ban-client 命令如下。

检查 sshd jail 的 bantime 配置。您将在几秒钟内获得 bantime 的输出。

1
sudo fail2ban-client get sshd bantime

检查 sshd jail 的 maxrtey 配置。你会看到这里的 maxretry 是 3,因为它被全局配置覆盖了,也就是 maxrety 5 次。

1
sudo fail2ban-client get sshd maxretry

对于sshd jail中的banaction,可以使用以下命令。并且您应该将 ufw 的输出作为 sshd jail 的默认禁令。

1
sudo fail2ban-client get sshd actions

对于此处的查找时间,您还将看到 sshd 监狱的覆盖值。此处的输出也将采用秒格式。

1
sudo fail2ban-client get sshd findtime

最后,您还可以使用以下命令检查 sshd jail 的默认 ignoreip。你会看到 ignoreip 与全局 Fail2ban 配置具有相同的值。

1
sudo fail2ban-client get sshd ignoreip

使用 Fail2ban-client 禁止和取消禁止 IP

关于 Fail2ban 的另一个重要事项是如何在 Fail2ban 上禁止和取消禁止 IP 地址。为此,您还可以使用 fail2ban-client 命令。

要在 sshd jail 上手动禁止 IP 地址,您可以使用下面的 fail2ban-client 命令。将 IP 地址更改为您要禁止的 IP 地址。

1
sudo fail2ban-client set sshd banip IP-ADDRESS

要从 sshd jail 中解禁 IP 地址,您可以使用下面的 fail2ban-client 命令。请务必将 IP 地址更改为您要取消禁止的 IP 地址。

1
sudo fail2ban-client set sshd unbanip IP-ADDRESS

现在,在您手动禁止 IP 地址或取消禁止 IP 地址后,您可以使用下面的 fail2ban-client 命令进行验证。

1
sudo fail2ban-client status sshd

如果您手动禁止某个 IP 地址,请确保该 IP 地址在禁止 IP 地址列表中可用。但是,如果您取消禁止某个 IP 地址,请确保该 IP 地址从禁止 IP 地址列表中消失。

配置Fail2ban telegram 机器人通知

创建Telegram 机器人为关注@Botfather,按提示操作即可,

可查找机器人Token,添加@userinfobot查找自己聊天ID

在/etc/fail2ban/action.d/telegram.conf 文件并写入

1
2
3
4
5
6
7
[Definition]
actionstart = /etc/fail2ban/scripts/send_telegram_notif.sh -a start
actionstop = /etc/fail2ban/scripts/send_telegram_notif.sh -a stop
actioncheck =
actionban = /etc/fail2ban/scripts/send_telegram_notif.sh -n <name> -b <ip>
actionunban = /etc/fail2ban/scripts/send_telegram_notif.sh -n <name> -u <ip>

在/etc/fail2ban/scripts/send_telegram_notif.sh脚本文件写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69

#!/bin/bash
# Version 1.0
# Send Fail2ban notifications using a Telegram Bot

# Telegram BOT Token
telegramBotToken='6221337047630:AAHDsda7IOX0Xhapl23mV2RAoim34DtR0d5lmwbI'
# Replace with your own Telegram Bot Token

# Telegram Chat ID
telegramChatID='1413882222124676'
# Replace with your own Telegram Chat ID

function talkToBot() {
message=$1
curl -s -X POST https://api.telegram.org/bot${telegramBotToken}/sendMessage -d text="${message}" -d chat_id=${telegramChatID} > /dev/null 2>&1
}

if [ $# -eq 0 ]; then
echo "Usage: $0 -a (start || stop) || -b \$IP || -u \$IP"
exit 1
fi

while getopts "a:n:b:u:" opt; do
case "$opt" in
a)
action=$OPTARG
;;
n)
jail_name=$OPTARG
;;
b)
ban="y"
ip_add_ban=$OPTARG
;;
u)
unban="y"
ip_add_unban=$OPTARG
;;
?)
echo "Invalid option: -$OPTARG"
exit 1
;;
esac
done

if [[ ! -z ${action} ]]; then
case "${action}" in
start)
talkToBot "Fail2ban has been started on $(hostname)."
;;
stop)
talkToBot "Fail2ban has been stopped on $(hostname)."
;;
*)
echo "Incorrect option"
exit 1
;;
esac
elif [[ ${ban} == "y" ]]; then
talkToBot "[${jail_name}] The IP: ${ip_add_ban} has been banned on $(hostname)."
exit 0
elif [[ ${unban} == "y" ]]; then
talkToBot "[${jail_name}] The IP: ${ip_add_unban} has been unbanned on $(hostname)."
exit 0
# Uncomment the following lines and define the 'info' function if necessary
# else
# info
fi

给send_telegram_notif.sh脚本添加可执行权限

1
chmod +x send_telegram_notif.sh

修改目录:/etc/fail2ban/jail.local配置文件,将启用的jail的action下添加一个telegram,如下

1
2
3
4
# [sshd]
# ...
action = iptables[name=SSH, port=22, protocol=tcp]
telegram[name=%(__name__)s, port="1918", protocol="tcp", chain="%(chain)s"]

重启fail2ban验证

1
systemctl restart fail2ban

正常情况下,telegram可以接收通知了。

常用命令

激活fail2ban

1
systemctl restart fail2ban
1
service fail2ban restart

检测生效脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
for ((i=1;i<=50;i++)); do
curl -H "Fail2ban test" https://your-domian/test > /dev/null 2>&1
done
echo "done"```

# 使用Fail2ban客户端
`fail2ban-client <COMMAND>`
以下是 Fail2ban-client 命令列表:
- `start`: 用于启动fail2ban服务器和jails
- `reload`: 用于重新加载 Fail2ban 配置
- `stop`: 停止服务器
- `status`: 用于检查服务器状态并启用 jails
- `status JAIL` : 显示监狱的状态和当前被禁止的 IP

## 查看所有命令
```shell
fail2ban-client -help

检查启动状态

1
2
3
4
5
6
7
8
9
10
fail2ban-client ping # 正确启动的话fail2ban会以pong作为回应(Server replied: pong)
sudo fail2ban-client version #查看 Fai2ban 的版本
sudo fail2ban-client ping #检查 Fail2ban 是否正常运行(正常将显示 pong)
sudo systemctl start fail2ban #启动 Fail2ban
sudo systemctl stop fail2ban #停止 Fail2ban
sudo systemctl restart fail2ban #重启 Fail2ban
sudo tail -f /var/log/fail2ban.log #打开 Fail2ban 的日志监控

sudo iptables --list -n #显示系统当前 iptables
sudo iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP #解除封禁的 IP

查看指定 Jail 规则下被封禁的IP情况

1
fail2ban-client status [jailname]

封禁/解封限制IP

1
sudo fail2ban-client set <jailname> banip/unbanip <IP>
1
2
sudo fail2ban-client set sshd banip 23.34.45.56
sudo fail2ban-client set sshd unbanip 23.34.45.56

添加/解除指定IP的忽略

1
fail2ban-client set <JAIL> addignoreip/delignoreip <IP>

验证自定义规则

1
fail2ban-regex [OPTIONS] <LOG> <REGEX> [IGNOREREGEX]
  • LOG为需要匹配的日志文件路径,

  • REGEX为正则表达式所在的文件路径(通常位于filter.d文件夹内)

    以下为常用的OPTIONS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Do not print any missed lines
    --print-no-missed

    // Do not print any ignored lines
    --print-no-ignored

    // Print all matched lines
    --print-all-matched

    // Print all missed lines, no matter how many
    --print-all-missed

    // Print all ignored lines, no matter how many
    --print-all-ignored

查看fail2ban的日志

1
tail -f /var/log/fail2ban.log

感谢


Installing and Configuring Fail2ban on Ubuntu
http://example.com/2024/03/05/Installing-and-Configuring-Fail2ban-on-Ubuntu/
作者
Justin
发布于
2024年3月5日
许可协议