给小服务器加一层 fail2ban:自动封禁暴力破解 SSH 的 IP

举报
yd_211833921 发表于 2026/11/07 04:16:04 2026/11/07
【摘要】 一台暴露在公网上的小服务器,最常见的“访客”往往不是人,而是全网扫描的 SSH 爆破程序。它们拿着常见用户名和弱口令字典,一天 24 小时不停地敲门。单靠把密码设复杂一点是不够的:只要 SSH 端口还开着,这种尝试就不会停。今天给自己的小服务器加一层 fail2ban,让它自动识别爆破行为并把对应的 IP 封掉,把重复劳动交给机器。 一、先看日志:爆破长什么样动手之前,先确认自己的服务器是不...

一台暴露在公网上的小服务器,最常见的“访客”往往不是人,而是全网扫描的 SSH 爆破程序。它们拿着常见用户名和弱口令字典,一天 24 小时不停地敲门。单靠把密码设复杂一点是不够的:只要 SSH 端口还开着,这种尝试就不会停。今天给自己的小服务器加一层 fail2ban,让它自动识别爆破行为并把对应的 IP 封掉,把重复劳动交给机器。

一、先看日志:爆破长什么样

动手之前,先确认自己的服务器是不是真的在被扫。Debian/Ubuntu 的认证日志在 /var/log/auth.log,RHEL/CentOS 系一般在 /var/log/secure,里面会有大量这样的记录:

Failed password for root from 203.0.113.10 port 51234 ssh2
Failed password for invalid user admin from 203.0.113.10 port 51235 ssh2

用一条命令就能看清形势:

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

如果同一个 IP 在几分钟内出现几十上百次,基本可以断定是爆破;如果还夹杂着 invalid user、root、admin、test 这类用户名轮换,那就更典型了。先看日志再动手,还有一个好处:封禁之后可以拿同一条命令做前后对比,效果一目了然。

二、安装 fail2ban

Debian/Ubuntu:

sudo apt update && sudo apt install -y fail2ban

RHEL/CentOS 需要先装 EPEL:

sudo dnf install -y epel-release
sudo dnf install -y fail2ban

fail2ban 本身不监听端口,它的工作方式很朴素:定时读日志,按规则数失败次数,够数了就调用防火墙把 IP 封一段时间,时间到了自动解封。

三、写一份 jail.local:三个参数是关键

不要直接改 /etc/fail2ban/jail.conf,升级会被覆盖。正确做法是新建 /etc/fail2ban/jail.local,只写自己要改的部分:

[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

这三个参数要一起理解:findtime 是观察窗口,这里是 600 秒;maxretry 是窗口内允许的失败次数,这里是 5 次;bantime 是封禁时长,这里是 3600 秒,也就是一小时。换句话说,同一个 IP 在 10 分钟内输错 5 次密码,就会被封一小时。刚开始建议把 bantime 设短一点,比如 600 秒,观察几天、确认没有误封自己之后再加长;findtime 和 maxretry 也别设得太苛刻,否则自己手抖输错几次就把自己锁在门外了。

四、启用并验证它真的在工作

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
sudo fail2ban-client status sshd

最后一条命令的输出里,Currently banned 一栏就是当前被封的 IP 数量,Total banned 是累计封禁次数。如果输出里能看到 sshd 这个 jail 处于启用状态,说明配置已经生效。想验证得更实在一点,可以从另一台机器故意输错几次密码,再回来查状态,看到自己的测试 IP 进了 banned 列表,就说明整条链路是通的,之后记得用解封命令把它放出来。

五、误封了怎么办:解封命令

sudo fail2ban-client set sshd unbanip 203.0.113.10
sudo fail2ban-client status sshd

第一条是手动解封,第二条是复查。如果是自己被封了,优先用云厂商的控制台登录(VNC 或串口),不要在原地反复试密码,那只会让封禁时间不断刷新。也可以把自己常用的办公 IP 写进 jail.local 的 ignoreip 里,例如 ignoreip = 127.0.0.1/8 203.0.113.20,但这条要慎用:只写固定可信的 IP,不要把一段大网段都加进去。

六、别只靠封禁:和密钥登录配合

fail2ban 是“减噪器”,不是“保险箱”。它能挡住低成本的字典爆破,但挡不住针对性攻击。真正该做的是把密码登录逐步关掉,改用密钥登录:先把自己的公钥放进 ~/.ssh/authorized_keys,确认能用密钥登录之后,再把 /etc/ssh/sshd_config 里的 PasswordAuthentication 改成 no,PermitRootLogin 改成 prohibit-password,然后重启 sshd。改默认 22 端口、限制只允许特定用户登录,都可以作为补充手段,但都不能替代密钥登录。

做完这几步,小服务器的 SSH 日志会一下子清净很多。剩下的少量尝试,fail2ban 会继续帮你挡在门外;你只需要偶尔看一眼 fail2ban-client status,确认它还在正常工作。这就是给小服务器加一层防护的意义:花二十分钟配置,换来以后少操很多心。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。