序言:这篇实测文章很直观地展示了一个事实 —— 只要 SSH 暴露在公网,扫描和尝试登录几乎会立刻开始,而且规模远超多数人的直觉。
原文:I Left Port 22 Open on the Internet for 54 Days. Here’s Who Showed Up.(作者:Arman Hossain,发布日期:2026-04-24)
转载自: CoCo的小黑屋
实验设置
这里有个思想实验:如果你只是把一台机器放到互联网上,然后等待,会发生什么?
当然不是真机,而是一台假的机器。它是一个蜜罐:用 Python 脚本伪装成 Ubuntu 22.04 + OpenSSH 8.9 服务器。它看起来很真,体验也很真。你输什么密码它都“接受”,并带一个可信的延迟,然后把你丢进一个带真实目录结构的 shell,最后把你做的每件事都记进 JSON 日志。
转折在于:没有任何东西是真的。文件是假的,命令是模拟的。你刚才跑的 wget?它会假装下载 8 秒,还给你进度条。apt install?它会告诉你包已经装好了。与此同时,你的每一次击键、每一组凭据、每一条命令,都会被静悄悄写入日志。
我在 2026 年 2 月 11 日把它部署进一个 Docker 容器,对外暴露 22 端口,然后转身离开。
54 天后回来,我得到了 317 MB 日志。
前 60 秒
蜜罐上线还不到 1 分钟,第一批访客就来了。
1 | 2026-02-11T20:41:15Z connection 103.215.xx.xx |
两个 IP,两次登录尝试,两组密码。有人在某个地方真心觉得它们可能在一台随机服务器上有效。两次尝试间隔不到 2 秒。
这并不是有人专门扫描我的机器,而是互联网背景辐射:自动化系统在全球范围内持续扫描每个 IP 的每个端口,全天候、无休止。如果你的机器曾经开过 22 端口,这些事一直都在发生。
数据规模
先看原始体量:

平均下来约 每天 4,987 次连接,也就是 每分钟 3.5 次,全天不停。凌晨 3 点不会停,周末不会停,节假日也不会停。机器不睡觉。

密码耻辱墙
在 255,566 次登录尝试、48,102 个唯一密码中,下面这些是“金曲榜”:

那些老熟人依旧是老熟人,令人沮丧。仅 123456 就占了全部尝试的 10% 以上。
但 3245gs5662d34 和 345gs5662d34 为什么能排在第 3 和第 4?它们不是词典词,而是某些 IoT 设备或固件里的硬编码默认凭据。某个僵尸网络把它们写死在攻击逻辑里,向全网喷射,希望撞中对应设备。两者合计尝试超过 11,000 次。
还有加密货币线索:solana(1155 次)、sol(927 次)、validator(708 次)、node(598 次)。攻击者在主动搜寻 Solana 验证节点。他们尝试 solana、sol、solv、validator、node 这些用户名,并配对类似密码。很明显,有人认定加密节点运维是高价值目标,并且已经构建了专门的僵尸网络去找它们。
登录成功后他们会做什么
这里开始有意思了。机器人“一旦”登录成功(别忘了:所有密码都会成功),下一步做什么?
绝大多数,也就是 99.6% 的攻击者,从不打开交互式 shell。它们用 SSH 的 exec 模式打一条命令就断开:
1 | Command Count |
模式非常清楚:先指纹识别,再离开。先跑 uname 看系统类型。输出像目标就稍后回投真实载荷。echo “\x6F\x6B”(十六进制的解码就是 “ok”)是最简单的存活探测,3.2 万多个 IP 只想确认 shell 还活着。
chattr -ia .ssh 这条尤其典型:它试图去掉 .ssh 目录的不可变属性,常见用途是往 authorized_keys 注入公钥,建立持久化访问。
流量模式
按天的连接量能看出一条曲线:

前两周随着更多僵尸网络发现这个 IP,流量稳步上升。3 月 2 日附近冲到峰值,单日接近 23,000 次连接,约 每分钟 16 次。3 月中旬之后明显回落。
为什么回落?很可能是僵尸网络已经给这个 IP 打完标签:这个主机会响应 SSH、接受密码、内核 Linux 5.15。它们拿到想要的信息后,持续高频重扫阶段结束,只剩长尾和新入场僵尸网络。
他们在什么时间攻击?

攻击在 01:00-04:00 UTC 达峰,在 07:00-09:00 UTC 降到低谷。这不是机器人会疲劳,更可能是亚洲地区 C2 在其工作时段最活跃,叠加欧洲 C2 在 UTC 夜间窗口的负载。

