使用 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 |
|
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 | /etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置 |
首先拷贝一份配置文件 jail.conf 到 jail.local,然后修改我们比较重要配置项,比如以下三个重要选项,默认值如下:
1 |
|
它的意思是:在 10 分钟内,如果失败超过 5 次,那么就将这个 IP 丢到小黑屋里 10 分钟。
3.1. 使用 Fail2Ban 保护 sshd 服务
如果是首次安装,建议清空 /etc/fail2ban/jail.d 目录下的默认配置,避免对后续配置产生影响。
创建 sshd.local 文件,内容如下
1 |
|
重新启动 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 | [nginx-http-auth] |
重新启动 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 |
|
完成后保存并关闭文件,然后重新启动 Fail2Ban 服务以应用更改。
1 | sudo systemctl restart fail2ban |
4. 如何查询 jail 状态
您可以通过运行以下命令列出所有已激活的 Fail2Ban jails:
1 | sudo fail2ban-client status |
您应该在以下输出中获得所有激活的监狱:
1 | Status |
如果您想检查特定 Fail2Ban 监狱(SSH)的禁止状态,请运行以下命令:
1 | sudo fail2ban-client status sshd |
您应该在以下输出中看到被 Fail2Ban 禁止的所有 IP:
1 | Status for the jail: sshd |
您还可以检查 Fail2Ban 日志以查找被禁止的 IP:
1 | sudo tail -f /var/log/fail2ban.log |
输出:
1 |
|
如果您想手动阻止任何远程 IP 地址的 SSH 服务,请运行以下命令:
1 | sudo fail2ban-client set sshd banip remote-ip-address |
您还可以使用以下命令检查 Fail2Ban 添加的 Iptables 规则:
1 | sudo iptables -nL |
输出:
1 | ... |
5. 如何解禁被 Fail2Ban 封禁的 IP?
默认情况下,Fail2ban 会按照您在 prison.local 文件中指定的预定义时间间隔自动解除对被禁止的 IP 的禁止。
要手动取消禁止被禁止的 IP,请运行以下命令:
1 |
|
您还可以在 jail.local 文件中添加受信任的远程 IP,以便 Fail2Ban 忽略这些 IP。
1 | sudo vim /etc/fail2ban/jail.local |
在文件顶部添加以下行:
1 |
|
保存并关闭文件。然后,重新启动 Fail2Ban 以应用配置。
1 | sudo systemctl restart fail2ban |
6. 参考文档
利用 Fail2Ban 保护你的服务器(Fail2Ban 使用教程)
Fail2ban 禁止垃圾采集爬虫,保护 Nginx 服务器
使用 fail2ban 保护你的 VPS