【图解】SSH(安全外壳协议)工作原理

2026-07-16 09:33:25 RAIZ

 

很多人只知道“ssh 用户名@IP”就能登录,却不清楚背后的安全逻辑——为什么SSH比Telnet安全?密钥认证到底是怎么回事?端口转发又该怎么用?

一、SSH协议

1.1 什么是SSH协议?

SSH,全称Secure Shell(安全外壳协议),是一种基于TCP协议的加密网络传输协议,核心定位是「远程登录与安全通信的行业标准」。它诞生的初衷,就是解决传统远程协议的安全漏洞,目前主流使用的是SSH-2版本(修复了SSH-1的安全缺陷),几乎所有主流操作系统(Linux、Windows、macOS)都默认支持。

睿智创新RAIZ,一体化IT服务提供商

简单来说,SSH就像给你的远程连接“加了一把锁”,让你在不安全的公网环境中,也能安全地操作远程服务器。

1.2 为什么需要SSH?

在SSH出现之前,大家常用Telnet、FTP等协议进行远程登录和文件传输,但这些协议有一个致命缺陷——明文传输

这意味着,你输入的用户名、密码、执行的命令,甚至传输的文件,都会以明文形式在网络中传输,很容易被黑客窃听、篡改,甚至遭受“中间人攻击”,服务器安全毫无保障。

而SSH的核心优势,就是解决了这个痛点:

  • • 数据加密:所有传输的数据都会被加密,黑客即使捕获到数据包,也无法解密内容;
  • • 身份认证:提供多种认证方式,确保连接者是合法用户,防止非法登录;
  • • 完整性保护:校验传输的数据,防止被篡改,确保接收方拿到的是原始内容。

可以说,SSH的出现,彻底改变了安全格局。

睿智创新RAIZ,一体化IT服务提供商

1.3 SSH的典型应用场景

有了上面这三个能耐,SSH 的应用场景一下子就打开了,几乎覆盖了所有远程运维场景:

  1. 1. 远程服务器管理:这是最基础的用途,通过SSH登录远程Linux服务器,执行命令、配置服务、排查问题,无需现场操作;
  2. 2. 安全文件传输:通过SSH衍生的SFTP(安全文件传输协议)、SCP协议,传输配置文件、数据备份等敏感文件,比FTP安全得多;
  3. 3. 端口转发与隧道技术:突破防火墙限制,访问内网服务(如内网数据库、Web管理界面),或加密HTTP、FTP等非安全协议的流量。
睿智创新RAIZ,一体化IT服务提供商

二、SSH工作流程详解

很多人觉得SSH的工作流程很复杂,其实拆解开来,就是“建立连接→身份认证→生成会话密钥→加密通信”四个阶段,共16个步骤,我们一步步来拆解,看完你就懂了。

睿智创新RAIZ,一体化IT服务提供商

2.1 阶段一:建立安全连接的基础

这一阶段的核心是“打通基础通道,协商好通信规则”,为后续的加密和认证做准备。

睿智创新RAIZ,一体化IT服务提供商

步骤1:建立TCP连接

客户端(比如你的电脑)向服务器的默认SSH端口(22端口)发起连接请求,通过TCP三次握手(SYN→SYN+ACK→ACK)建立基础网络通道。这一步就像两个人打电话,先打通线路,确保能正常通话。

步骤2:版本协商

连接建立后,客户端和服务器会互相发送自己支持的SSH协议版本(比如SSH-2.0),双方匹配并确定使用的版本。如果版本不兼容(比如客户端用SSH-1,服务器只支持SSH-2),连接会直接断开。目前主流系统都默认支持SSH-2,基本不会出现版本兼容问题。

步骤3:算法协商

双方交换各自支持的算法列表,依次协商确定3类核心算法:

  • • 加密算法:用于后续数据传输的加密(如AES、ChaCha20);
  • • 密钥交换算法:用于生成会话密钥(如Diffie-Hellman);
  • • MAC算法:用于校验数据完整性(如HMAC-SHA256)。

只有所有算法都协商一致,才能进入下一阶段。

2.2 阶段二:密钥交换与身份认证

这是SSH安全的核心阶段,核心目的是“验证客户端身份”,同时为后续的加密通信生成基础密钥,避免密钥在网络中直接传输

睿智创新RAIZ,一体化IT服务提供商

步骤4:生成密钥对

