Linux防止暴力破解工具:fail2ban
前言
就一晚上的时间,云服务器遭受了1900多条SSH暴力攻击,在网上裸奔还是比较危险和容易遭受网络攻击的,如果用的是弱密码很容易被攻破成为肉鸡,所以还是要用强密码,并且配合上保护软件进行防护,1Panel提示可以使用fail2ban软件进行ssh防护,才知道有这个软件,之前都不知道这个是什么。
什么是fail2ban
项目官方地址:fail2ban
Fail2Ban 是一个开源的入侵防御软件,主要用于保护服务器免受暴力破解和其他恶意行为的侵害。它最初是为防止 SSH 暴力破解设计的,但也支持多种服务(如 HTTP、FTP、SMTP 等)。Fail2Ban 通过监控系统日志文件,检测可疑活动,并在发现恶意行为时自动采取防护措施。
fail2ban 就像服务器的护卫,随时盯着的登录日志,一发现有人爆破,就根据规则执行封禁,让 Linux 服务器更安全、压力更小,它轻量、灵活、能防很多种暴力破解场景,是 Linux 安全必备工具之一。
Fail2Ban 通常运行在 Linux 系统上,支持大多数主流发行版(如 Ubuntu、CentOS、Debian 等)
官方介绍:
Fail2Ban 会扫描日志文件/var/log/auth.log并封禁登录失败次数过多的 IP 地址。它会更新系统防火墙规则,拒绝来自这些 IP 地址的新连接,封禁时间可配置。Fail2Ban 开箱即用,可以读取许多标准日志文件,例如 sshd 和 Apache 的日志文件,并且可以轻松配置为读取您选择的任何日志文件,以查找任何您想要的错误。虽然 Fail2Ban 能够降低身份验证尝试失败的概率,但它无法消除弱身份验证带来的风险。如果您确实希望保护服务,请将服务设置为仅使用双因素身份验证或公私身份验证机制。
fail2ban的功能
Fail2Ban 的核心功能是自动化检测和阻止恶意活动,具体作用包括:
监控日志文件(比如 SSH 登录日志)
检测异常登录失败(比如连续输错密码)
自动用防火墙(iptables)封掉攻击 IP,临时禁止它继续尝试。
防止暴力破解,检测多次登录失败的尝试(例如 SSH、Web 服务器、邮件服务器等)
动态封禁 IP,通过修改防火墙规则(如 iptables、nftables 或 firewalld),Fail2Ban 可以临时或永久封禁恶意 IP,封禁时间(bantime)可配置,例如 1 小时、1 天,甚至永久
减少服务器负载,通过阻止恶意请求,减少服务器因暴力破解而导致的高负载(例如 CPU 和网络资源被占用)
通知和日志,Fail2Ban 可以记录封禁事件,并通过邮件或其他方式通知管理员
fail2ban核心概念
| 名称 | 意思 |
|---|---|
| jail | 一个防护规则,比如 SSH 的 jail,Nginx 的 jail |
| filter | 定义了匹配日志的规则(比如什么算是失败) |
| action | 发现异常后做什么动作(封IP、发邮件等) |
| ban | 指定失败次数、时间窗口、封禁时长等参数 |
jail 其实就是:过滤规则 + 动作 + 时间策略
fail2ban工作流程
Fail2Ban 的运行机制可以分为以下步骤:
- 监控日志文件:Fail2Ban 读取系统日志(如 /var/log/auth.log 或 /var/log/secure),寻找特定的失败模式,例如SSH 登录失败的日志可能包含“Failed password”
- 匹配规则(过滤器):,Fail2Ban 使用正则表达式(定义在过滤器文件中,如 /etc/fail2ban/filter.d/sshd.conf)来匹配日志中的失败事件,如检测到“Failed password for root from 202.103.241.27”。
- 计数失败尝试:Fail2Ban 跟踪每个 IP 的失败次数(maxretry 参数),如果在指定时间窗口(findtime)内失败次数超过阈值,则触发封禁。
- 执行封禁(动作):Fail2Ban 调用预定义的动作(action),通常是修改防火墙规则(如 iptables)来阻止该 IP,封禁持续时间由 bantime 参数决定。
- 解封:封禁时间结束后,Fail2Ban 自动解除封禁,或者管理员可以手动解封。
常用参数
logpath:告诉 fail2ban 要监控哪个日志文件,里面要有“登录失败”之类的记录,fail2ban 会不停扫描这个文件内容,一旦发现异常(比如密码输错),就根据设置处理。不同服务产生日志的位置不一样,要对应你的服务改。如果你自己定义了一个日志文件(比如auto.log),要保证 SSH 服务有正确写日志进去,不然 fail2ban扫描不到。
| 用途 | logpath 示例 |
|---|---|
| 保护 SSH | /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(CentOS/RHEL) |
| 保护 Nginx 后台 | /var/log/nginx/error.log |
| 保护 FTP (vsftpd) | /var/log/vsftpd.log |
| 保护邮件服务器 | /var/log/maillog(Postfix/Dovecot) |
backend:指定 fail2ban 用什么方式读取日志,有些系统是传统的”扫文件”,有些新系统(比如Ubuntu18+,CentOS7+)已经用systemd管理日志了,所以需要特别指定。
| 选项 | 说明 |
|---|---|
| auto | 自动检测最合适的模式(推荐,不确定时用这个) |
| systemd | 直接从 journalctl 读取 systemd 日志(适合现代Linux系统) |
| polling | 定时扫描日志文件变化(兼容性最高,但性能稍低) |
| gamin | 用 gamin 文件通知机制(很少用了) |
| inotify | 用 inotify 实时监听文件变化(效率高,老系统可能不支持) |
action:指定发现异常之后怎么处理这个攻击IP。iptables-multiport,意思是用防火墙 iptables 来封IP,并且可以一口气封多个端口。
| 选项名 | 说明 |
|---|---|
| iptables-multiport | 用 iptables 同时封禁多个端口(最常用) |
| iptables-allports | 封掉攻击IP的所有端口,更狠 |
| firewallcmd-multiport | 如果系统用 firewalld(比如CentOS 7+)时用 |
| nftables-multiport | 如果系统防火墙是 nftables 时用 |
| route | 直接在路由层丢弃攻击者的数据包(轻量) |
| sendmail-whois | 检测到攻击,给管理员发送邮件告警 |
| dummy | 测试用,不做任何操作 |
其他参数和含义
| 参数名 | 含义 |
|---|---|
| enabled | 是否启用这个 jail,true 表示启用,false 表示禁用 |
| port | 要保护的端口号或服务名(比如 ssh、http,也可以指定端口如 22) |
| protocol | 使用的协议,通常是 tcp(也可以是 udp) |
| filter | 使用哪个过滤器规则(对应 filter.d/*.conf 文件) |
| action | 检测到攻击时采取什么动作,比如 iptables-multiport 封IP |
| logpath | 要监控的日志文件路径,比如 /var/log/auth.log |
| backend | 日志读取方式,常见有 auto、systemd、polling |
| maxretry | 在 findtime 时间内允许的最大失败次数,超过就封禁 |
| findtime | 统计失败次数的时间窗口(秒),比如600秒表示10分钟内统计 |
| bantime | 封禁时长(秒),比如 600 是封禁10分钟,-1表示永久封禁 |
| bantime.increment | 动态增加封禁时间,每次被封后bantime增长 |
| bantime.factor | 封禁时间增长的倍数,比如设置2,每次被封时间翻倍 |
| bantime.formula | 用数学公式自定义封禁时长,比如 bantime * (1 + failures) |
| ignoreip | 白名单 IP 地址或网段,永远不会被封,可以多个用空格隔开 |
| banaction | 封禁动作(iptables、firewalld、nftables等,根据系统情况选择) |
| banaction_allports | 封禁所有端口的动作,通常用在严重封锁的情况 |
| destemail | 发生封禁时通知的邮箱地址 |
| sender | 发封禁通知邮件时使用的发件人邮箱 |
| mta | 用哪个邮件服务发送邮件(如 sendmail, mail, smtp) |
| protocol | 指定协议,常用 tcp |
| chain | 指定防火墙链(通常是 INPUT) |
fail2ban 自带很多现成的 jail,可以保护多种服务:
- sshd(远程登录保护)
- nginx-http-auth(网站后台登录保护)
- vsftpd(FTP服务器保护)
- postfix、dovecot(邮件服务器保护)
- apache-auth(网站后台登录保护)
可以根据需要打开或自定义。
配置文件位置
默认安装后,fail2ban 的配置通常在 /etc/fail2ban/,主要是下面这些:
| 文件/目录 | 用途 |
|---|---|
| fail2ban.conf | 主配置文件(很少动) |
| jail.conf | 默认规则模板(一般不要直接改) |
| jail.local | 自定义配置,写配置就在上面写,如果默认没有这个文件就复制jail.conf然后改名为jail.local并写入相关配置(主用) |
| jail.d/ | 存放分散的小配置文件 |
| filter.d/ | 存放过滤规则文件(比如 sshd.conf) |
| action.d/ | 存放动作文件(比如封 IP 的操作) |
云服务器fail2ban配置
需要注意的是[sshd] 原本是注释掉的形式# [sshd] ,需要把标题的注释符号#也删掉,然后复制下面的各项规则在[sshd] 后面
jail.local文件夹本身是有两个[sshd] 的,取消注释第一个[sshd] 并在后面写入规则之后,要把下面默认打开的[sshd] 相关内容注释掉
1 | [sshd] # 定义一个 jail,名字叫 sshd,保护SSH服务 |
常用命令
| 命令 | 功能说明 |
|---|---|
| systemctl start fail2ban | 启动 fail2ban 服务 |
| systemctl stop fail2ban | 停止 fail2ban 服务 |
| systemctl restart fail2ban | 重启 fail2ban 服务(修改配置后需要重启) |
| systemctl status fail2ban | 查看 fail2ban 当前运行状态 |
| fail2ban-client status | 查看 fail2ban 总体状态和受保护的 jail 列表 |
| fail2ban-client status <jail名> | 查看某个具体 jail(比如 sshd)的详细封禁情况 |
| fail2ban-client reload | 重新加载配置文件,不重启服务;应用新的配置文件(如 jail.local)而不停止服务 |
| fail2ban-client set <jail名> banip <IP地址> | 手动封禁某个 IP 地址 |
| fail2ban-client set <jail名> unbanip <IP地址> | 手动解封某个 IP 地址 |
| fail2ban-client add <jail名> | 手动添加一个 jail(很少用,通常配置文件定义) |
| fail2ban-client del <jail名> | 手动删除一个 jail(很少用) |
| fail2ban-client ping | 检查 fail2ban 服务是否在正常响应,返回 Server replied: pong 表示服务正常运行 |
fail2ban-client status








