简介
fail2ban
是一个开源的入侵防御软件,主要用于保护 Linux 服务器和其他 Unix 系统免受暴力破解和其他恶意攻击。它通过监视日志文件来检测可疑活动,并自动采取措施(通常是禁止 IP 地址)来防止进一步的攻击。
主要功能
- 自动禁止 IP 地址: 当检测到特定服务(如 SSH、FTP、HTTP 等)中的多次失败登录尝试时,
fail2ban
会自动使用防火墙(如 iptables
)禁止这些 IP 地址。
- 日志监控:
fail2ban
监控系统日志(如 /var/log/auth.log
或 /var/log/secure
),并根据预定义的规则(过滤器)分析日志内容。
- 可配置性: 用户可以根据需求自定义配置文件,设置不同的监控规则、禁止时间、允许的失败尝试次数等。
- 多种服务支持:
fail2ban
支持多种服务的保护,包括 SSH、HTTP、FTP、SMTP 等。
- 邮件通知: 可以配置邮件通知功能,当 IP 被禁止时,系统会自动发送通知邮件给管理员。
- 可扩展性: 用户可以创建自定义过滤器和动作,以适应特定的需求。
工作原理
- 配置: 用户设置
fail2ban
的配置文件,定义需要监控的服务、日志文件路径、过滤规则等。
- 监控:
fail2ban
定期扫描指定的日志文件,查找符合过滤器条件的日志条目。
- 触发: 如果在设定的时间窗口内,某个 IP 地址的失败尝试次数超过了允许的最大值,
fail2ban
会执行相应的动作(如禁止该 IP)。
- 解除禁止: 被禁止的 IP 地址在设定的时间后会自动解除禁止,或者管理员可以手动解除。
部署
Debian / Ubuntu
1
2
|
sudo apt update
sudo apt install fail2ban
|
配置
准备工作
配置文件所在的位置:
新建 jail.local
简单配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#DEFAULT-START
[DEFAULT]
bantime = 600
findtime = 300
maxretry = 5
banaction = iptables-allports
action = %(action_mwl)s
backend = systemd
#DEFAULT-END
[sshd]
ignoreip = 127.0.0.1/8
enabled = true
filter = sshd
port = 22
maxretry = 5
findtime = 300
bantime = 600
banaction = iptables-allports
action = %(action_mwl)s
logpath = /var/log/auth.log
|
配置参考了:
多种策略
此 Fail2Ban 配置通过多个 jail 实现更精细的 SSH 保护,根据登录失败尝试的频率和时间段,应用不同的禁止时长:
DEFAULT
: 设置全局默认值,使用 systemd
日志后端,iptables-allports
禁止所有端口,并发送邮件告警。
sshd-short
: 5 分钟内 5 次失败尝试 -> 禁止 10 分钟
sshd-medium
: 30 分钟内 10 次失败尝试 -> 禁止 1 小时
sshd-long
: 24 小时内 30 次失败尝试 -> 禁止 100 天
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
|
# /etc/fail2ban/jail.local (或者 /etc/fail2ban/jail.d/custom.conf)
# ; 表示单行注释
[DEFAULT]
bantime = 600 ; 封禁时间
findtime = 300 ; 指定时间内
maxretry = 5 ; 最大尝试次数
backend = systemd ; 使用 systemd 日志后端
banaction = iptables-allports ; 使用 iptables 阻止所有端口
action = %(action_mwl)s ; 邮件告警 + 日志记录
[sshd-short]
enabled = true
filter = sshd ; 使用 sshd 过滤器
logpath = /var/log/auth.log ; SSH 日志文件
port = ssh
findtime = 300 ; 5 分钟
maxretry = 5
bantime = 600 ; 10 分钟 (5分钟内超过5次)
[sshd-medium]
enabled = true
filter = sshd
logpath = /var/log/auth.log
port = ssh
findtime = 1800 ; 30 分钟
maxretry = 10
bantime = 3600 ; 1 小时 (30分钟内超过10次)
[sshd-long]
enabled = true
filter = sshd
logpath = /var/log/auth.log
port = ssh
findtime = 86400 ; 24 小时
maxretry = 30
bantime = 8640000 ; 100 天 (24小时超过30次)
|
服务
启动服务
1
|
sudo systemctl start fail2ban
|
常见命令
查看 Fail2Ban 中被禁止的 IP 地址
1
|
fail2ban-client status <jail_name>
|
查看名为 sshd
的监狱的被禁止 IP
1
|
fail2ban-client status sshd
|
如果自己忘记了密码,被 fail2ban 阻止了,解除命令
1
|
sudo fail2ban-client set <jail_name> unbanip <ip_address>
|
例如
1
|
sudo fail2ban-client set ssh unbanip 192.168.1.100
|