我的 VPS 刚装好 Ubuntu 那天晚上,我正规划博客长什么样,顺手看了一眼 /var/log/auth.log,整个人瞬间清醒了:机器上线还不到一小时,日志里已经躺了几十条失败登录记录,全是来撞 22 端口的。好家伙,我这台刚出生的小机器,被全世界惦记的勤快程度,堪比我们 HOA 查违建。

那天晚上博客没装成,我先花了半小时把门锁死。下面这份清单就是我当时一步步做下来的,每一步都有命令和原因,照着走一遍大概二十分钟。二十分钟,换以后半夜不用爬起来救火——第二天还要送孩子上学的人,伤不起。

1. 先更新系统,再干别的

sudo apt update && sudo apt upgrade -y

新装的镜像多少都带点旧软件包,旧版本等于已知漏洞。先把系统补到最新,后面的配置才站在干净的地基上。这一步零技术含量,但很多人一兴奋就跳过。当晚的我差点也跳过,还好被那几十条登录记录吓清醒了。

2. 新建日常用户,告别天天 root

adduser blog
usermod -aG sudo blog

root 权限太大,手一抖就是灾难现场。我建了个叫 blog 的普通用户,日常操作都用它,真要提权再 sudo。多敲四个字母,换来一道保险。这个习惯跟开车系安全带一样:平时觉得麻烦,出事时救命。

3. 改 SSH 端口,禁密码登录,只留密钥

这是整份清单里最重要的一步,也是我差点翻车的一步。默认的 22 端口每天被扫几万次,改掉端口能挡掉绝大部分自动化扫描。这不是什么高深防御,就是把你家从大街上挪到小巷里,小偷懒得找。

先编辑 SSH 配置:

sudo nano /etc/ssh/sshd_config

改这三行(没有就加上):

Port 2222
PasswordAuthentication no
PermitRootLogin no

Port 2222 是把端口从 22 换掉。我这里写 2222 只是举例,别真用这个,太常见了,换个自己记得住的四位数。PasswordAuthentication no 关掉密码登录,只认密钥,暴力破解直接失业。PermitRootLogin no 禁止 root 直接登录,攻击者连用户名都猜不对。

改完先检查语法,再重启:

sudo sshd -t
sudo systemctl restart sshd

重点来了:重启之前,一定先新开一个终端窗口,用新端口加密钥测试能连上,再关掉当前这个。把自己锁在门外是新手村最经典的翻车,我当时手心都出汗了。好在 DMIT 本来就只支持密钥登录,逼着我提前配好了密钥,阴差阳错躲过一劫。不然那天晚上,我就得给服务商发工单求救了——想想都头大。

改完端口,登录命令长这样:

ssh -p 2222 blog@我的VPS

4. 配 ufw 防火墙:默认全关,要谁开谁

Ubuntu 自带 ufw,不用白不用。我的原则很简单:默认全关,需要哪个开哪个。

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

deny incoming 把所有进来的连接先挡在门外,allow outgoing 保证机器自己能出去更新软件、申请证书。然后只放行三个口:SSH 的新端口、HTTP 的 80、HTTPS 的 443。博客用不到的,一律不开门。家里大门平时也是锁着的,有客人来才开,服务器同理。

看一眼状态确认:

sudo ufw status verbose

5. 装 fail2ban,自动拉黑手贱的 IP

sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban

改了端口、禁了密码之后,暴力破解基本没戏了,但扫描器还是会来敲门。fail2ban 干的事很简单粗暴:同一个 IP 短时间内失败次数超标,直接拉黑一段时间。默认配置对 SSH 就够用,装上启用就行,不用折腾配置文件,适合我这种想把时间留给生活的懒人。

6. 打开自动安全更新

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades

第二个命令会弹出个 yes/no 选项,选 yes。从此安全补丁自动安装,不用我每月想起来才 apt upgrade 一次。博客这种长期跑的服务,最怕的就是"我忘了更新"然后被已知漏洞打穿。自动更新就像家里的烟雾报警器:平时感觉不到它,关键时刻顶用。

清单回顾,照着打勾

  • 系统更新到最新
  • 新建普通用户,日常不用 root
  • SSH 换端口、禁密码、禁 root(先验证新连接能进,再重启服务!)
  • ufw 默认拒绝入站,只放行 SSH / 80 / 443
  • 装 fail2ban 自动拉黑
  • 打开自动安全更新

做完这六步,我的 VPS 才算真正"开张"。后面装 Hugo、配 Nginx,都是在这套锁好的门里面进行的。安全没有一劳永逸,但新机这二十分钟,是性价比最高的一笔投入。毕竟,被黑掉之后再救火,花的可是整个周末——而我的周末,是要剪草坪的。