服务器被反复尝试登录之后:fail2ban 加密钥登录的五道加固

我手上那台跑测试的服务器,某天晚上翻登录日志,差点没坐住。Failed password 一页接一页,隔几分钟就来一波,IP 天南海北都有,典型的撞库扫描。当天夜里我就把密码登录关了,装上 fail2ban,前后折腾了大概两小时。这篇就把我从确认、加固到复查的完整过程写下来,命令都是能直接照抄的。

第一道:翻出登录日志,确认是真被扫了

先别慌着改配置,得先确认自己是不是真被盯上了。我用的是 Ubuntu,登录日志在 /var/log/auth.log。看最近有没有人在试密码,一条命令的事:

tail -200 /var/log/auth.log | grep "Failed password"

要是刷屏,再统计一下都是哪些 IP 在试:

grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

我那次统计出来,前三名都是境外机房 IP,一个地址就试了几十次。到这一步基本能断定是被字典撞库了,可以动手加固。

第二道:关掉密码登录,只留密钥进门

被扫得这么凶,第一件事就是把最容易撞开的锁换掉。改 /etc/ssh/sshd_config,这两行是关键:

PermitRootLogin no PasswordAuthentication no

改完执行 systemctl restart sshd 让配置生效。这里有个教训,改之前一定先开一个备用 SSH 会话挂着。我第一回改的时候忘了确认新配置能连,差点把自己锁在门外。密钥我用 ssh-keygen 生成的 ed25519 密钥,公钥放进 authorized_keys,之后全靠密钥连,密码试一万次也进不来。

第三道:装上 fail2ban,先让默认规则挡着

密钥登录只是换了把结实的锁,fail2ban 相当于在门口雇了个保安,谁连续试密码就把他拉黑。装起来很简单:

apt update && apt install -y fail2ban

装完默认就带一个 sshd 的 jail。有个坑提前说,日志路径别配错,Debian、Ubuntu 系是 /var/log/auth.log,CentOS 系是 /var/log/secure,配错的话后面验证会显示不到任何东西。

第四道:按自己情况改 jail,误封了自己有救

默认规则对我太宽松,我按实际改了 /etc/fail2ban/jail.local:

sshd enabled = true maxretry = 3 findtime = 600 bantime = 3600

意思是一分钟内试错 3 次,就把这个 IP 封一小时。改完重启:systemctl restart fail2ban。

这里有个坑必须说,maxretry 设太严容易误伤。我有次图省事设成 2,结果自己一个老脚本还在用密码连,把办公室的出口 IP 给封了。好在解封很快,一条命令:

fail2ban-client set sshd unbanip 被封的那个IP

第五道:验证封禁,几天后回头复查

配完不是就完事了,得验证封禁到底有没有生效。看状态:

fail2ban-client status sshd

正常的话 Banned IP list 下面会挂着被封的 IP。再从防火墙侧确认规则真的加上了:

iptables -L -n | grep f2b

我那次配完当天就封了十几个 IP,第三天再翻 auth.log,Failed password 从刷屏降到基本看不到。之后我每周抽查一次封禁列表,看看有没有漏网的。

整套SSH加固流程走完,我心里踏实多了。服务器安全这种事,没出事之前总觉得离自己远,真被扫一次才知道疼。这篇是服务器安全实操系列的一篇,前面写过 Linux 加固的土办法,后面准备写被 CC 攻击时的处置和 webshell 排查,都是我自己踩过的坑。想看后续的可以关注账号。

相关推荐
金銀銅鐵7 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设7 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
Linux运维技术栈8 小时前
CVE-2026-91403 高危漏洞修复:Rocky Linux 9 多版本 JDK 环境清理实操
java·linux·运维
slongzhang_10 小时前
linux 递归删除源码文件|递归删除目录下 *.js,但排除 *.min.js
linux·开发语言·javascript
叼烟扛炮10 小时前
Linux 学习笔记(三十三):线程互斥——互斥锁(Mutex)与死锁
linux·运维·服务器·笔记·学习·1024程序员节
无足鸟ICT10 小时前
【RHCA+】who命令(查看已登陆用户)
linux·运维·服务器
Escalating_xu10 小时前
【Linux 网络编程】应用层协议 HTTP(下):Header、连接管理与 C++ HTTP 服务器
linux·服务器·网络
小溪学编程10 小时前
Spring @Bean 与 @Component 注解的区别详解
java·后端·spring
IT_陈寒11 小时前
Python的列表推导式用不好真的会爆内存你知道吗
前端·人工智能·后端
摸爬滚打的小李12 小时前
TomCat
后端