强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

SSH 服务器完全指南 / 第1章 SSH 协议与 OpenSSH 简介

第1章 SSH 协议与 OpenSSH 简介

1.1 什么是 SSH?

SSH(Secure Shell,安全外壳协议)是一种网络协议,用于在不安全的网络上安全地进行远程登录、命令执行和文件传输。它最初由芬兰程序员 Tatu Ylönen 于 1995 年开发,目的是取代 Telnet、rsh、rlogin 等明文传输协议。

SSH 的核心价值:

特性 说明
加密传输 所有数据经过加密,防止窃听
身份验证 支持密码、密钥、证书等多种认证方式
数据完整性 防止数据在传输过程中被篡改
端口转发 可以安全地隧道化其他协议
广泛支持 几乎所有 Unix/Linux 系统原生支持

1.2 SSH 协议版本演进

SSH-1(1995年)

第一版协议,存在多个已知安全漏洞:

  • CRC-32 完整性检查可被绕过
  • 密钥交换过程存在弱点
  • 已被弃用,不应在生产环境使用

SSH-2(2006年,RFC 4251)

当前标准版本,安全性和功能大幅增强:

  • 基于 DH(Diffie-Hellman)或 ECDH 的密钥交换
  • 支持更强的加密算法(AES-256-GCM、ChaCha20-Poly1305)
  • 改进的 MAC(消息认证码)算法
  • 支持 SSH 证书认证
  • 不兼容 SSH-1
SSH 协议架构:

┌─────────────────────────────────────────────┐
│            应用层 (Application)              │
│   Shell / SFTP / SCP / 端口转发 / X11      │
├─────────────────────────────────────────────┤
│          连接层 (Connection)                 │
│   通道复用 / 会话管理 / 流量控制            │
├─────────────────────────────────────────────┤
│         认证层 (Authentication)              │
│   公钥 / 密码 / 证书 / 键盘交互             │
├─────────────────────────────────────────────┤
│          传输层 (Transport)                  │
│   密钥交换 / 加密 / 完整性 / 压缩           │
├─────────────────────────────────────────────┤
│            TCP/IP                            │
└─────────────────────────────────────────────┘

1.3 SSH 握手过程

理解 SSH 连接建立的过程,对于排查问题和理解安全机制至关重要。

阶段一:传输层协商(Transport)

客户端                                服务器
  │                                      │
  │──── TCP 三次握手 ────────────────────>│
  │                                      │
  │──── 协议版本交换 ───────────────────>│
  │<─── 协议版本交换 ────────────────────│
  │                                      │
  │──── 算法协商 (KEX) ─────────────────>│
  │<─── 算法协商 (KEX) ─────────────────│
  │                                      │
  │──── DH 密钥交换 ────────────────────>│
  │<─── DH 密钥交换 + 主机密钥 ─────────│
  │                                      │
  │<═══ 加密通道建立 ═══════════════════>│

阶段二:用户认证(Authentication)

客户端                                服务器
  │                                      │
  │──── 认证请求 (用户名) ──────────────>│
  │<─── 可用认证方法列表 ────────────────│
  │                                      │
  │──── 公钥认证 / 密码认证 ────────────>│
  │<─── 认证结果 ────────────────────────│
  │                                      │
  │<═══ 认证成功,进入会话 ═════════════>│

阶段三:会话请求(Session)

客户端                                服务器
  │                                      │
  │──── 请求通道 (session) ─────────────>│
  │<─── 通道确认 ────────────────────────│
  │                                      │
  │──── 执行命令 / 请求 Shell ──────────>│
  │<─── 数据流 (stdout/stderr) ─────────│

1.4 SSH 的加密机制

对称加密(Symmetric Encryption)

用于加密实际传输的数据,客户端和服务器使用相同的会话密钥:

