起因很普通:我想知道那台小服务器的磁盘为什么越来越紧。
顺手翻了一眼系统日志,然后看到了一份让我沉默的账单 —— 7 天里,SSH 服务留下了 9 万多行日志,其中 4.5 万行是扫描和撞库的痕迹。
不是有人跟我有仇。是全网撒网,我只是被网住的那一个。
一、账单长什么样
| 指标 | 数值(近 7 天) |
|---|---|
| SSH 日志总量 | 91,237 行 |
| 其中爆破 / 扫描行 | 45,645 行(约 50%) |
| 攻击来源 IP(去重) | 538 个 |
| 累计失败记录(历史) | 67,663 条 |
单独针对 root 的失败 |
20,208 次 |
| 仅”今天”一天的失败 | 3,594 次 |
一台只有 2 核 2G、跑了两个博客和几个自用小工具的机器,什么都没做错,每天要挨大约 6,500 次敲门。
最刺眼的不是数字,是被猜的用户名清单:
| 被猜的用户名 | 次数 |
|---|---|
ubuntu |
387 |
admin |
27 |
test |
14 |
user |
12 |
deploy |
11 |
ftpuser |
10 |
ec2-user |
8 |
git |
7 |
ubuntu、ec2-user、ftpuser —— 这些名字跟我的服务器一点关系都没有。它们只是云主机最常见的默认账号名。
这就是第一条关键结论:没有人针对你。 你只是被无差别扫到了而已。
二、它是一条流水线,而且”有人上班”
把失败记录按小时排出来,会看到一个很有意思的形状:
| 时间(小时) | 失败次数 |
|---|---|
| 00 ~ 03 | 6 ~ 15 |
| 04 | 117 |
| 05 | 227 |
| 06 | 680 |
| 07 | 859 |
| 08 | 474 |
| 09 | 476 |
| 10 | 481 |
| 11 | 181 |
| 12 ~ 20 | 4 ~ 12 |
凌晨四点开始爬坡,早上七点达到峰值(一小时 859 次),中午前后断崖式回落,整个下午和晚上安静得像另一个世界。
这不是人的作息,也不完全是机器的作息 —— 这是别人排班表上的工时。某个”团队”在它的白天把我的 IP 段排在队列里,跑完就换下一批。
flowchart LR
A["全网 IP 段扫描器"] -->|"探测 22 端口"| B["你的服务器"]
B -->|"回了一个 SSH 握手"| C["进入目标清单"]
C --> D["通用字典逐个撞库"]
D -->|"失败(99.9%)"| E["换个 IP,继续下一个"]
D -->|"口令弱,撞开了"| F["服务器易主"]
来源 IP 集中在少数几家云服务商和 IDC 的网段里 —— 也就是说,这些机器自己多半也是被控制的受害者。整条链条上,从肉鸡到发起者,没有一个人见过我的服务器。
三、先别慌:怎么判断”有没有真的被攻破”
这是整件事里我觉得最值得写下来的一段。
45,645 行失败记录看着吓人,但失败日志再多都没有意义。真正需要回答的只有一个问题:有没有成功的外来登录?
我用四条证据交叉验证了一遍:
1. 成功登录记录里,认证方式全都是公钥;"用密码登录成功"的次数 = 0
2. 成功登录的来源 IP 只有两个 —— 都是我自己家的宽带出口
3. 服务器的公钥授权清单里,没有任何一个陌生公钥
4. 没有异常进程、没有莫名计划任务;其他可以登录的账号口令都是锁定状态
四条全部指向同一个结论:没有被攻破。
自建服务的人请把这条排查顺序抄下来:
第一步看”成功登录”(谁进来的、用什么方式进来的、从哪进来的),
第二步看公钥授权清单(有没有多出一条不属于你的),
第三步再看失败日志的规模。
顺序反过来,你会被 4.5 万行失败记录吓到;顺序弄对了,你会知道该不该着急。
四、为什么一定是 22 端口
因为公网就是一条街,开放端口就是门牌号。
扫描全网 IPv4 的 22 端口,对今天的算力来说是很廉价的事。一旦你回应了 SSH 握手,就等于在门口挂了一块牌子:这里有一扇 SSH 门,可以来试试。
而历史上失败的组合只有一个:允许 root 用密码登录 + 端口开在公网。
密码是唯一可能”被猜中”的东西。7 天 2 万次撞 root 的密码,只要你的口令是弱口令、或者跟别处复用过的口令,被撞开就只是时间问题 —— 攻击者不需要聪明,只需要一直在。
五、我做的三件事
按性价比排序,第一条就解决了 90% 的问题。
| 措施 | 耗时 | 实际效果 |
|---|---|---|
| ① 关掉密码登录 | 2 分钟 | 爆破彻底失效:门锁从”猜口令”变成”必须持有我的私钥” |
| ② 装 fail2ban 自动封禁 | 10 分钟 | 5 次失败封 1 小时,挡住高频段,日志量进一步下降 |
| ③ 后台 / 面板别对公网开 | 5 分钟 | 关掉另一个入口(各类服务器的面板默认端口,是第二个最常被撞的地方) |
第一条的具体做法,本质上只是把 SSH 配置里的两个开关改掉:
PasswordAuthentication no # 不再接受任何密码认证
PermitRootLogin prohibit-password # root 也只能用公钥进
改完之后的即时验证很干净 —— 一个纯密码的尝试会被服务器直接回绝:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
括号里那个列表,就是服务器现在愿意接受的认证方式。它里面已经没有 password 了。
有意思的副作用是:日志立刻安静下来。因为攻击者连”撞密码”这一步都走不到,日志里不再出现大片的密码失败记录,只剩”连接被关闭”这种毫无杀伤力的行。
至于 fail2ban,顺手记两个我自己踩过的坑,省得你重复:
- 它写入的是
iptables,但链名不是你以为的那个(我第一次去查,找不到规则,以为没生效,白排查了一轮); - 默认的封禁动作可能指向
firewalld—— 如果你的机器没跑 firewalld,必须显式指定用 iptables,否则规则根本落不下去。
六、丛林法则
处理完这件事,我最大的感受不是”技术不够”,而是结构性的。
我们平时对”上网”的想象是:我有个房子,我关好门窗,世界是文明的,会讲道理。
真实的情况是:公网是一片没有路灯的丛林。 没有警察会巡逻到你的网段,没有邻居会替你报警,而丛林里永远有机器人在挨家挨户推门 —— 它们不看门牌上写的是”个人博客”还是”银行”,只看哪扇门回了一句”我在”。
所谓”朗朗乾坤”,是文明社会给我们的一种错觉。它靠制度、执法和大量看不见的成本在维持。而网络协议层没有这层东西 —— 你的 22 端口开在公网上,本质上和把一台没锁的机器放在公共走廊里没有区别。
所以在丛林里,安全的目标不是”打赢”,而是让自己不值得被打:
- 把门锁换成”没有钥匙就绝对进不来”(公钥认证),而不是”我的口令很难猜”;
- 把不必要的门窗堵上(只监听本机、面板别对外);
- 承认没有一劳永逸 —— 扫描是持续的,防护也必须是持续的;
- 最后,别只盯着吓人的失败数字,要学会找”成功”的痕迹。
七、如果你也在自建东西
一份可以照着做的清单:
- 现在就去翻一次成功的登录记录,确认来源和认证方式全是自己的
- 检查公钥授权清单,删掉不认识的那几条
- 关掉 SSH 的密码认证(前提是你已经能用公钥登录,且改之前先备份配置)
- 装一个自动封禁工具,并设好自己 IP 的白名单
- 检查一遍所有对公网开放的端口,问自己”这个真的需要吗”
- 给系统日志设个上限,别让它悄悄吃掉你的磁盘
- 改配置的当天做一次新连接验证,别在唯一一条会话里改完就关窗口
第 3 条和第 7 条都关乎同一件事:你不会想在自己改配置的过程中,把自己也关在门外。
丛林里没有人来救你,所以每一步都得留一条回来的路。
本文章永久链接: 网络丛林法则:我的博客服务器 7 天被爆破 4.5 万次