周一和周日最忙。僵尸网络也有“作息”。
攻击源来自哪里?

攻击来自 所有有人类居住的大洲。美国居首(244291 次事件,1861 个 IP),其后是澳大利亚(188922)、比利时(156599)、德国(112774)、荷兰(107535)。
但这些数字容易误读。“澳大利亚”不代表澳大利亚人正在攻击,而是悉尼云数据中心很受僵尸网络操作者青睐。澳洲 IP 基本都能追到廉价 VPS 提供商。荷兰、新加坡、美国的大量流量也是同一逻辑:主要是云基础设施,不是真人终端。
比利时流量几乎全部来自一个住宅 IP:单机发了超过 156000 次登录尝试,比德国全境还多。它连续几周每秒都在锤 echo “\x6F\x6B”,毫不停歇。
这些 IP 背后是什么网络类型?

7556 个攻击 IP 里,结构几乎对半:52% 云/VPS(3940),48% 住宅/ISP(3619)。但云基础设施贡献了 59% 的登录量,输出明显更高。住宅侧更分散:成千上万台被控家用路由器和 IoT 设备,各自占比小,但合起来攻击面巨大。
头部来源非常清楚:
| Source | Type | IPs | Events | % of Total |
|---|---|---|---|---|
| US-based Cloud VPS Provider | Cloud | 1548 | 632592 | 47% |
| Belgian Residential ISP | ISP | 1 | 156013 | 12% |
| European Hosting Company | Hosting | 48 | 74525 | 6% |
| European Cloud Provider | Cloud | 108 | 33799 | 3% |
| Middle Eastern Telecom | ISP | 2 | 29009 | 2% |
| South American Research Network | ISP | 5 | 26856 | 2% |
| Mexican Telecom | ISP | 7 | 24040 | 2% |
| European Managed Hosting | Hosting | 2 | 23897 | 2% |
| Asian Cloud Provider | Cloud | 60 | 16869 | 1% |
| Chinese Tech Company | Cloud | 44 | 15652 | 1% |
单个云 VPS 提供商就占去接近一半流量:1548 个 IP 贡献 632592 次事件。前五大来源合计 69%。但长尾同样关键:前 15 名里有 3 项是单 IP,分别来自比利时住宅网络、东南亚某军方通信网络、南美某高校服务器,各自都安静地输出了数万次尝试。
悉尼、阿姆斯特丹、法兰克福在城市榜靠前,不是攻击者住在那里,而是廉价云机房在那里。
一些更意外的来源:东南亚某军方信号部队的一台机器贡献了 12310 次尝试;南美一台大学研究服务器贡献了 11116 次。两者都极可能是被攻陷后当作中继使用,资产所有者并不知情。
真正“进来操作”的人(0.4%)
7556 个攻击 IP 里,只有 28 个曾经打开交互式 shell,占 0.4%。其余全是自动化:打指纹,走人。
但这 28 个才是有意思的。他们手打命令、会输错字、会探索目录,带着明确意图。

好奇探索者(喀麦隆)
1 | 165.210.xx.xx | Yaounde, Cameroon | Residential ISP |
这个案例很有意思。对方登录后先试 neofetch(一个漂亮展示系统信息的工具),发现没装就 apt install neofetch。之后像进了别人私人电脑一样逛 Downloads、Documents,还想装 nano。neofetch 不行就改跑 screenfetch,然后 ping Google,尝试重启,最后退出。
这更像是一个刚学会“能进服务器”的人,带着真好奇在探索,而不是老手攻击者。某个时刻他还把 lscpu 打成了 lscou。机器人不会打错字。
反取证小队(荷兰、瑞典)
1 | ubuntu$ ls 2>/dev/null |
他们在做任何事情之前先关 bash 历史记录,而且反复执行,显然非常不想留下命令痕迹。
讽刺的是,这个蜜罐根本不依赖 bash history,而是在传输层记日志。每条 export HISTFILE=/dev/null 都被完整记录、打上时间戳并归档。
职业选手(法国,租用 VPS)
这里还有一个明显“会干活”的:
1 | 213.199.xx.xx | Lauterbourg, France | VPS Provider |
这完全是另一种层级。它做了这些事:
通过 /dev/tcp/ 打开原始 TCP 套接字,不用 wget、curl 这类容易暴露在进程列表中的工具。
通过 GET /linux 直接走 socket 拉取二进制。
赋可执行权限并启动,附带长 base64 载荷(很可能是 C2 配置或密钥)。
全流程包在 nohup 里,保证 SSH 断开后仍继续运行。
通过 dd 尝试写入一个 UPX 压缩的 ELF 可执行文件。
这套流程在 3 天内重复了 6 次,并轮换了 4 个 C2 服务器(213.199.xx.xx、47.243.xx.xx、47.82.xx.xx、47.236.xx.xx)。每次都会换随机临时文件名和不同编码载荷。
这不是脚本小子,而是有基础设施的职业化僵尸网络操作者。
IoT 难民(纽约)
1 | 85.239.xx.xx | New York | Cloud Hosting |
这个机器人以为自己连到的是一台路由器。enable、system、shell 是典型 Cisco IOS 从受限 CLI 逃到系统 shell 的命令。由于蜜罐返回的是空输出而不是报错,它就误判“已拿到 shell”,随后投放了 Mirai 僵尸网络的 “senpai” 变种。
它的下载链路有四层回退:wget、curl、tftp(客户端模式)、tftp(另一种语法)。下载后 chmod 777,以 ssh 参数启动(表示继续通过 SSH 传播),再自删。rootsenpai 是它的“到此一游”标记,用来标识已感染主机。
同样流程连续执行了 4 次。非常执着。
最常见的账号密码组合
最常被尝试的用户名+密码组合是什么?