算法 密钥长度 推荐程度 说明
aes256-gcm@openssh.com 256 bit ⭐⭐⭐ 首选 AES-GCM,同时提供加密和认证
chacha20-poly1305@openssh.com 256 bit ⭐⭐⭐ 首选 适合无 AES 硬件加速的环境
aes256-ctr 256 bit ⭐⭐ 可用 CTR 模式,需配合 HMAC
aes128-gcm@openssh.com 128 bit ⭐⭐ 可用 性能更好,安全性略低
3des-cbc 168 bit ❌ 避免 已不安全
arcfour 128 bit ❌ 避免 RC4 流密码,已不安全

非对称加密(Asymmetric Encryption)

用于密钥交换和身份验证:

算法 类型 密钥长度 推荐程度
ssh-ed25519 EdDSA 256 bit ⭐⭐⭐ 首选
ecdsa-sha2-nistp256 ECDSA 256 bit ⭐⭐ 可用
rsa-sha2-256/512 RSA 4096 bit ⭐⭐ 兼容性好
ssh-dss DSA 1024 bit ❌ 已弃用

密钥交换算法(Key Exchange)

算法 推荐程度 说明
curve25519-sha256 ⭐⭐⭐ 首选 最现代的 ECDH 实现
diffie-hellman-group16-sha512 ⭐⭐⭐ 推荐 4096-bit DH
diffie-hellman-group14-sha256 ⭐⭐ 可用 2048-bit DH
diffie-hellman-group1-sha1 ❌ 避免 已不安全

完整性校验(MAC)

算法 推荐程度
hmac-sha2-256-etm@openssh.com ⭐⭐⭐ 首选
hmac-sha2-512-etm@openssh.com ⭐⭐⭐ 首选
hmac-sha1 ❌ 避免

注意: etm(encrypt-then-MAC)模式比 mti(MAC-then-encrypt)更安全。


1.5 OpenSSH:事实标准

OpenSSH 是 SSH 协议最广泛使用的开源实现,由 OpenBSD 项目维护。几乎所有的 Linux 发行版、macOS 都默认安装 OpenSSH。

OpenSSH 组件

组件 类型 功能
sshd 服务端 SSH 守护进程,监听连接请求
ssh 客户端 远程登录和命令执行
scp 客户端 基于 SSH 的文件复制(已逐步被 sftp 取代)
sftp 客户端 安全文件传输协议
ssh-keygen 工具 生成和管理密钥对
ssh-copy-id 工具 将公钥部署到远程服务器
ssh-agent 工具 密钥代理,缓存私钥密码
ssh-add 工具 向 ssh-agent 添加密钥
sshd-config 工具 检查 sshd_config 语法(较新版本)

OpenSSH 版本与特性对照

版本 发布年份 重要特性
6.5 2014 Ed25519 密钥支持
7.0 2016 禁用 SSH-1、弃用 DSA
7.4 2017 新增 Include 指令
8.0 2019 FIDO/U2F 硬件密钥支持
8.2 2020 FIDO2/WebAuthn 支持
8.8 2021 弃用 ssh-dss
9.0 2022 默认禁用 ssh-rsa 签名
9.3 2023 Include 支持通配符
9.6 2023 连接修复、安全改进
9.8 2024 regreSSHion 漏洞修复(CVE-2024-6387)

1.6 SSH 的适用场景

场景一:远程服务器管理

最基础的用途——通过终端远程管理 Linux 服务器:

# 连接到远程服务器
ssh admin@192.168.1.100

# 执行单条命令
ssh admin@192.168.1.100 "df -h && free -m"

# 指定端口连接
ssh -p 2222 admin@192.168.1.100

业务场景: 运维人员管理分散在各地的云服务器,无需物理接触设备。

场景二:安全文件传输

替代 FTP 等不安全的文件传输协议:

# 使用 scp 复制文件
scp backup.tar.gz user@server:/backups/

# 使用 sftp 交互式传输
sftp user@server

# rsync over SSH(推荐)
rsync -avz -e ssh /local/path/ user@server:/remote/path/

业务场景: 部署应用代码、传输数据库备份、同步日志文件。

场景三:端口转发与隧道

