速读#
VPS 一接公网就会被扫,SSH 加固的主防御是密钥登录、禁密码、禁 root 密码登录。改端口有价值,但它是降噪,不是主防御;私钥永远留本地,改配置时也必须保留当前会话当退路。
接上公网几分钟就有人在试密码#
不是吓唬,看一眼 /var/log/auth.log 就明白。密码在公网上等于没穿衣服:依赖「别人猜不到」,而别人有 7×24 的脚本在猜。
密钥:不靠猜不到,靠解不开#
密码靠保守秘密:强度够不够、有没有在别处泄露过、会不会图省事复用,每一环都系在人身上。密钥靠数学:私钥不出门,公钥被拿走也推不出私钥,登录验证靠签名完成——网络上传输的东西里没有可以截下来重放的秘密。持续扫描磨得穿人性的弱点,磨不动数学。
ssh-keygen -t ed25519 -C "s1oopx@laptop" # 本地生成密钥对ssh-copy-id root@你的服务器IP # 把公钥装到服务器私钥永远留本地;公钥才放服务器。 能放出去的是锁,不能放出去的是钥匙。和 Tunnel token 进 .env、CI 密钥走 secrets 同一条线:凡是「拿到就等于我」的东西,只在我手里存在。
为什么 ed25519 不是 RSA#
| RSA | ed25519 | |
|---|---|---|
| 同等强度 | 密钥更长、更慢 | 更短、更快 |
| 我的选择 | 能用 | 新场景默认它 |
同等安全强度下,ed25519 的密钥短到一行放得下,签名和验证都更快,也没有 RSA 那种「长度选 2048 还是 4096」的参数纠结——默认参数就是最佳实践,想选错都难。
不是 RSA 错了,是 ed25519 在新场景下更对路。老系统兼容才是 RSA 还留着的理由——我没有这个包袱,就没必要背。
改端口:降噪,不是主防御#
Port 22222有人说「安全的错觉,扫端口照样扫得到」。我的判断:它防的不是定向攻击,是自动化批量扫描。 绝大多数脚本只扫 22,改了就把这部分噪音滤掉。
| 措施 | 性质 |
|---|---|
| 密钥登录 | 主防御 |
| 禁密码 / 禁 root 密码登录 | 主防御 |
| 改默认端口 | 降噪,非主防御 |
| 防火墙只放行需要的端口 | 主防御 |
把「降噪」和「防御」分开记,就不会对改端口抱不切实际的期待,也不会因为它挡不住定向攻击就否定降噪价值。
降噪的实际收益是日志质量:22 端口一天几千条失败尝试,翻日志全是垃圾;改了端口之后,auth.log 里再出现的失败尝试才值得看一眼。
改了端口,每次 ssh -p 22222 也烦。写进本地 ~/.ssh/config,以后一个 ssh vps 搞定:
Host vps HostName 你的服务器IP Port 22222 User s1oopx IdentityFile ~/.ssh/id_ed25519退路纪律:别关当前会话#
以上改动都落在 /etc/ssh/sshd_config:
PermitRootLogin prohibit-passwordPasswordAuthentication noPort 22222sshd -t # 先验配置语法,有错这里就拦住systemctl restart ssh改 SSH 配置时,务必保留当前已登录会话,再开新窗口测能否登录。 万一密钥没生效就关了密码,还有退路改回来。sshd -t 是同一条纪律的前半段:语法错误在重启前暴露,而不是重启后把自己锁外面才发现。就算两头都断了,VPS 控制台的 VNC 还在——买机器时看重控制台能力,真到这一步它就是最后那道退路。
半破坏性操作:先验证 → 留退路 → 新窗测试 → 确认通了再关旧会话。和防火墙启用前先放行 SSH 端口同源。
和 Tunnel 一正一反#
Cloudflare Tunnel 能把 Web 入站归零,这篇守的是剩下那道 SSH 缝。Web 与管理通道分开管——SSH 我没塞进 Tunnel,混在一起之后哪层出问题都难排:Web 挂了怀疑隧道,隧道挂了连管理入口一起丢。管理通道要的是依赖尽量少、故障模式尽量简单。
做完这些再看 journalctl -u ssh 里被拒的密码尝试,会觉得庆幸——扫描是 7×24 不停的。
