远程连接服务器这件事,在没有加密的年代风险极高。用户名、密码、每一条执行的命令,全部明文跑在网络上,同一局域网里的人抓个包就能看清楚。Telnet 和 Rlogin 就是那时候的主流工具,凑合能用,但毫无保护可言。
1995年,芬兰计算机科学家 Tatu Ylönen 在自己的大学网络里遇到了一次密码嗅探攻击,随后开发出了 SSH。目标就一个:让远程连接变得真正安全。
SSH连接是怎么建立的
SSH 走的是客户端-服务器模型。客户端发起连接,双方先谈好用哪套加密算法,完成身份验证之后,建立起一条加密隧道。后续所有通信都在这条隧道里走——命令、回显、文件,一概如此。外面的人就算截到了数据包,也只是一堆乱码。
加密这块,SSH 同时用了两套机制。
握手阶段走非对称加密。服务器上存着你的公钥,你本地持有私钥。连接时服务器用公钥做验证,只有拿着对应私钥的客户端才能通过。密码全程没有在网络上出现过。
隧道建立之后切换成对称加密。双方共用一个会话密钥,每次连接单独生成,负责加解密后续所有传输内容。对称加密比非对称轻得多,这个切换在安全和性能上都说得通。
数据完整性靠哈希校验来保证。每段数据发出去的时候都带着一个哈希值,对方收到后拿来比对,不一致就说明数据在途中被动过,连接直接断掉。

密码登录 vs 密钥登录
初次用 SSH,大多数人图省事走密码登录。填用户名、填密码,直觉上没毛病。但密码的问题在于,长度和复杂度都有上限,面对自动化爆破脚本的持续轰炸,只要时间够,迟早有被撞上的可能。
密钥认证把这条路堵死了,RSA 或 ED25519 密钥的长度和随机性根本不是手打密码能比的,暴力破解在计算上不现实。私钥还可以加 passphrase,万一密钥文件泄露,攻击者也进不去。
生产服务器建议直接在 /etc/ssh/sshd_config 里关掉密码登录:
PasswordAuthentication no
PermitRootLogin no
root 登录一并禁掉。攻击者通常第一个试的就是 root,禁掉之后他们还得先猜一个有效的普通账户,凭空多了一道门槛。
默认的 22 端口也可以改。改端口算不上安全手段,但能明显减少自动化扫描的骚扰,日志里少很多噪音。
SSH日常用途
登录云主机、执行运维命令、排查线上问题,这是 SSH 最日常的用途。对运维来说基本上开电脑第一件事就是开终端连服务器。
文件传输的话,SFTP 和 SCP 都跑在 SSH 上,全程加密,比裸 FTP 安全太多,敏感文件、配置、备份走这条路是标准做法。
代码部署这块,Git 原生支持 SSH 协议推拉代码。CI/CD 流程里部署脚本用密钥免密登录目标机器,自动跑完整个发布流程,配置里不需要硬写任何密码。
端口转发和隧道用的人相对少,但很好使。把本地端口映射到远程服务、把内网服务拉到本地访问、给不支持加密的协议套一层隧道,这些在受限网络或者内网穿透场景里经常用到。
加固的时候容易漏掉什么
SSH 协议本身这么多年下来没什么大问题,出事基本都是配置没收紧。
防火墙限制来源 IP 是最直接的办法。运维机器 IP 固定的话做个白名单,其他 IP 连握手都走不到,扫描和爆破在网络层就被挡掉了。
Fail2Ban 可以作为补充。它盯着登录失败记录,超过阈值自动封 IP,对付那种低频慢速爆破比较有效,和防火墙配合起来覆盖面更全。
服务端版本更新也容易被忽视。旧版本的漏洞在公开漏洞库里基本都能查到利用方式,更新本身不费什么事,但能堵住一批已知攻击手段。
以上几点做到位之后,针对 SSH 的常见攻击基本没有切入点。剩下的隐患通常来自私钥管理混乱或者内部操作失误,那就不是协议层能解决的事了。
常见问题
SSH 使用哪个端口?
默认情况下,SSH 使用端口 22 进行安全远程连接。虽然这是标准端口,但可以更改为自定义端口,以减少自动攻击的风险并提升安全性。
SSH 完全安全吗?
SSH 被认为高度安全,因为它采用强加密、认证和数据完整性检查。然而,其安全性依赖于正确的配置、定期更新以及遵守最佳实践规则,比如使用 SSH 密钥代替密码。
SSH 会被黑客攻击吗?
Secure Shell 本身非常难以攻破,但配置不当的服务器可能存在漏洞。弱密码、过时的软件或开放的 root 权限会使攻击者更容易攻击 SSH 目标,这也是安全加固至关重要的原因。
哪些操作系统支持 Secure Shell?
SSH 支持所有主要操作系统,包括 Linux、macOS 和 Windows。大多数基于 Unix 的系统默认支持 SSH,而 Windows 则通过内置工具或第三方客户端支持 SSH。
为什么 SSH 比老式远程访问协议更受欢迎?
SSH 取代了旧协议如 Telnet,因为它加密所有通信。这防止了攻击者拦截凭证或数据,使 SSH 在现代远程访问和服务器管理中更加安全。
原创文章,作者:余初云,如若转载,请注明出处:https://blog.jidcy.com/jsjc/2416.html