对加密节点的狩猎非常明显。前 15 组合里有 5 组专门瞄准 Solana 基础设施。有人构建(或租用)了专门找弱安全验证节点的僵尸网络。
那他们最常尝试登录成谁?

root 占了超过一半尝试。但 sol 和 solana 也稳定出现在中间位置:加密节点狩猎就这样混在海量服务账号喷射里。
我学到的事
互联网很吵
- 你的服务器并不特殊。没人需要“专门盯上”你。全网每个 IP 都在被自动化系统持续探测。22 端口一暴露,几秒内就会收到登录尝试。问题不是“会不会”,而是“什么时候”——答案是“立刻”。
大多数攻击者并不聪明
- 99.6% 的访客连交互 shell 都没进,只执行一条自动命令就走。他们不是黑客,而是被控机器上的脚本,按 C2 指令在全球海量 IP 上重复跑同一条 uname。互联网攻击里的大头其实是噪声。
少数聪明的攻击者非常聪明
- 那个使用 /dev/tcp/、轮换 C2、投放 UPX 二进制的法国 IP,代表的是职业级进攻工具链。攻击者的前 1% 和后 99% 差距巨大。
加密基础设施自带“吸引力”
- 针对 Solana 节点凭据(solana/sol/validator/node)的尝试量非常高。任何在公网 SSH 上暴露、且不用密钥认证的加密节点,都会被主动狩猎。
有些人只是好奇
- 喀麦隆那位探索者、柏林那位慢慢输入命令的人、孟加拉那位会去翻 /var 并创建 text.txt 的访客,他们不像恶意操作者,更像只是想看看“门后有什么”的好奇人类。他们没下恶意程序,也没做持久化,只是到处看。
没人看 MOTD
- 蜜罐登录后会显示完整 Ubuntu 欢迎信息和系统统计。没有任何交互用户看起来在意这些信息静态得异常。第一件事永远是:ls ^^!
技术实现(实验环境)
语言:Python 3.11,使用 paramiko 处理 SSH 协议
部署:Docker 容器,对外开放 22 端口
日志:结构化 JSON Lines,一行一个事件
假 shell:支持约 40 条命令并给出拟真输出(ls、cat、ps、wget、apt、ifconfig 等)
智能延迟:破坏性/下载类命令(wget、curl、apt install)随机延迟 5-10 秒,用于消耗攻击者时间
容量:50 并发连接,5 分钟会话超时
整个系统就是一个 816 行 Python 文件。无框架、无数据库、除 paramiko 外无外部依赖。
结语
互联网上每分钟、每天,都有成千上万台机器在挨个敲门,尝试每一把钥匙。大多数都在自动驾驶:脚本由某人编写,部署在被攻陷基础设施上,再通过默认凭据和懒惰安全策略继续扩散。
你的 SSH 服务器不是孤岛,它是“每晚所有门都会被试锁一次”的街区里的一栋房子。问题不是会不会有人试你的锁,而是你的锁到底够不够好。
使用密钥认证。关闭密码登录。把 SSH 移出 22 端口。以及,如果你足够好奇,可以留一扇假门,看看谁会走进来。
预览评论
注意:请确认您的评论内容后点击"发布"按钮,您也可以删除这条评论。
评论