
你的服务器现在已经是一座拥有坚固城墙(防火墙)、隐藏城门(自定义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它本身不是防火墙。它更像一个**“日志分析与联动系统”**。
让我们用一个“夜店保镖”的比喻来理解它的工作流程:
- 阅读监控录像 (分析日志): Fail2ban会持续不断地盯着你服务器的各种日志文件(监控录像),比如SSH的登录日志。
- 识别可疑行为 (匹配规则): 它脑子里有一套规则(比如,同一个IP地址,在10分钟内,连续输错3次密码),一旦日志里出现了符合这个规则的行为,它就认定这个IP是“来捣乱的”。
- 通知保镖行动 (调用防火墙): 它不会自己动手。它会立刻通知你服务器真正的“保镖”——防火墙(比如iptables或firewalld),“嘿,门口那个穿红衣服的家伙(某个IP地址),是个坏人,把他拉黑1小时!”
- 执行封禁: 防火墙收到指令,立刻将这个IP地址加入黑名单,在接下来的一小时内,这个IP发送的任何数据包,都会被服务器直接无视,石沉大海。
- 自动解封: 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 + X
,Y
,回车,保存文件。然后,重启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
这才是最激动人心的命令!执行后,你会看到非常详细的信息,包括你的bantime
、findtime
、maxretry
设置。最重要的是,你会看到一个叫**Banned IP list
**的列表。
- 刚开始,这个列表可能是空的。别急,让你的服务器在互联网上“裸奔”一会儿。过个十几分钟,你再回来执行一次这个命令。你会惊喜地发现,那个列表里已经出现了一长串的IP地址!这些,就是那些试图暴力破解你服务器,然后被我们新上岗的“智能保安”抓个正着,并毫不留情地“扔”出去的坏家伙们。
“哎呀,我把自己给锁外面了!”——如何解封?
万一,万一你在某些测试中,不小心把自己公司的IP给封了,导致连不上服务器,怎么办?
别慌,我们的“保安”还是很通情达理的。你可以通过以下命令,手动解封一个IP地址:
Bash
sudo fail2ban-client set sshd unbanip 你的IP地址
执行后,你就能立刻重新连接了。
世界,从此清静了
现在,你可以泡上一杯茶,再次悠闲地去查看你的服务器安全日志。
你会发现,世界清静了。
那些曾经像苍蝇一样嗡嗡作响的、成千上万次的失败登录尝试,已经消失不见了。取而代之的,是Fail2ban这位忠诚卫士,在它的工作日志里(/var/log/fail2ban.log
)留下的、一条条简洁而有力的工作报告:INFO [sshd] Ban 11.22.33.44
。
你不再需要被动地忍受这些噪音。你已经从一个简单的服务器使用者,变成了一个能主动制定规则、将威胁拒之门外的“安全策略师”。
你为你的数字堡垒,雇佣了一位永不疲倦、明察秋毫的哨兵。现在,你可以更专注于你真正的使命——创造。