对于自行运维服务器的开发者和博主而言,保障服务器安全是一项核心职责。在缺乏有效防护的情况下,服务器极易成为恶意攻击的目标。虽然有诸多在线Web应用防火墙(WAF)方案,但为了从底层加固系统,一个名为 Fail2ban 的开源工具至关重要。它通过监控日志,能在多次失败的登录尝试后,临时封禁攻击者的IP地址,从而有效抵御暴力破解等威胁。
Fail2ban的监控能力不限于SSH,还可扩展至FTP、邮件服务器等多种服务。本文将详细介绍在Ubuntu 24.04或22.04 LTS系统上安装、配置和使用Fail2ban的完整流程。
在Ubuntu上安装Fail2ban
Fail2ban软件包已收录于Ubuntu官方仓库,我们可以直接使用APT包管理器进行安装。
首先,更新系统软件包列表以获取最新信息:
sudo apt update
接着,执行安装命令:
sudo apt install fail2ban
安装完成后,系统将提供以下核心程序:
fail2ban-server – 守护进程,负责监控与封禁。
fail2ban-client – 客户端程序,用于配置服务器与查询状态。
fail2ban-regex – 用于测试过滤规则中正则表达式的工具。
安装后,需要启用Fail2ban服务并检查其运行状态:
sudo systemctl enable fail2ban
sudo systemctl status fail2ban
理解Fail2ban配置框架
Fail2ban的配置文件主要分为三种类型,理解其结构是进行有效配置的关键。配置文件有 .conf 和 .local 两种扩展名。.conf 文件是软件包提供的默认配置,在升级时会被覆盖。因此,所有自定义设置都应在对应的 .local 文件中进行,该文件中的值会覆盖 .conf 文件中的默认设置。
主要的配置文件目录和文件包括:
/etc/fail2ban/action.d/*.conf - 定义封禁和解除封禁IP地址时所执行的具体动作(如使用iptables或ufw)。
/etc/fail2ban/filter.d/*.conf - 包含用于解析不同服务日志文件的正则表达式规则。
/etc/fail2ban/jail.conf - 主配置文件,用于将“过滤器”(filter)和“动作”(action)组合成具体的“监狱”(jail),并定义全局和特定服务的监控规则。
/etc/fail2ban/jail.d/*.conf - 用于存放额外的监狱配置。
动作(Action)配置详解
action.d 目录下的文件定义了执行封禁的逻辑。每个动作文件通常包含 [Definition] 和 [Init] 两部分。
以下是一个基于 iptables-multiport 动作的选项概览:
| 选项 |
描述 |
示例 |
[Definition] |
|
|
actionstart |
在Fail2ban启动时执行的命令,用于初始化(如创建iptables链)。 |
actionstart = iptables -N fail2ban-<name> ... |
actionstop |
在Fail2ban停止时执行的命令,用于清理。 |
actionstop = iptables -D <chain> -p <protocol> ... ... |
actioncheck |
在执行actionban前验证环境是否就绪的命令。 |
actioncheck = iptables -n -L <chain> | grep -q 'fail2ban-<name>[ \t]' |
actionban |
当IP达到封禁条件时执行的命令。 |
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j <blocktype> |
actionunban |
解除IP封禁时执行的命令。 |
actionunban = iptables -D fail2ban-<name> -s <ip> -j <blocktype> |
[Init] |
|
|
name |
使用的iptables链的默认名称。 |
name = default |
port |
要监控的端口(可以是服务名如ssh,或端口号)。 |
port = ssh |
protocol |
使用的协议。 |
protocol = tcp |
chain |
添加规则的iptables链,默认为INPUT。 |
chain = INPUT |
过滤器(Filter)配置详解
filter.d 目录下的文件包含用于分析日志、提取恶意IP地址的正则表达式。核心部分是 [Definition]。
| 选项 |
描述 |
示例 |
[Definition] |
|
|
failregex |
用于在日志中匹配失败尝试的正则表达式。<HOST>标签用于提取IP或主机名。 |
failregex = ^%(__prefix_line)sFAIL: \S+ address from=<HOST>$ |
ignoreregex |
定义例外规则,即使匹配failregex也会被忽略。 |
ignoreregex = |
[INCLUDES] |
|
|
before |
指定在解析本文件前要包含的其他文件。 |
before = common.conf |
after |
指定在解析本文件后要包含的其他文件。 |
after = example_after.local |
监狱(Jail)配置详解
jail.conf (或 jail.local) 是核心配置文件,它将特定的过滤器、日志路径和封禁动作关联起来,并设置触发阈值。
| 选项 |
描述 |
示例 |
[DEFAULT] |
全局默认设置 |
|
ignoreip |
永不封禁的IP或网段(白名单),用空格分隔。 |
ignoreip = 127.0.0.1/8 192.168.1.33 |
bantime |
IP被封禁的时长(秒),负值表示永久封禁。 |
bantime = 86400 (24小时) |
findtime |
统计失败尝试的时间窗口(秒)。 |
findtime = 660 (10分钟) |
maxretry |
在findtime时间窗口内,触发封禁的最大失败次数。 |
maxretry = 2 |
backend |
指定读取日志的方式,如systemd或auto(自动选择)。 |
backend = auto |
usedns |
设置是否对日志中的主机名进行反向DNS查询,可选yes, no, warn。 |
usedns = warn |
[服务名称] |
特定服务的监狱设置 |
[sshd] |
enabled |
是否启用此监狱。 |
enabled = true |
port |
该服务监听的端口。 |
port = ssh |
filter |
使用的过滤器名称(对应filter.d/下的文件名)。 |
filter = sshd |
logpath |
要监控的日志文件路径。 |
logpath = /var/log/auth.log |
maxretry |
可在此处覆盖[DEFAULT]中的值。 |
maxretry = 3 |
创建与配置自定义监狱
不建议直接修改 jail.conf。正确的做法是创建其本地副本 jail.local 进行自定义。
sudo cp /etc/fail2ban/jail.{conf,local}
接下来,编辑这个本地配置文件:
sudo nano /etc/fail2ban/jail.local
基础安全策略定制
-
设置IP白名单 (ignoreip)
在文件中找到 #ignoreip 行,删除注释符号 #,并添加你信任的IP地址或网段,例如你的办公网络IP或管理服务器IP。
ignoreip = 127.0.0.1/8 192.168.1.0/24 10.0.0.5
-
调整封禁时间 (bantime)
默认封禁时间为10分钟(600秒)。你可以根据安全策略调整,例如设置为1小时或1天。使用 m 表示分钟,h 表示小时,d 表示天。
bantime = 1h
若要永久封禁,可设置为负值(如 -1)。但需谨慎使用。
-
调整容错次数 (maxretry)
此值定义了在 findtime 时间窗口内,允许的最大失败尝试次数。默认是5次,你可以根据服务的敏感度调低(更严格)或调高。
maxretry = 3
-
调整检测时间窗口 (findtime)
这个设置与 maxretry 协同工作。例如,默认 findtime = 10m 且 maxretry = 5 意味着:如果某个IP在10分钟内失败了5次,则触发封禁。你可以缩短这个窗口以更快响应攻击。
findtime = 5m
配置Fail2ban发送邮件警报
Fail2ban可以在IP被封禁时发送邮件通知。首先,需要安装一个邮件传输代理(MTA),如Sendmail:
sudo apt install sendmail
安装后,需要在 jail.local 文件的 [DEFAULT] 部分进行配置:
- 设置收件人 (
destemail):填写接收警报的邮箱地址。
- 设置发件人 (
sender):填写Fail2ban发送邮件时使用的发件人地址。
- 更改默认动作 (
action):找到 action = %(action_)s 这一行,将其替换为以下两种之一:
action = %(action_mw)s:当IP被封禁时,发送邮件通知,并在邮件中包含“whois”查询信息。
action = %(action_mwl)s:发送邮件通知,并包含“whois”信息以及触发封禁的相关日志行。
配置示例:
destemail = admin@yourdomain.com
sender = fail2ban-alert@yourdomain.com
action = %(action_mwl)s
启用与管理监狱服务
Fail2ban预定义了多种服务的监狱(如sshd, apache-auth, postfix等),但默认只启用了sshd。
查看已启用的监狱
使用以下命令查看当前活跃的监狱:
sudo fail2ban-client status
输出类似:
Status
|- Number of jail: 1
`- Jail list: sshd
启用更多监狱
要启用其他监狱(例如 apache-auth 用于防护Apache认证失败攻击),只需在 jail.local 文件中找到对应的监狱段(如 [apache-auth]),并将其中的 enabled = false 改为 enabled = true。确保你的系统上已安装并运行了该服务(此处即Apache),且日志路径正确。
重启服务并验证
修改配置后,必须重启Fail2ban服务以使更改生效:
sudo systemctl restart fail2ban
再次检查状态,此时应能看到新启用的监狱:
sudo fail2ban-client status
输出可能变为:
Status
|- Number of jail: 2
`- Jail list: apache-auth, sshd
你可以查看特定监狱的详细状态:
sudo fail2ban-client status apache-auth
常见错误:如果启用某个监狱后Fail2ban启动失败(通过 systemctl status fail2ban 查看),通常是因为该监狱对应的服务未安装或日志文件路径不存在。例如,未安装Apache却启用了apache-auth监狱就会导致此问题。此时需要禁用该监狱或安装相应服务。
Fail2ban客户端常用操作
Fail2ban客户端 (fail2ban-client) 是一个强大的管理工具。
查看所有可用命令:
fail2ban-client -h
手动封禁/解封IP(谨慎使用):
- 封禁一个IP到指定监狱:
sudo fail2ban-client set <JAIL_NAME> banip <IP_ADDRESS>
- 解封一个IP:
sudo fail2ban-client set <JAIL_NAME> unbanip <IP_ADDRESS>
示例:手动封禁IP 192.168.0.100 到 sshd 监狱。
sudo fail2ban-client set sshd banip 192.168.0.100
通过上述步骤,你可以在Ubuntu服务器上成功部署和配置Fail2ban,构建一道有效的自动入侵防御屏障。合理的配置和定期的 运维监控 是维持服务器长期稳定安全运行的关键。
参考资料
[1] 在 Ubuntu 24.04 或 22.04 LTS 服务器上安装、配置和使用 Fail2ban, 微信公众号:mp.weixin.qq.com/s/Itxpt6pOanG27Azsw8RD6A
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。