客户端基于协商好的非对称加密算法,生成一对临时的公钥和私钥(非对称加密的核心是“公钥加密、私钥解密”,私钥永远保存在客户端本地,不对外传输)。

步骤5:发送公钥

客户端将生成的临时公钥发送给服务器,服务器接收后,会结合自身存储的长期密钥(比如用户提前配置的公钥),参与后续的密钥交换计算。

步骤6:发起登录请求

客户端向服务器提交登录用户名,明确发起身份认证请求,告诉服务器“我要登录这个用户账号”。

步骤7:服务器验证公钥

服务器会去检索目标用户家目录下的「~/.ssh/authorized_keys」文件(这个文件里存储着允许登录该用户的所有客户端公钥),检查客户端发送的公钥是否在这个文件中。

如果匹配成功,服务器会生成一个随机的“挑战消息”(比如一串随机数),并用客户端发送的公钥进行加密。

步骤8:返回加密的随机数

服务器将加密后的“挑战消息”(随机数)发送回客户端。由于这个消息是用客户端公钥加密的,只有客户端的私钥才能解密——这是验证客户端身份的关键一步。

2.3 阶段三:会话密钥生成与安全通信

这一阶段的核心是“确认身份,生成会话密钥”,会话密钥将用于后续所有数据的加密传输,是SSH高效加密的关键。

睿智创新RAIZ,一体化IT服务提供商

步骤9:客户端解密数据

客户端接收到服务器发送的加密“挑战消息”后,用自己本地的私钥进行解密,还原出服务器生成的随机数。

步骤10:发送解密后的数据

客户端将解密后的随机数回传至服务器,同时结合之前协商的密钥交换算法参数,与服务器共同计算生成一个「会话密钥」(对称加密密钥)。

步骤11:服务器验证解密结果

服务器对比客户端回传的随机数,与自己原始生成的随机数是否一致。如果一致,就确认客户端持有合法的私钥,身份认证通过;同时,双方确认会话密钥的有效性,从此刻开始,所有数据传输都将使用这个会话密钥进行加密。

步骤12:会话请求与响应

身份认证通过后,客户端与服务器协商会话参数,比如终端类型(如xterm)、环境变量(如PATH)、字符编码等,确保后续命令执行、结果显示的兼容性,完成会话初始化。

2.4 阶段四:加密数据传输

这是SSH工作流程的最后阶段,也是我们最直观感受到的阶段——所有操作都通过加密通道传输,安全且高效。

睿智创新RAIZ,一体化IT服务提供商

步骤13:发送加密命令

你在客户端输入的命令(比如ls、reboot、cd /etc),会被会话密钥进行对称加密,加密后的数据通过之前建立的TCP通道发送至服务器。

步骤14:服务器解密命令

服务器接收加密数据后,用相同的会话密钥进行解密,还原出原始命令,并在服务器本地执行该命令。

步骤15:发送加密结果

服务器将命令执行结果(比如文件列表、服务状态、错误信息),用会话密钥加密后,回传至客户端。

步骤16:客户端解密结果

客户端接收加密的执行结果,用会话密钥解密后,展示在你的终端上。至此,一次完整的SSH交互流程就完成了。

重点提醒:会话密钥是临时的,只有当前会话有效,会话结束后(比如退出SSH登录),双方会立即销毁会话密钥,避免密钥被复用,进一步提升安全性。

三、SSH核心机制

看完上面的16步流程,你可能会有疑问:为什么SSH既用非对称加密,又用对称加密?会话密钥是怎么来的?身份认证还有其他方式吗?

接下来我们来拆解SSH的3个核心机制,帮你彻底搞懂背后的逻辑。

3.1 非对称加密与对称加密的结合

SSH没有单纯使用一种加密方式,而是结合了非对称加密和对称加密的优势,兼顾“安全性”和“传输效率”:

  • • 非对称加密(公钥/私钥):仅用于「身份认证」和「密钥交换」。优点是安全性高,无需提前传递密钥;缺点是加解密速度慢,不适合大量数据传输。
  • • 对称加密(会话密钥):仅用于「数据传输」。优点是加解密速度极快,适合大量数据实时传输;缺点是需要提前传递密钥,密钥传递过程容易被窃听。

两者结合的逻辑:用非对称加密解决“密钥安全传递”的问题(会话密钥不用直接传输,而是双方共同计算生成),用对称加密解决“高效数据传输”的问题,既安全又高效。

睿智创新RAIZ,一体化IT服务提供商

3.2 会话密钥的生成与作用

