▎ 前言:为什么要折腾这个?
我们先做一个测试:
在你的Linux控制台执行:grep "Failed password" /var/log/auth.log
你应该能看到一大片的 Failed password的错误
不同发行版可能命令不一样,这里通过
Debian12做演示,这条命令可能刷屏,谨慎执行。

问题描述:刚买的 VPS 日志里全是
Failed password?这是全网脚本在扫描默认 22 端口。因为你的服务器默认是有公网IP的,在公网的环境下无时无刻不能其他人访问或者恶意攻击,所以你的SSH端口无时无刻都有人尝试去登入扫描。
风险提示:如果你的SSH是弱密码请尽快更改,或者往下看跟着教程走。不然被不明人员攻破你的服务器,,服务器变“肉鸡”(挖矿、DDoS),商家删机/关机都是小事,如果做非法业务受牵连就得不偿失了。
▎ 前期准备工作
环境:一台刚开通的 VPS(Debian/Ubuntu/CentOS),我这里演示的操作系统以
Debian12,虽然Debian13也出来了,但是还是习惯使用Debian12,作为我的主力使用的操作系统。链接SSH的工具:SSH 客户端(Xshell, XTerminal, FinalShell),三选其一就可以,我这里放上了XTerminal的下载链接。
注意!:在所有设置确认成功前,绝对不要关闭当前的 SSH 连接窗口!,否则使用商家的VNC链接或者只能重装系统了。
▎ 第一步 更新软件源和同步时间
为什么需要更新软件源呢?只是为了下载最新的软件,不然软件是旧版本可能存在一直漏洞,这样就有一点本末倒置了,所以第一步先更新软件源和系统软件,升级到最新版本。
Debian/Ubuntu:
apt update && apt upgrade -y
有的时候会无法安装软件,也可以先更新软件源。
同步服务器时间(因为是国内时间,我习惯同步到上海时间,这一步不是必须的)
校准时间:将服务器时间设置为上海时间,方便后续看日志排查问题。
命令:
timedatectl set-timezone Asia/Shanghai
▎ 第二步:创建普通管理员账号(避免 Root 裸奔,这里是强烈建议的,如果觉得麻烦可以不做)
Root用户权限最高,也是最方便的,所以很多人喜欢直接使用Root用户执行命令和运行程序。但是风险也是最高的,如果弱密码被破解或者秘钥被泄露,导致的结果也是最原则的,因为人家已经拥有了Root权限(进你的服务器如无人之境)。
新建用户:
adduser myadmin(名字自定义)。赋予权限:
usermod -aG sudo myadmin。
验证:退出 Root,用新用户登录并测试
sudo apt update,确保权限生效。
sudo命令就是把普通用户的权限提权成root权限执行,在平时权限不够的时候可以使用。
▎ 第三步:配置 SSH 密钥登录(给大门换把锁)
生成密钥对:
推荐算法:使用 Ed25519 算法(比 RSA 更安全高效)。
命令:
ssh-keygen -t ed25519 -C "your_email"。
上传公钥到服务器:
方法A(推荐):使用
ssh-copy-id myadmin@ip_address自动部署。方法B(手动):
mkdir -p ~/.ssh && echo "公钥内容" >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys。
测试连接:新开窗口,使用私钥登录成功后再继续。
这里聊个题外话,在秘钥安全这方面,默认使用秘钥,禁止Root账户使用密码登入的商家还是比较少的,无接触最多的也就是DMIT,它家默认创建的服务器是使用秘钥登入的。
参考教程:DMIT 新机无法连接?手把手教你配置 SSH 密钥登录 (图文版)
▎ 第四步:修改 SSH 端口与防火墙设置
修改配置文件,开放其他端口:
nano /etc/ssh/sshd_config策略:保留
Port 22,新增一行Port 10086(双端口并行,防止配置错误失联)。很多厂商其实在重装系统的时候,就可以指定其他端口作为SSH连接端口,这样可以防止很多默认扫描行为,因为SSH在22端口是默认的,导致很多恶意扫描只针对SSH,如果其他高位端口,它还需要扫描你服务器的所有端口才能确定。

配置防火墙(UFW/Firewalld):
重点:必须先放行新端口,再启用防火墙!,这一点至关重要,如果没搞定就退出SSH,容易整个服务器都失联,那就有意思了。
Debian/Ubuntu (UFW):
ufw allow 10086/tcp # 放行新SSH端口 ufw allow 80/tcp # 预留Web端口 ufw allow 443/tcp ufw enable # 启用防火墙
验证:尝试通过新端口 10086 连接。成功后,回到配置文件删除
Port 22并重启 SSH 服务。
80和443是网站搭建必备的端口,如果你是有其他的端口需要使用,修改上面的命令后面的端口号就好了,这一步是为了安全不暴露端口,如果懒得弄也可以不做,不是必须的。
▎ 第五步:禁止密码与 Root 登录 完成漏洞封堵
修改配置:
nano /etc/ssh/sshd_configPermitRootLogin no:彻底禁止 Root 登录(因为我们已经有了 sudo 用户)所以不必要担心。PasswordAuthentication no:彻底关闭密码验证,这样只能通过秘钥登入了。
重启服务:
systemctl restart sshd完成新配置的加载。
完成这一步之后只能通过秘钥登入,root账户无法使用普通密码登入,密码登入方式作废。如果秘钥要使用穷举法暴力破解,那基本上是痴心妄想了。你只要不主动泄露基本上密码无忧。

▎ 第五步:安装 Fail2Ban 这里是加强工具(非必要)
痛点:即使改了端口,可能还有人扫;Fail2Ban 可以自动拉黑多次试错的 IP,就跟一开始一样很烦,日志里面都是尝试登入的日志,有时候会你的日志会变得很大,很大原因就是因为尝试SSH登入惹得锅。
安装:
apt install fail2ban -y。配置:复制配置文件
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local,设置bantime(封禁时间) 和maxretry(最大尝试次数)。
fail2ban的配置文件位于/etc/fail2ban目录中。主要的配置文件是jail.conf,你可以在这个文件中定义全局设置,或者为不同的服务创建特定的规则。
配置文件介绍::
bantime:在检测到攻击后,攻击者被禁止的秒数。
unbantime:定期检查和解除禁止的时间,以秒为单位。
maxretry:在执行ban之前允许的最大失败尝试次数。
findtime:在maxretry次数内允许的时间窗口,以秒为单位。
▎ 最后救援大法
如果真的在执行过程中出现意外,或者防火墙忘了开放端口,或者秘钥丢失找不到了,也不要着急下面提供一个解决思路。
VNC 直连大法:
场景:防火墙没开就重启了?密钥丢了?
操作:登录 VPS 商家后台(基本上所有的商家都有),打开 VNC 控制台。VNC 相当于直连显示器,不受 SSH 限制,可直接登录修改配置,配置好新的秘钥或者开启SSH密码登入更换新的密码,在重新开始。
实在没救了,那就只能挂壁了,如果是新的服务器也就无所谓去商家后台重装系统就好了。
▎ 总结
总结下来就这几个步骤,基本上能让你的VPS高枕无忧,不用担心恶意的扫描和暴力破解。防火墙也能有效的防护端口,把不必要暴露外部的应用端口给好好保护起来。比如MYSQL的3306、Redis的6379很多人都是使用的纯数字简单密码或者根本就没密码,这也是十分危险的行为。
系统已更新且时间已校准
新建 Sudo 用户,且 Root 远程登录已禁用
SSH 密钥登录测试通过,密码登录已关闭
SSH 端口已修改,且防火墙 (UFW) 已正确放行
Fail2Ban 已开启监控
