使用 fail2ban 保护你的 VPS

Fail2Ban 是一款开源的入侵防御工具,主要用于防止暴力破解、DoS 攻击和恶意扫描。它通过监控系统日志(如 SSH、FTP、Web 服务器等),自动检测多次失败的登录尝试或其他可疑行为,并动态调整防火墙规则(如 iptables、firewalld 等)来封锁恶意 IP 地址。适用于 Linux/Unix 系统,Fail2Ban 能有效降低暴力破解风险,且资源占用低,是服务器安全加固的常用工具。需注意合理配置以避免误封合法 IP。

1. Fail2Ban 的工作原理

Fail2Ban 是一款基于日志分析的入侵防御工具,通过动态封禁恶意 IP 来防止暴力破解和自动化攻击。其工作原理可分为四个步骤:

  • 日志监控:实时扫描服务日志(如 SSH、Nginx),检测失败登录或恶意请求。

  • 规则匹配:使用预定义的正则表达式(如 Failed password for .\* from <HOST>)识别攻击行为。

  • 触发封禁:当同一 IP 在设定时间(如 findtime=10m)内触发多次失败(如 maxretry=5),自动调用防火墙(如 iptables)封禁该 IP。

  • 自动解封:封禁期满(如 bantime=1h)后移除规则,恢复访问权限。

Fail2Ban 支持多服务、自定义规则和临时封禁,兼顾安全性与灵活性,是服务器防护的轻量级解决方案。

2. 安装 Fail2Ban

1
2
3
4
5
6
7
8
9

# 对于 Redhat 系列 Linux 发行版(Centos, Fedora, AlmaLinux, Rocky Linux 等)
sudo dnf install fail2ban
# 对于 debian 系列发行版(Ubuntu, Mint, MX, Kubuntu, Zorin 等等)
sudo apt install fail2ban

# 启动并设置开机自启
sudo systemctl enable --now fail2ban

3. 配置 Fail2Ban

