了解 SSH:初学者指南

发布: (2025年12月2日 GMT+8 13:06)
9 min read
原文: Dev.to

Source: Dev.to

SSH到底是什么?

SSH 代表 Secure Shell(安全外壳)。它是一种加密网络协议,能够让你:

  • 安全登录远程计算机
  • 在无法亲自触碰的机器上执行命令
  • 在不被窃听的情况下传输文件
  • 为其他网络流量创建加密隧道

当你听到 “我将 SSH 进入服务器” 时,意味着对方即将安全地连接到远程机器并通过命令行进行控制。

描述 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 密钥类型

密钥类型典型文件推荐使用
RSAid_rsa传统;仍受支持
ECDSAid_ecdsa速度与安全的良好平衡
ED25519id_ed25519现代、快速且高度安全(许多工具的默认)
DSAid_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 服务器

  1. 禁用 SSH‑1 – 确保在 /etc/ssh/sshd_config 中设置 Protocol 2
  2. 强制使用公钥认证 – 设置 PasswordAuthentication no
  3. 更改默认端口(可选) – 如 Port 2222
  4. 限制用户AllowUsers alice bob
  5. 使用 Fail2Ban 或类似工具 – 阻止重复的登录失败。
  6. 启用双因素认证 – 例如 Google Authenticator PAM 模块。
  7. 保持 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 基础、协议工作原理以及安全使用的最佳实践的简明概述。

Back to Blog

相关文章

阅读更多 »

macOS 上的网络驱动器映射

打开 Finder 在 Mac 上打开 Finder 以启动此过程。 连接到服务器 在 Finder 顶部栏,点击 “前往 → 连接到服务器…” 或使用 …