了解 SSH:初学者指南
Source: Dev.to
SSH到底是什么?
SSH 代表 Secure Shell(安全外壳)。它是一种加密网络协议,能够让你:
- 安全登录远程计算机
- 在无法亲自触碰的机器上执行命令
- 在不被窃听的情况下传输文件
- 为其他网络流量创建加密隧道
当你听到 “我将 SSH 进入服务器” 时,意味着对方即将安全地连接到远程机器并通过命令行进行控制。

为什么会发明 SSH
在 SSH 出现之前,系统管理员使用的工具会以明文方式传输数据:
| 协议 | 问题 |
|---|---|
| Telnet | 所有内容(密码、命令等)都以明文发送 |
| rlogin | 没有加密,基于 IP 信任主机(容易被欺骗) |
| FTP | 密码以明文传输 |
不安全传输的示例
USER: admin
PASS: supersecret123
同一网络中的任何人都可以运行数据包嗅探器并读取凭据。
在 1990 年代,一位芬兰研究员在其大学网络被攻击、密码被直接从线路上嗅探后,创建了 SSH。SSH 的诞生源于真实的安全事件,而非理论上的偏执。
类比:Telnet 就像在拥挤的房间里大声喊出你的银行 PIN。SSH 则像通过加密无线电低声说出,只有你和银行能解码。
SSH 协议版本
| 版本 | 状态 | 备注 |
|---|---|---|
| SSH-1 | 已废弃 | 存在已知漏洞,切勿使用。 |
| SSH-2 | 当前标准 | 完全重新设计的协议,几乎所有现代系统都使用。 |
SSH‑2 是一次 完整重写,具备:
- 更好的密钥交换算法
- 改进的完整性检查
- 在同一会话中支持多种认证方式
务必确保你的系统使用 SSH‑2。 大多数现代系统默认如此,但旧系统可能仍使用 SSH‑1。
SSH 实际工作原理
阶段 1:TCP 连接
SSH 运行在 TCP 上,通常使用 22 端口。客户端发起标准的 TCP 三次握手:
Client → Server: SYN
Server → Client: SYN‑ACK
Client → Server: ACK
连接建立后,SSH 协议正式开始。
阶段 2:协议版本交换
双方宣布各自的 SSH 版本:
Client: SSH-2.0-OpenSSH_8.9
Server: SSH-2.0-OpenSSH_8.4
如果任一方仅支持 SSH‑1,现代客户端会(并且应该)拒绝连接。
阶段 3:密钥交换(魔法)
目标是 创建一个窃听者无法得知的共享密钥。最常用的算法是 椭圆曲线 Diffie‑Hellman(ECDH):
########### Key Exchange (Simplified) ###########
1. Client and Server agree on mathematical parameters
2. Client generates: private value (a), public value (A)
Server generates: private value (b), public value (B)
3. They exchange public values (A and B) [Attacker can see A and B]
4. Client computes: shared_secret = B^a
Server computes: shared_secret = A^b [Both arrive at the SAME secret!]
5. This shared secret derives the session encryption keys
共享密钥 从不传输;即使攻击者看到所有数据包,也无法计算出它。
阶段 4:服务器身份验证(主机密钥)
在你对服务器进行身份验证之前,服务器会先对你进行身份验证。首次连接时你会看到:
The authenticity of host 'server.com (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:AbCdEf1234567890...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
如果输入 yes,指纹会被保存到 ~/.ssh/known_hosts。以后连接时会验证服务器的密钥是否与已保存的指纹匹配。
如果指纹发生变化,SSH 会警告:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
小技巧:首次使用时通过带外渠道(例如供应商文档)验证指纹。
阶段 5:用户身份验证
SSH 支持多种认证方式。
方法 1:密码认证
ssh user@server.com
# Prompts for password
简单,但 不推荐,因为密码容易被暴力破解、键盘记录器窃取,并且每次都需要手动输入。
方法 2:公钥认证(首选)
使用非对称加密(密钥对)。
| 密钥 | 位置 | 用途 |
|---|---|---|
| 私钥 | ~/.ssh/id_ed25519(或类似) | 永不离开本机。证明你的身份。 |
| 公钥 | 服务器上的 ~/.ssh/authorized_keys | 可自由共享。验证来自私钥的签名。 |
工作原理

私钥永不离开你的机器;服务器只看到你拥有私钥的证明。
方法 3:基于证书的认证
在企业环境中使用。证书授权中心(CA)为用户密钥签名,服务器信任该 CA 而不是单个密钥。
阶段 6:加密会话
认证完成后,所有流量使用 对称加密(AES‑256、ChaCha20 等)进行加密。对称密码比非对称密码快约 1000 倍。
每个数据包还包含 MAC(消息认证码)——一种加密校验和,用于检测篡改。
SSH 密钥类型
| 密钥类型 | 典型文件 | 推荐使用 |
|---|---|---|
| RSA | id_rsa | 传统;仍受支持 |
| ECDSA | id_ecdsa | 速度与安全的良好平衡 |
| ED25519 | id_ed25519 | 现代、快速且高度安全(许多工具的默认) |
| DSA | id_dsa | 已废弃;请避免使用 |
生成新的密钥对(ED25519 示例):
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C "your_email@example.com"
-a 100增加 KDF(密钥派生函数)轮数,使对私钥的暴力攻击更困难。-C添加注释(通常是你的邮箱),以便识别该密钥。
常用 SSH 命令
| 命令 | 描述 |
|---|---|
ssh user@host | 在远程主机上打开交互式 shell |
ssh -i /path/to/key user@host | 使用指定的私钥 |
scp file.txt user@host:/remote/path/ | 将文件复制到远程主机 |
scp -r dir/ user@host:/remote/dir/ | 递归复制目录 |
ssh -L 8080:localhost:80 user@host | 创建本地端口转发(在本地 8080 访问远程 Web 服务) |
ssh -R 9090:localhost:22 user@host | 创建远程端口转发(将本地 SSH 暴露给远程) |
ssh -N -f -L 3306:db.internal:3306 user@bastion | 在不打开 shell(-N)且后台运行(-f)的情况下建立隧道 |
加固 SSH 服务器
- 禁用 SSH‑1 – 确保在
/etc/ssh/sshd_config中设置Protocol 2。 - 强制使用公钥认证 – 设置
PasswordAuthentication no。 - 更改默认端口(可选) – 如
Port 2222。 - 限制用户 –
AllowUsers alice bob。 - 使用 Fail2Ban 或类似工具 – 阻止重复的登录失败。
- 启用双因素认证 – 例如 Google Authenticator PAM 模块。
- 保持 OpenSSH 最新 – 安全补丁会定期发布。
故障排除技巧
- “Permission denied (publickey)” – 确认服务器上
~/.ssh/authorized_keys中的公钥放置正确,且文件权限严格(chmod 600 ~/.ssh/authorized_keys)。 - Host key verification failed – 从
~/.ssh/known_hosts中删除旧条目(ssh-keygen -R hostname),然后重新连接。 - Connection timed out – 确认防火墙已打开 22 端口(或自定义端口),并且服务器的 SSH 守护进程正在运行。
- Slow login – 检查 DNS 反向解析设置;如 DNS 查询导致延迟,可在
sshd_config中加入UseDNS no。
进一步阅读
- OpenSSH 手册
- RFC 4251 – The Secure Shell (SSH) Protocol Architecture
- SSH, The Secure Shell: The Definitive Guide,作者 Daniel J. Barrett、Richard E. Silverman、Robert G. Byrnes
本指南提供了 SSH 基础、协议工作原理以及安全使用的最佳实践的简明概述。