前言

就一晚上的时间,云服务器遭受了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 的运行机制可以分为以下步骤:

  1. 监控日志文件:Fail2Ban 读取系统日志(如 /var/log/auth.log 或 /var/log/secure),寻找特定的失败模式,例如SSH 登录失败的日志可能包含“Failed password”
  2. 匹配规则(过滤器):,Fail2Ban 使用正则表达式(定义在过滤器文件中,如 /etc/fail2ban/filter.d/sshd.conf)来匹配日志中的失败事件,如检测到“Failed password for root from 202.103.241.27”。
  3. 计数失败尝试:Fail2Ban 跟踪每个 IP 的失败次数(maxretry 参数),如果在指定时间窗口(findtime)内失败次数超过阈值,则触发封禁。
  4. 执行封禁(动作):Fail2Ban 调用预定义的动作(action),通常是修改防火墙规则(如 iptables)来阻止该 IP,封禁持续时间由 bantime 参数决定。
  5. 解封:封禁时间结束后,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:指定发现异常之后怎么处理这个攻击IPiptables-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 要保护的端口号或服务名(比如 sshhttp,也可以指定端口如 22
protocol 使用的协议,通常是 tcp(也可以是 udp
filter 使用哪个过滤器规则(对应 filter.d/*.conf 文件)
action 检测到攻击时采取什么动作,比如 iptables-multiport 封IP
logpath 要监控的日志文件路径,比如 /var/log/auth.log
backend 日志读取方式,常见有 autosystemdpolling
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[sshd]  # 定义一个 jail,名字叫 sshd,保护SSH服务

enabled = true # 启用这个 jail,让 fail2ban 开始保护 SSH

port = ssh # 监控的端口是 ssh(通常是22端口,如果换了要对应改)

logpath = /var/log/auto.log # 指定要监控的日志文件路径(你的SSH登录日志需要写到这里)

backend = systemd # 使用 systemd 作为日志后台,直接从 systemd 日志中拉取数据(更稳定)

maxretry = 10 # 在 findtime 时间段内,允许失败10次,超过就封禁

findtime = 600 # 观察时间窗口是600秒(10分钟内连续失败超过maxretry次数就触发封禁)

bantime = 86400 # 封禁时长86400秒(24小时),被封IP一天后才能自动解封

ignoreip = 127.0.0.1 202.103.241.27 # 本地和你的公网IP白名单,不会被封禁

action = iptables-multiport # 封禁动作,使用iptables同时封禁多个端口(这里主要是封ssh端口)

fail2ban配置

注释原本的sshd配置

常用命令

命令 功能说明
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

被封禁的IP

服务运行状态