睿智创新RAIZ,一体化IT服务提供商

会话密钥是SSH加密通信的核心,它的生成和特性直接决定了SSH的安全性:

  • • 生成过程:基于协商好的密钥交换算法(如Diffie-Hellman),由客户端和服务器共同计算生成,无需通过网络直接传输,有效抵御中间人攻击。
  • • 核心作用:用于后续所有数据(命令、执行结果、文件)的加密传输,是对称加密的核心密钥。
  • • 安全性保障:会话密钥是临时的,仅在当前SSH会话周期内有效,会话结束后立即销毁;同时,每次会话都会生成新的会话密钥,即使某一次密钥泄露,也不会影响其他会话的安全。

3.3 身份认证机制

SSH支持多种身份认证方式,其中「公钥认证」是最安全、最常用的方式,另外两种(密码认证、键盘交互认证)可根据场景灵活选择:

  1. 1. 公钥认证(推荐):就是我们上面16步流程中重点讲的方式,核心是“公钥存服务器,私钥存客户端”。优点是无需输入密码,安全性高,可实现免密登录,且能防止中间人攻击;缺点是需要提前配置公钥。
  2. 2. 密码认证(简单但不安全):客户端输入用户名和密码,密码通过加密通道传输至服务器,服务器验证密码是否正确。优点是操作简单,无需配置;缺点是易遭受暴力破解,不建议在生产环境使用。
  3. 3. 键盘交互认证(复杂场景):由服务器向客户端发送提示信息(如验证码、动态口令),客户端输入响应信息,服务器验证通过后完成认证。适用于双因子认证等复杂安全场景。

四、SSH端口转发技术:本地转发(Local Forwarding)

SSH端口转发是SSH的“隐藏技能”,也是运维中非常实用的功能——它能通过SSH加密隧道,突破防火墙限制,访问内网服务,或加密非安全协议的流量。其中,本地转发是最常用的一种转发方式。

4.1 什么是SSH端口转发?

SSH端口转发,本质是“将非安全协议的流量,封装到SSH加密隧道中传输”,核心作用有两个:

  • • 突破防火墙限制:访问内网中被防火墙屏蔽的服务(如内网数据库、Web管理后台);
  • • 加密非安全流量:将HTTP、FTP等明文协议的流量加密,避免被窃听篡改。
睿智创新RAIZ,一体化IT服务提供商

简单来说,SSH端口转发就像“搭建一条秘密通道”,所有数据都通过这条加密通道传输,防火墙无法识别通道内的内容,从而实现突破限制和安全传输。

4.2 本地转发的工作原理

本地转发的核心是“将本地端口的请求,通过SSH隧道转发到目标服务器的指定端口”,核心命令如下:

ssh -L p1:server:p2 remote

命令参数解释:

  • • -L:表示本地转发(Local Forwarding);
  • • p1:本地电脑的端口(比如8080);
  • • server:目标服务器的IP或域名(比如内网数据库的IP);
  • • p2:目标服务器的端口(比如数据库的3306端口);
  • • remote:可以访问目标服务器的远程服务器(比如公司外网服务器)。
睿智创新RAIZ,一体化IT服务提供商

数据流向(看懂这个,就懂了本地转发):

本地端口p1 → SSH加密隧道 → 远程服务器 → 目标服务器端口p2

举个例子:你在公司外网,想访问内网的MySQL数据库(IP:192.168.1.100,端口3306),但防火墙屏蔽了3306端口。此时,你可以通过公司外网服务器(IP:203.xxx.xxx.xxx)搭建本地转发,命令为:

ssh -L 8080:192.168.1.100:3306 root@203.xxx.xxx.xxx

此时,你在本地访问127.0.0.1:8080,就相当于访问内网的192.168.1.100:3306,所有流量都通过SSH隧道加密传输。

4.3 本地转发的应用场景

主要有两类:

  1. 1. 访问内网服务:比如访问内网的数据库(MySQL、Redis)、Web管理后台(如Nginx管理界面)、服务器桌面等,解决外网无法直接访问内网服务的问题。
  2. 2. 加密非安全协议流量:比如将HTTP流量(明文)封装到SSH隧道中,变成加密流量,避免在公网传输时被窃听;同理,FTP、Telnet等协议也可以通过这种方式加密。

五、SSH安全实践

前面我们唠完了SSH的原理和用法,接下来更重要的是做好安全配置,避免服务器被攻击;

5.1 SSH安全配置建议

