Fail2ban安装与配置教程:自动防止Linux服务器SSH暴力破解 (2025)

Fail2ban安装与配置教程:自动防止Linux服务器SSH暴力破解 (2025)

你的服务器现在已经是一座拥有坚固城墙(防火墙)、隐藏城门(自定义SSH端口)、并且只认你这个主人“生物信息”(SSH密钥)的私人堡垒了。理论上,它已经非常安全。

但你可能在夜深人静的时候,出于好奇或者偏执,打开了服务器的系统日志文件(比如 /var/log/auth.log/var/log/secure)。然后,你看到了什么?

你可能会看到成百上千条这样的记录:

Failed password for invalid user guest from 123.45.67.89 port 12345 ssh2 Failed password for root from 98.76.54.32 port 54321 ssh2

是不是感觉头皮发麻?尽管这些攻击因为你禁用了密码登录而注定失败,但这种感觉,就像你住在一个极其安全的房子里,门锁是世界顶级的,可每天总有成千上万的陌生人,在你家门口,不知疲倦地、一次又一次地尝试用各种错误的钥匙来开你的门。

他们进不来,但他们制造的“噪音”(系统日志)实在太烦人了,而且,万一哪天你的某个服务忘记关闭密码登录,这不就成了巨大的安全隐患吗?

有没有一个办法,能让这些讨厌的家伙,在试了你家门锁两三次之后,就自动被一个“智能保安”发现,然后被“请”出去,并且短时间内不准再靠近你的房子?

当然有。这个智能、忠诚、而且免费的“保安”,就是我们今天的主角——Fail2ban

Fail2ban到底是个什么“神仙”?

首先,你得明白,Fail2ban它本身不是防火墙。它更像一个**“日志分析与联动系统”**。

让我们用一个“夜店保镖”的比喻来理解它的工作流程:

  1. 阅读监控录像 (分析日志): Fail2ban会持续不断地盯着你服务器的各种日志文件(监控录像),比如SSH的登录日志。
  2. 识别可疑行为 (匹配规则): 它脑子里有一套规则(比如,同一个IP地址,在10分钟内,连续输错3次密码),一旦日志里出现了符合这个规则的行为,它就认定这个IP是“来捣乱的”。
  3. 通知保镖行动 (调用防火墙): 它不会自己动手。它会立刻通知你服务器真正的“保镖”——防火墙(比如iptables或firewalld),“嘿,门口那个穿红衣服的家伙(某个IP地址),是个坏人,把他拉黑1小时!”
  4. 执行封禁: 防火墙收到指令,立刻将这个IP地址加入黑名单,在接下来的一小时内,这个IP发送的任何数据包,都会被服务器直接无视,石沉大海。
  5. 自动解封: 1小时后,Fail2ban会再次通知防火墙:“那个红衣服的家伙惩罚时间到了,可以把他从黑名单里放出来了。”

整个过程,全自动,无需你任何干预。它就是一个完美的、7×24小时不打盹的、自动识别并惩罚“坏人”的智能安保系统。是不是很酷?

第一步:给你的服务器“招聘”这位保安 (安装Fail2ban)

安装过程简单到只需要一行命令。

如果你用的是Ubuntu或Debian系统:

Bash

sudo apt update
sudo apt install fail2ban

如果你用的是CentOS或Red Hat系统:

Bash

sudo yum install epel-release
sudo yum install fail2ban

安装完成后,Fail2ban服务会自动启动。但别急,现在的它,还只是个“通用版”保安,我们需要根据自家的情况,给它下达一些“专属指令”。

第二步:为你的保安“量身定制”工作手册 (配置Fail2ban)

这是整个流程中最重要,也最能体现你专业性的一步。

Fail2ban的所有默认规则,都写在/etc/fail2ban/jail.conf这个文件里。但是,我们绝对、绝对、绝对不要直接修改这个文件!

为什么?因为一旦Fail2ban这个软件更新,你辛辛苦苦修改过的一切,都可能被新版本的默认文件覆盖掉,一夜回到解放前。

正确的做法是,我们创建一个叫jail.local的“本地复写本”。Fail2ban的加载逻辑是,先读取.conf文件,再读取.local文件。如果在.local文件里发现了和.conf里相同的配置项,它就会优先使用.local里的设置。这样既安全,又方便我们管理和升级。

1创建你的本地配置文件。 我们直接从默认文件复制一份过来:

Bash

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

2编辑你的专属指令。 现在,我们来打开这个jail.local文件,为我们的“保安”设定工作细则。

