SSH 总是被爆破?手把手教你用 Fail2ban 自动封禁暴力破解的黑客 IP,从此日志清净了

相信不少站长都有过这样的经历:刚买回来的云服务器,还没来得及配置正式环境,随手翻一眼 /var/log/auth.log,好家伙,几万条 SSH 登录失败的记录,全是来自五湖四海的“黑客”在日夜不停地试密码。这些肉鸡扫描器就像苍蝇一样,嗡嗡嗡地撞你的窗户,虽然大概率攻不破强密码,但看着那几万条日志,心里总归是发毛的,而且还会白白消耗服务器的 CPU 资源。

今天这篇文章,笔者就来手把手带大家部署 Fail2ban,用最简单粗暴的方式,把这些暴力破解的 IP 直接关进“小黑屋”防火墙,让它们连连接的机会都没有。

为什么你的服务器总在被扫?

💡 推荐阅读:WordPress 评论风暴与Pingback漏洞,我用这5招彻底根治,亲测有效!

这年头,公网 IP 都是公开的秘密。黑客们写好的扫描脚本,会 24 小时不间断地遍历整个 IP 段,专门找开放了 22 端口的机器。它们不需要针对你,只需要广撒网。如果你用的是默认端口 22,且密码设置得不够复杂,被破防只是时间问题。而 Fail2ban 的逻辑很简单:在指定的时间内,如果某个 IP 连续输错密码超过 N 次,我就直接调起防火墙规则,把这个 IP 拉黑一段时间。

环境准备与前置要求

🔥 【限时特惠福利】高性价比独享云服务器限时 1 折起

搭建网站或部署容器推荐选择高稳定性独享云服务器。限时特惠通道开放中,点击即可领取专属满减代金券与特惠折扣:

👉 立刻领取云服务器限时优惠券

💡 延伸阅读:WordPress 慢得像老牛拉破车?Redis 对象缓存与页面加速方案深度横评,看完不再纠结选哪个

在开始操作之前,请确认你的服务器环境满足以下条件:

  • 操作系统: 本文以 Debian/Ubuntu 系为例(CentOS/RHEL 系命令略有不同,但思路一致)。
  • 权限要求: 你需要拥有服务器的 root 权限,或者具备 sudo 提权能力。
  • 网络环境: 确保服务器能正常访问外网,以便安装软件包。
  • 安全基线: 笔者强烈建议,在安装 Fail2ban 之前,先做好一件事:禁用密码登录,改用密钥登录。这是治本之策,Fail2ban 只是治标。如果你还没配置密钥登录,建议先配置好再继续,否则小心把自己锁在门外。

详细实操步骤:从安装到生效

💡 深度技术指南:Docker 容器跨服务器数据备份与一键迁移:资深站长的生产环境 SOP 实战指南

第一步:安装 Fail2ban 服务

首先,更新软件源并安装 Fail2ban。在终端执行以下命令:

# 更新软件包索引
sudo apt update

# 安装 fail2ban
sudo apt install fail2ban -y

安装过程很快,依赖包不多。安装完成后,我们先不急着启动,因为默认配置不够“激进”,我们需要根据自己的需求来定制规则。

第二步:创建本地配置文件(关键)

Fail2ban 的主配置文件是 /etc/fail2ban/jail.conf,但官方强烈不建议直接修改它,因为软件升级时可能会覆盖你的改动。正确做法是创建一个 jail.local 文件,这个文件会覆盖默认配置。

# 复制一份默认配置作为参考(可选)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑本地配置文件
sudo nano /etc/fail2ban/jail.local

打开文件后,找到 [sshd] 这一段配置(通常在文件末尾或中间位置)。我们需要修改或确认以下几个关键参数:

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400
findtime = 600

参数详解:

  • enabled: 必须设置为 true,表示启用 SSH 保护。
  • maxretry: 允许的最大失败次数。这里设置为 3,意味着 10 分钟内错 3 次就封。
  • bantime: 封禁时长,单位是秒。86400 代表 24 小时。如果你觉得太狠,可以改成 3600(1小时)。
  • findtime: 统计时间窗口,单位是秒。600 代表 10 分钟。

简单来说,上面的配置就是:在 10 分钟内,如果同一个 IP 登录失败 3 次,就封禁它 24 小时。