生产环境中,SSH的安全配置至关重要,建议做好以下几点,筑牢服务器防线:

  • • 禁用root用户远程登录:root是超级用户,权限极高,一旦泄露密码,服务器就会被完全控制。建议创建普通用户,赋予必要权限,禁用root远程登录。
  • • 强制使用密钥认证:关闭密码认证,只允许公钥认证,避免暴力破解。
  • • 修改默认SSH端口:将默认的22端口修改为非知名端口(如2222、6666),降低被自动化扫描工具攻击的概率。
  • • 限制用户权限:给登录SSH的用户分配最小权限,避免不必要的操作风险。
  • • 定期更新SSH服务版本:及时修复已知的安全漏洞,禁用弱加密算法(如DES、3DES)。
  • • 安装防护工具:比如Fail2ban,可拦截多次密码错误的登录请求,防止暴力破解。

5.2 常见问题排查

日常使用SSH时,难免会遇到连接失败、认证失败等问题,以下是最常见的问题及解决方案:

  1. 1. 连接失败:
    1. 1. 检查防火墙:服务器防火墙是否放行SSH端口(如22端口),本地防火墙是否拦截出站流量;
    2. 2. 检查SSH服务:服务器sshd服务是否正常运行(命令:systemctl status sshd);
    3. 3. 检查网络:客户端与服务器是否能ping通,IP和端口是否正确。
  2. 2. 认证失败:
    1. 1. 检查公钥配置:客户端公钥是否添加到服务器的~/.ssh/authorized_keys文件中;
    2. 2. 检查文件权限:~/.ssh目录权限需为700,authorized_keys文件权限需为600(权限过高或过低都会导致认证失败);
    3. 3. 检查公钥格式:确保公钥格式正确,没有多余的空格或换行;
    4. 4. 检查私钥:客户端私钥是否匹配,私钥是否设置了密码(若设置,需输入正确密码)。

5.3 SSH与防火墙的协同

SSH与防火墙的协同,核心是“既要保障SSH安全,又要实现所需功能”:

  • • 防火墙限制SSH访问:通过防火墙规则,仅允许可信IP(如自己的电脑IP)访问SSH端口,缩小攻击面;
  • • SSH穿透防火墙:通过端口转发技术,突破防火墙对内部服务的限制,实现外网访问内网服务;
  • • 注意事项:配置防火墙规则时,需确保SSH端口(或修改后的端口)正常放行,避免出现“防火墙拦截SSH流量”导致连接失败。

5.4 SSH命令速查表

日常最常用的SSH命令,收藏起来,随用随查:

  • • 远程登录:ssh -p 端口 用户名@服务器IP(如:ssh -p 2222 root@203.xxx.xxx.xxx);
  • • 密钥登录:ssh -i 私钥路径 用户名@服务器IP(如:ssh -i ~/.ssh/id_rsa root@203.xxx.xxx.xxx);
  • • 本地端口转发:ssh -L 本地端口:目标IP:目标端口 用户名@远程服务器IP
  • • 安全文件传输(SCP):scp 本地文件 用户名@服务器IP:目标路径(如:scp ~/test.txt root@203.xxx.xxx.xxx:/root/);
  • • 查看SSH服务状态:systemctl status sshd
  • • 重启SSH服务:systemctl restart sshd

5.5 SSH配置文件

SSH的配置文件(~/.ssh/config)可以简化复杂的连接命令,实现“一键登录”多台服务器,提升效率。

以下是常用参数说明:

  • • Host:服务器别名(自定义,比如“server1”),后续登录时直接用“ssh server1”即可;
  • • HostName:服务器的IP或域名;
  • • Port:SSH端口(默认22,若修改过需填写新端口);
  • • User:登录用户名;
  • • IdentityFile:私钥路径(如~/.ssh/id_rsa);
  • • StrictHostKeyChecking no:首次登录时,无需手动确认服务器指纹(简化操作)。

示例配置:

Host server1
  HostName 203.xxx.xxx.xxx
  Port 2222
  User root
  IdentityFile ~/.ssh/id_rsa
  StrictHostKeyChecking no

Host db-server
  HostName 192.168.1.100
  Port 22
  User admin
  IdentityFile ~/.ssh/db_rsa

配置完成后,直接输入“ssh server1”,即可一键登录对应服务器,无需重复输入IP、端口和用户名。

注:转载文章来源于网络,版权归原作者或企业所有,侵删!

 

我要咨询