Bash

sudo nano /etc/fail2ban/jail.local

打开后,你会看到很多配置项。别怕,我们只关心最重要的那几个,它们都在[DEFAULT]这个区域下面。

  • bantime:这是“拉黑时长”。默认可能是10m(10分钟)。对于那些不怀好意的机器人来说,10分钟太短了,它一会儿就又来了。我建议你把它改得更长一些,比如1h(1小时)或者24h(24小时)。
  • findtime:这是“观察窗口”。它配合maxretry一起工作。默认的10m意味着“在10分钟内”。
  • maxretry:这是“最大尝试次数”。默认可能是5

把这三个配置连起来读,就是这位保安的工作规则:“如果我发现任何IP,在10分钟内 (findtime),尝试登录失败的次数超过了5次 (maxretry),我就把它拉黑1小时 (bantime)。” 你可以根据自己的需求,调整这些数值。比如,改成更严格的“1小时内失败3次,就拉黑1天”。

3为SSH服务开启“特殊保护”。 往下滚动文件,你会找到很多用[服务名]包裹起来的区域,比如[sshd][nginx-http-auth]等等。这些就是Fail2ban能保护的各种服务,我们称之为“监狱”(Jail)。

默认情况下,它们可能都没有被启用。我们需要找到[sshd]这一块,确保它的enabled设置是true

Ini, TOML

[sshd]
enabled = true

最关键的一步来了! 如果你按照我们之前的安全教程,已经把SSH的默认端口从22改成了其他端口(比如23456),你就必须在这里告诉Fail2ban。否则,它还在傻傻地盯着已经没人用的22端口。

[sshd]区域下,加上或修改port这一行:

Ini, TOML

[sshd]
enabled = true
port    = 23456  # 这里改成你自己的SSH端口
# ... 其他配置

4保存并重启服务。 修改完成后,按Ctrl + XY,回车,保存文件。然后,重启Fail2ban服务,让我们的“新工作手册”生效。

Bash

sudo systemctl restart fail2ban

第三步:检查工作成果——“保安,报一下今天的战况”

配置好了,怎么知道我们的“保安”有没有在上岗摸鱼呢?我们需要一个方法来检查它的工作状态。这个方法就是fail2ban-client命令。

1查看总体状态:

Bash

sudo fail2ban-client status

这个命令会告诉你,现在有几个“监狱”正在被激活。你应该能看到Jail list:后面跟着sshd

2查看SSH监狱的详细战报:

Bash

sudo fail2ban-client status sshd

这才是最激动人心的命令!执行后,你会看到非常详细的信息,包括你的bantimefindtimemaxretry设置。最重要的是,你会看到一个叫**Banned IP list**的列表。

  1. 刚开始,这个列表可能是空的。别急,让你的服务器在互联网上“裸奔”一会儿。过个十几分钟,你再回来执行一次这个命令。你会惊喜地发现,那个列表里已经出现了一长串的IP地址!这些,就是那些试图暴力破解你服务器,然后被我们新上岗的“智能保安”抓个正着,并毫不留情地“扔”出去的坏家伙们。

“哎呀,我把自己给锁外面了!”——如何解封?

万一,万一你在某些测试中,不小心把自己公司的IP给封了,导致连不上服务器,怎么办?

别慌,我们的“保安”还是很通情达理的。你可以通过以下命令,手动解封一个IP地址:

Bash

sudo fail2ban-client set sshd unbanip 你的IP地址

执行后,你就能立刻重新连接了。

世界,从此清静了

现在,你可以泡上一杯茶,再次悠闲地去查看你的服务器安全日志。

你会发现,世界清静了。

那些曾经像苍蝇一样嗡嗡作响的、成千上万次的失败登录尝试,已经消失不见了。取而代之的,是Fail2ban这位忠诚卫士,在它的工作日志里(/var/log/fail2ban.log)留下的、一条条简洁而有力的工作报告:INFO [sshd] Ban 11.22.33.44

你不再需要被动地忍受这些噪音。你已经从一个简单的服务器使用者,变成了一个能主动制定规则、将威胁拒之门外的“安全策略师”。

你为你的数字堡垒,雇佣了一位永不疲倦、明察秋毫的哨兵。现在,你可以更专注于你真正的使命——创造。

知识库

服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份

2025-8-4 15:36:49

知识库

5款服务器监控工具推荐:支持钉钉/飞书告警,实时掌握服务器状态 (2025)

2025-8-5 11:20:13

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