第三步:忽略白名单 IP(千万别漏了)

这是非常容易踩坑的地方!如果你的 IP 是动态的,或者你经常在公司、家里多个网络环境切换,一定要把常用 IP 加入白名单,防止误封。在 jail.local 文件的 [DEFAULT] 段落中,找到 ignoreip 参数:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 你的常用IP地址

你的常用IP地址 替换成你本机当前的公网 IP。如果不确定,可以百度搜索“IP”查询。如果你有固定办公网 IP,也建议一并加上,用空格分隔。

第四步:启动并验证 Fail2ban 生效

保存配置文件并退出。接下来重启服务,让配置生效:

# 重启 fail2ban 服务
sudo systemctl restart fail2ban

# 设置开机自启
sudo systemctl enable fail2ban

# 查看服务运行状态
sudo systemctl status fail2ban

看到绿色的 Active: active (running) 就说明服务已经正常运行了。接下来,我们可以通过客户端命令来查看封禁列表:

# 查看 fail2ban 的客户端状态
sudo fail2ban-client status

# 查看 sshd 监狱的详细封禁列表
sudo fail2ban-client status sshd

如果一切正常,你会看到类似下面的输出信息:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     5
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     2
   `- Banned IP list:   123.45.67.89

看到 Banned IP list 里有 IP 地址,恭喜你,你的防御系统已经开始工作了!

避坑清单:这些细节决定成败

在实际部署和使用过程中,有几个坑是新手甚至老手都容易踩的,笔者特意整理出来供大家参考:

常见问题 原因分析 解决方案
Fail2ban 不生效,IP 一直在刷 日志路径不对,或者 filter 正则匹配不上。 检查 logpath 是否为 /var/log/auth.log(Debian系)。使用 sudo tail -f /var/log/auth.log 观察日志格式。
把自己封禁了 未设置 ignoreip,或者 IP 是动态的。 通过云服务商的控制台(VNC)登录,修改 ignoreip 并重启服务。
封禁后 IP 还能继续尝试 可能是 IPv6 地址,或者防火墙规则冲突。 检查是否同时封禁了 IPv6(banip 是否包含 ::)。确认系统自带防火墙(ufw/firewalld)规则优先级。
重启服务器后封禁列表丢失 Fail2ban 默认将封禁信息存在内存中。 使用 dbpurgeage 参数或持久化数据库,但一般无需纠结,重启后攻击者也会重新扫描。

进阶技巧:修改 SSH 默认端口

如果想让你的服务器更安全一点,建议把 SSH 默认的 22 端口改成一个高位随机端口(比如 222245678)。这一步能直接过滤掉 90% 以上的傻瓜式扫描攻击。

# 修改 SSH 配置文件
sudo nano /etc/ssh/sshd_config

# 找到 Port 22 这一行,去掉注释并修改为:
Port 45678

# 保存退出后,重启 SSH 服务
sudo systemctl restart sshd

修改后,记得在云服务商的安全组/防火墙规则里,放行新端口,并删除旧的 22 端口入站规则(或者仅限白名单)。同时,Fail2ban 的 port 参数也需要改成对应的新端口。

写在最后

部署 Fail2ban 属于成本极低、收益极高的安全投入。它虽然不能像 WAF 那样拦截应用层攻击,但在抵御最原始的暴力破解扫描上,绝对是一把好手。折腾完这些,你再去翻看系统日志,会发现世界瞬间清净了许多。

当然,安全防护是立体化的。Fail2ban 只是其中一环。如果你还在为服务器的基础安全操心,不妨考虑选择一家提供免费安全组和基础 DDoS 防护的靠谱云服务商,毕竟底层网络干净了,上层应用才能跑得安稳。希望这篇实操指南能帮你解决实际问题,让你的服务器从此告别“被爆破”的烦恼。

相关技术专题与延伸阅读

📦 【资源免费领】本文全套实操配置文件与避坑手册下载

本文涉及的全套 Docker Compose 配置文件、服务器运维避坑清单及 AI 提效指令库已完整打包,可免费极速转存:

👉 点击前往夸克网盘免费极速转存(手机端领 1TB 空间)

💡 提示:推荐使用手机【夸克网盘 App】打开保存,新用户首月免费赠送 1TB 超大空间与免流量极速下载特权。

滚动至顶部