返回博客
3 分钟

服务器开机第一周,SSH 日志里躺了 6000 条失败登录

一台新 VPS 挂上公网会发生什么?我把第一周的 SSH 日志拉出来数了数,然后关掉了密码登录。

安全运维服务器
本文目录

新机器开好那天,我连 DNS 都还没配。域名没解析,网站上没有任何地方指向它。

顺手看了一眼 SSH 日志:

journalctl -u ssh --since "24 hours ago" | grep -c "Failed password"

四位数。

一周之后再数,六千多条。平均每小时三十几次,从第一天就开始了。

(Debian 和 Ubuntu 上这个服务叫 ssh;CentOS、RHEL 系要换成 -u sshd。)

日志里到底是什么

随手抓几条,IP 打码:

Failed password for root from 45.148.x.x port 51234 ssh2
Invalid user admin from 103.97.x.x port 44122 ssh2
Invalid user oracle from 45.148.x.x port 51980 ssh2
Invalid user ubuntu from 198.98.x.x port 38012 ssh2
Failed password for invalid user postgres from 141.98.x.x port 55410 ssh2

有意思的不是数量,是用户名:root、admin、ubuntu、oracle、postgres、test、pi。

全是设备和软件的默认账号。没有一个是我的用户名。也就是说,对面既不知道我是谁,也不关心——他们在跑一份名单,把常见的默认账号挨个试过去。

这就是互联网的背景噪音。你不是被盯上了,你只是有一个公网 IP。

那风险到底在哪

想明白这件事之后,我怕的东西变了。

不是「有人在攻击我」,而是「如果我的 SSH 还开着密码登录,而密码是 Admin123! 这种,会怎样」。

自动化脚本一天能试几万次,覆盖几千个常见的密码组合。它不需要聪明,只需要我没关门。

我关掉的那几道门

具体命令站里的运维安全那篇写得很细,我不重复。这里只说为什么是这几件,以及顺序为什么是这样:

  1. 换成密钥登录,然后关掉密码登录。 这是唯一真正解决问题的一步。密钥没法被「猜」,暴力破解这条路直接断掉。顺序别搞反:先确认密钥能登进去,再关密码,否则你会把自己锁在门外。
  2. 禁止 root 直接登录。 root 是每台 Linux 机器都有的用户名,等于攻击者已经知道一半。禁掉它,登录名这一半重新变成未知。
  3. 防火墙只放行必要的端口。 ufw 放行 SSH、80、443,其余全关。少一个监听端口,就少一类可能性。
  4. fail2ban。 它读日志、封 IP。装完之后日志确实干净了不少。

关于第 4 条我想说句实话:fail2ban 让日志好看了,但没让机器更安全。

被它封掉的那些 IP,本来也登不进来——密码登录已经关了。它真正的作用是让你看日志时心情好一点,顺便挡住「几万个连接把 SSH 连接数占满」这种骚扰。

四件事做完,机器是安全的。但每小时还是有三十几条失败记录在刷。

真正让日志安静下来的做法

后来我做了第五件事:把 22 端口从公网上撤掉。

用 Cloudflare Tunnel,服务器主动向 Cloudflare 建一条隧道,SSH 流量从隧道里进来。这样一来,那台机器在公网上根本没有开放的 SSH 端口——扫描器扫不到东西,自然也就没有日志可写。

怎么配在接入 Cloudflare那篇里。它比配 fail2ban 麻烦一点,但对一台个人服务器来说,这是一次配好、长期省心的事。

现在再数:

journalctl -u ssh --since "7 days ago" | grep -c "Failed password"
0

两个我踩过的误区

改端口没用。 我一度把 22 改成 2222,以为能躲开扫描。结果只是日志少了一部分——因为不少脚本确实只扫 22。但真正全端口扫的那些,一两分钟就找到了新端口。它降低的是噪音,不是风险。别把它写进你的安全清单。

「我这台机器没什么值钱的」不是理由。 攻击者要的往往不是你的数据,是你的带宽和 CPU。一台被拿去发垃圾邮件或者挖矿的机器,账单和信誉都算在你头上。

三分钟自检

如果你手上有一台公网 VPS,现在 SSH 上去跑这三条:

# 密码登录还开着吗?期望输出 no
sudo sshd -T | grep -i passwordauthentication

# root 能直接登录吗?期望输出 no
sudo sshd -T | grep -i permitrootlogin

# 最近一周被试探了多少次
sudo journalctl -u ssh --since "7 days ago" | grep -c "Failed password"

第一条如果回的是 yes,今天就把它关掉。

站里那份上线自查清单里有一条「确认禁用密码登录」,说的就是这件事。上线前过一遍,比事后翻日志轻松得多。

相关文章