将不安全的网络流量通过 SSH 加密隧道传输:

# 本地转发:访问本地 8080 端口 = 访问远程 80 端口
ssh -L 8080:localhost:80 user@server

# 远程转发:外部访问服务器 9090 端口 = 访问本地 3000 端口
ssh -R 9090:localhost:3000 user@server

# 动态转发:SOCKS5 代理
ssh -D 1080 user@server

业务场景: 安全访问内网服务、穿透防火墙、加密公共 Wi-Fi 流量。

场景四:自动化运维

通过 SSH 实现批量服务器管理和自动化部署:

# 批量执行命令
for host in web{01..10}; do
    ssh "$host" "systemctl restart nginx"
done

# Ansible 通过 SSH 管理服务器集群
ansible all -m ping

业务场景: CI/CD 流水线中的自动部署、配置管理、健康检查。

场景五:Git 远程操作

Git 使用 SSH 进行认证和数据传输:

# 克隆仓库(SSH 协议)
git clone git@github.com:user/repo.git

# 配置 SSH 密钥用于 Git 认证
ssh-keygen -t ed25519 -C "your_email@example.com"

业务场景: 开发团队代码协作、CI/CD 系统拉取代码。

场景六:跳板机/堡垒机

通过中间服务器访问隔离网络中的主机:

# 通过跳板机连接内网服务器
ssh -J jumpuser@bastion.internal internaluser@10.0.0.50

业务场景: 企业安全合规要求、多层网络架构中的运维访问。


1.7 SSH 与其他远程协议对比

特性 SSH Telnet RDP VNC
加密传输 部分
跨平台 ❌ (主要 Windows)
带宽占用 中~高
图形界面 需 X11
端口转发
文件传输 ✅ (SFTP) 剪贴板 剪贴板
认证方式 多种 仅密码 密码/证书 密码
安全性 极低 低~中
适用系统 Linux/macOS/Windows 遗留系统 Windows 图形桌面

1.8 常见误解澄清

误解一:SSH 默认端口 22 很危险

事实: 端口本身不是安全问题。危险的是弱密码和错误配置。更改端口只是减少噪音日志,不能替代真正的安全措施。

误解二:SSH 密钥比密码更安全

事实: 密钥认证确实更安全,但前提是你妥善保管私钥。一个没有密码保护的私钥文件,如果泄露,比弱密码更危险。

误解三:SSH 是万能的安全方案

事实: SSH 只是安全体系的一部分。它保护传输层安全,但不解决应用层漏洞、权限管理、网络隔离等问题。

误解四:关闭 SSH 服务 = 服务器更安全

事实: 关闭 SSH 意味着你失去了远程管理能力。在云环境中,你可能完全无法访问服务器。安全的做法是正确配置 SSH,而非关闭它。


1.9 SSH 的安全边界

SSH 保护什么?

✅ SSH 保护的内容:
├── 传输中的数据(加密)
├── 用户身份(认证)
├── 数据完整性(防篡改)
└── 会话机密性(防窃听)

❌ SSH 不保护的内容:
├── 服务器本身(SSH 不是防火墙)
├── 私钥文件(需要你自己保护)
├── 应用层漏洞(SSH 不检查应用数据)
├── 已认证用户的行为(SSH 不做授权审计)
└── 物理安全(无法防止物理接触)

1.10 学习路径建议

初学者路线                    进阶路线
─────────────                ──────────
01. 简介 (你在这里)           06. sshd_config 深入
02. 安装配置                   07. 隧道与转发
03. 密钥与连接                 08. X11 / Agent 转发
04. 密钥认证                   09. SFTP 文件传输
05. 密码与 MFA                 10. 安全加固实战
                               11. 跳板机 / 堡垒机
                               12. 自动化运维
                               13. Docker 与 SSH
                               14. 故障排查
                               15. 最佳实践

扩展阅读


下一章: 第2章 安装与初始配置 → 学习在各平台上安装 OpenSSH 服务器并完成基础配置。