文章

实战总结:三步教你在 Ubuntu 上防御 SSH 暴力破解

实战总结:三步教你在 Ubuntu 上防御 SSH 暴力破解

前言:直面真实的互联网

最近刚折腾了一台新的海外 VPS。众所周知,只要你的服务器暴露在公网 IP 下,且开放了 22 端口(SSH 默认端口),它从上线的那一秒起,就每分每秒都在被全世界的自动化脚本扫描和尝试爆破。

黑客并不认识你,他们只是用僵尸网络无差别地尝试弱口令字典。今天,我就把这次从“发现被爆破”到“彻底加固防线”的真实实战经验总结下来,希望能帮到同样拥有小破服务器的你。

第一步:查看你的服务器是否正在被爆破

防御的第一步是“看见”。SSH 的登录尝试记录在系统的认证日志中。根据系统不同,路径通常为:

  • Debian/Ubuntu:/var/log/auth.log
  • CentOS/RHEL:/var/log/secure

你可以通过以下命令快速统计当前有多少 IP 正在疯狂尝试密码:

1
2
# Ubuntu 系统
sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr

如果输出了一大堆 IP 和对应的尝试次数,恭喜你,你的服务器正在被“重点关照”。

第二步:部署自动防线神器 —— Fail2ban

既然攻击是自动化的,我们的防御也必须自动化。fail2ban 是 Linux 下最经典的防御工具,它的原理很简单:监控日志,如果发现同一个 IP 多次密码错误,就直接调用防火墙把它拉黑。

1. 安装与“小插曲”

在 Ubuntu 上,直接运行安装命令:

1
sudo apt update && sudo apt install fail2ban

⚠️ 踩坑预警: 在安装时,我遇到了一个报错:Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1435 (apt)。

这通常是因为你之前有一个 apt 进程没结束,或者系统的自动更新任务正在后台运行。

  • 排查方法:运行 ps -p 1435 -f(替换为报错的进程号)看看它到底在干嘛。
  • 解决办法:如果确认是卡死的旧任务,可以用 sudo kill -9 1435 强杀,然后执行 sudo dpkg --configure -a 修复包状态,即可顺利安装。

2. 黄金配置法则

安装好之后,千万不要直接修改自带的 jail.conf,因为系统更新时会覆盖它。正确的做法是新建一个专属配置文件:

1
sudo nano /etc/fail2ban/jail.local

将以下配置粘贴进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[DEFAULT]
# 封禁时长(单位:秒)。-1 代表永久封禁(极度推荐,让黑名单越来越干净)
bantime  = -1

# 检测的时间窗口(单位:秒)。过去 10 分钟内
findtime  = 600

# 允许失败的次数。10 分钟内失败 3 次就开始封禁
maxretry = 3

# 白名单:千万别把自己关在门外!
# /8 和 ::1 分别代表 IPv4 和 IPv6 的本机回环地址,必须保留
# 如果你有固定公网 IP(比如办公室或家里),请加在后面,用空格隔开
ignoreip = 127.0.0.1/8 ::1 203.0.113.50

[sshd]
enabled  = true
port     = ssh
filter   = sshd
backend  = systemd

保存退出(Ctrl+O -> Enter -> Ctrl+X),然后启动并设置开机自启:

1
2
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban

第三步:见证奇迹与性能焦虑解答

配置好之后,运行监控命令:

1
sudo fail2ban-client status sshd

你会震撼地发现,短短十分钟内,可能就有几十次失败记录,并且几个恶意 IP 已经被自动拉黑了。

常见疑问:这种级别的爆破,会拖垮我的小 VPS 吗?

答案是:完全不会。

SSH 尝试请求产生的网络流量微乎其微。对于现代硬件来说,处理这种低频并发占用的 CPU 和内存几乎为零。只要我们通过 fail2ban 设置了永久封禁(bantime = -1),那些恶意 IP 尝试三次后就会被防火墙直接丢弃数据包,不再消耗系统资源去验证密码。随着时间的推移,你的服务器反而会越来越“安静”。

当然,这一切的大前提是:你的 root 密码必须足够变态!(建议使用各大云厂商控制台提供的随机密码生成功能,长度 16 位以上,包含大小写+数字+符号)。

总结

通过这次实战,我们用非常低的成本(安装一个软件 + 几行配置),建立起了一套自动化的 SSH 防御机制。

如果未来你想追求绝对的极致安全,可以进一步去配置 SSH 密钥登录并彻底禁用密码认证。但在拥有复杂强密码 + Fail2ban 永久封禁的双重保障下,目前的防线已经足够让我们这些个人开发者高枕无忧了。

安全无小事,祝大家的服务器都能平稳运行!

本文由作者按照 CC BY 4.0 进行授权