很多站长刚启动新的VPS或虚拟机实例,几分钟内就会发现SSH日志中充满了来自世界各地的爆破尝试。虽然修改默认端口(22)能减少一部分骚扰,但这只是“安全靠模糊”(Security by Obscurity)。想要一劳永逸地解决SSH爆破,我们必须从根本上切断爆破者的路径:禁用密码登录,并强制使用高强度的密钥登录。
此外,我们还需要一个主动防御工具:fail2ban,它能自动分析日志并封禁恶意IP,作为防止其他服务(如Web服务或邮件服务)被攻击的第二道防线。
步骤一:创建和配置SSH密钥对(一劳永逸的根本之道)
SSH密钥登录比任何复杂密码都要安全得多,因为爆破者无法猜解密钥。
1.1 在本地机器生成密钥对
如果你还没有SSH密钥对,请在你的本地电脑(不是VPS)上执行以下命令。我们推荐使用强大的RSA 4096位加密。
# -t 指定类型,-b 指定位数
ssh-keygen -t rsa -b 4096
系统会提示你保存位置(默认在 ~/.ssh/id_rsa)和设置一个密钥密码(强烈建议设置,用于保护私钥,即使私钥泄露,没有密码也无法使用)。生成后,你会得到两个文件:id_rsa(私钥)和 id_rsa.pub(公钥)。
1.2 上传公钥到VPS
使用 ssh-copy-id 命令将公钥高效地上传到你的VPS。
# 替换 user 为你的用户名,your_vps_ip 为你的VPS IP地址
ssh-copy-id user@your_vps_ip
如果 ssh-copy-id 命令不可用,你也可以手动复制 id_rsa.pub 文件的内容,并将其粘贴到VPS上的 ~/.ssh/authorized_keys 文件的末尾。
1.3 验证密钥登录
先不要退出当前的密码登录会话。打开一个新的终端窗口,尝试使用密钥登录,确保你可以不输入密码(或只输入密钥密码)成功连接。
ssh user@your_vps_ip
步骤二:禁用密码认证(彻底堵死爆破通道)
这是最关键的一步。一旦密钥登录验证成功,我们就可以彻底禁用密码登录了。
2.1 修改SSH配置文件
使用你喜欢的编辑器(如nano或vim)修改SSH服务器配置文件:
# 适用于大多数Linux系统,如Ubuntu/CentOS
sudo nano /etc/ssh/sshd_config
找到并修改或添加以下几行配置,确保值设置为 no:
# 确保这一行是 yes,表示启用公钥认证
PubkeyAuthentication yes
# 关键!禁用密码登录
PasswordAuthentication no
# 推荐:禁用挑战-响应认证(防止其他密码尝试机制)
ChallengeResponseAuthentication no
# 推荐:如果你不需要root用户直接SSH,可以禁用
PermitRootLogin no
2.2 重启SSH服务
保存文件后,重启SSH服务使配置生效。
sudo systemctl restart sshd
# 或者对于某些老系统使用:
sudo service sshd restart
重要提醒: 在你确认新终端窗口可以使用密钥成功登录之前,千万不要关闭当前会话。一旦配置错误且退出,你将无法再次进入VPS!
步骤三:部署fail2ban进行实时防御(第二道防线)
虽然我们已经禁用了密码登录,但爆破者仍然会浪费资源尝试连接(日志仍会被填满)。使用 fail2ban 可以自动封禁这些恶意的源IP,减少日志噪音并节省VPS资源。
3.1 安装fail2ban
# Debian/Ubuntu
sudo apt update && sudo apt install fail2ban -y
# CentOS/RHEL
sudo yum install epel-release -y
sudo yum install fail2ban -y
3.2 配置fail2ban
最好的做法是复制默认的配置文件并进行修改,防止未来更新覆盖:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 jail.local 文件,找到 [DEFAULT] 部分,配置封禁时长(bantime)和忽略IP(ignoreip,可以将你的固定IP加入白名单)。
[DEFAULT]
# 忽略的IP地址列表(例如:127.0.0.1/8 你的固定IP)
ignoreip = 127.0.0.1/8 192.168.1.0/24
# 封禁时间 (秒)。设置为永久封禁 (unban only manually):
# bantime = -1
# 或设置较长的时间,例如 1 周 (604800 秒)
bantime = 604800
# 尝试次数。在被封禁前,允许失败的次数
maxretry = 5
# 查找期。计算尝试次数的窗口时间 (10分钟)
findtime = 10m
# 确保 SSH Jail 是启用的 (在 [sshd] 部分)
[sshd]
enabled = true
3.3 启动和检查服务
启动并设置开机自启动:
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
你可以随时检查 sshd 监狱状态:
sudo fail2ban-client status sshd
通过上述步骤,你的VPS SSH入口将变得极其安全:无法使用密码爆破,且任何尝试性的恶意连接都会被 fail2ban 自动封禁,实现了真正的“一劳永逸”加固。
汤不热吧