Fail2Ban 的配置文件主要位于/etc/fail2ban/目录,分为核心配置、过滤规则和动作脚本三大类。主配置文件 jail.conf 定义了全局默认参数(如封禁时间、检测阈值等),但应通过 jail.local 进行自定义覆盖以避免升级冲突。过滤器规则(filter.d/*.conf)包含针对不同服务的日志匹配模式(如 SSH 暴力破解或 Nginx 扫描攻击),使用正则表达式识别恶意行为。动作配置(action.d/*.conf)则指定封禁措施,如调用 iptables 或发送告警邮件。此外,paths-*.conf 文件适配不同系统的日志路径,而 fail2ban.local 可调整守护进程本身的运行参数。用户只需重点关注 jail.local 和特定服务的过滤器即可实现灵活防护,其他文件通常保持默认。这种模块化设计使得 Fail2Ban 既能开箱即用,又支持深度定制。

Fail2Ban 配置文件详细介绍

1
2
3
4
5
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
/etc/rc.d/init.d/fail2ban #启动脚本文件

首先拷贝一份配置文件 jail.conf 到 jail.local,然后修改我们比较重要配置项,比如以下三个重要选项,默认值如下:

1
2
3
4
5
6
7
8

# 封禁时间
bantime = 10m
# 在多长时间内
findtime = 10m
# 最大失败次数
maxretry = 5

它的意思是:在 10 分钟内,如果失败超过 5 次,那么就将这个 IP 丢到小黑屋里 10 分钟。

3.1. 使用 Fail2Ban 保护 sshd 服务

如果是首次安装,建议清空 /etc/fail2ban/jail.d 目录下的默认配置,避免对后续配置产生影响。

创建 sshd.local 文件,内容如下

1
2
3
4
5
6
7
8

[sshd]
enabled = true # 启用规则
port = ssh # 将SSH端口设置
filter = sshd # 使用fail2ban sshd过滤器
logpath = /var/log/auth.log # 从这个文件读取sshd log
ignoreip = whitelist-IP # ip 白名单

重新启动 fail2ban:

1
sudo systemctl restart fail2ban

通过命令 systemctl status fail2ban 查看服务运行状态。

3.2. 使用 Fail2Ban 保护 Nginx 服务

/etc/fail2ban/jail.d/ 下面创建一个 nginx.conf

1
sudo vim /etc/fail2ban/jail.d/nginx.conf

内容如下:

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
[nginx-http-auth]
enabled = true
mode = fallback
port = http,https
logpath = /var/log/nginx/access.log

[nginx-limit-req]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

[nginx-bad-request]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

[php-url-fopen]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log

重新启动 fail2ban:

1
sudo systemctl restart fail2ban

通过命令 systemctl status fail2ban 查看服务运行状态。

3.3. 使用 Fail2Ban 保护 WordPress 服务

要使用 Fail2Ban 保护 WordPress 管理面板,您需要下载 WordPress 的 Fail2ban 过滤器配置文件。您可以使用以下命令下载:

1
sudo wget https://plugins.svn.wordpress.org/wp-fail2ban/trunk/filters.d/wordpress-hard.conf -O /etc/fail2ban/filter.d/wordpress.conf

授予 wordpress.conf 可读权限

1
chmod +r /etc/fail2ban/filter.d/wordpress.conf

接下来,通过新建或编辑文件 wordpress.conf 为 WordPress 创建一个 Jail:

1
sudo vim /etc/fail2ban/jail.d/wordpress.conf

添加以下行:

1
2
3
4
5
6
7
8
9
10

[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/auth.log
maxretry = 3
port = http,https
bantime = 300
backend = systemd

完成后保存并关闭文件,然后重新启动 Fail2Ban 服务以应用更改。

1
sudo systemctl restart fail2ban

4. 如何查询 jail 状态

您可以通过运行以下命令列出所有已激活的 Fail2Ban jails:

1
sudo fail2ban-client status

您应该在以下输出中获得所有激活的监狱:

1
2
3
Status
|- Number of jail: 6
`- Jail list: proftpd, pure-ftpd, sshd, webmin-auth, wordpress

如果您想检查特定 Fail2Ban 监狱(SSH)的禁止状态,请运行以下命令:

1
sudo fail2ban-client status sshd

您应该在以下输出中看到被 Fail2Ban 禁止的所有 IP:

1
2
3
4
5
6
7
8
9
10
Status for the jail: sshd
|- Filter
| |- Currently failed: 1
| |- Total failed: 14
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 3
|- Total banned: 3
`- Banned IP list: 209.208.62.183 221.181.185.19 222.186.30.112

您还可以检查 Fail2Ban 日志以查找被禁止的 IP:

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

输出:

1
2
3
4

2021-05-24 12:32:53,084 fail2ban.filter [8715]: INFO [ssh] Found 222.186.30.112 - 2021-05-24 12:32:53
2021-05-24 12:32:53,117 fail2ban.actions [8715]: NOTICE [ssh] Ban 222.186.30.112

如果您想手动阻止任何远程 IP 地址的 SSH 服务,请运行以下命令:

1
sudo fail2ban-client set sshd banip remote-ip-address

您还可以使用以下命令检查 Fail2Ban 添加的 Iptables 规则:

1
sudo iptables -nL

输出:

1
2
3
4
5
6
...
Chain f2b-sshd (1 references)
target prot opt source destination
REJECT all -- 222.186.42.7 0.0.0.0/0 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0

5. 如何解禁被 Fail2Ban 封禁的 IP?

默认情况下,Fail2ban 会按照您在 prison.local 文件中指定的预定义时间间隔自动解除对被禁止的 IP 的禁止。

要手动取消禁止被禁止的 IP,请运行以下命令:

1
2
3

sudo fail2ban-client set sshd unbanip remote-ip-address

您还可以在 jail.local 文件中添加受信任的远程 IP,以便 Fail2Ban 忽略这些 IP。

1
sudo vim /etc/fail2ban/jail.local

在文件顶部添加以下行:

1
2
3
4
5

[DEFAULT]

ignoreip = trusted-ip1 trusted-ip2

保存并关闭文件。然后,重新启动 Fail2Ban 以应用配置。

1
sudo systemctl restart fail2ban

6. 参考文档

利用 Fail2Ban 保护你的服务器

利用 Fail2Ban 保护你的服务器(Fail2Ban 使用教程)

Fail2ban 禁止垃圾采集爬虫,保护 Nginx 服务器

CentOS7 安装 Fail2ban+Firewalld 防止 SSH 或 vsftpd 爆破

How to configure Fail2Ban for common services

作者

鹏叔

发布于

2025-06-16

更新于

2025-06-17

许可协议

评论