SSH服务
一、服务工作原理和配置
1.1 介绍
- 通过加密技术,提供一个安全的远程登录方式,以及其他网络服务的加密通道。
- 核心功能
- 远程登录
- 文件传输
- 端口转发:SSH可以通过本地或远程端口转发实现隧道功能,帮助用户在受限网络中传输数据。
- 加密通信:所有通过SSH传输的数据都被加密,防止中间人攻击和数据泄露。
- 身份验证
- SSH组成部分
- 客户端
- 服务端
- 协议
- 加密算法
1.2 原理
-
建立连接
- 客户端发起请求
- 服务端响应:会向客户端发送服务端公钥以及相关配置信息
- 客户端拿着这个公钥,可以验证服务端的身份。
- 这里可以使用数字证书验证。
- 另一种方式是「公钥指纹验证」
- 服务端会发来公钥,以及公钥指纹,公钥指纹就是公钥的哈希值
- 客户端如果是第一次连接,此时需要「手动验证公钥指纹」,查看是否符合预期。如果符合预期,那么可以将公钥指纹存储在本地,之后的连接,就可以直接和本地存储的公钥指纹对比了。
- 上述通信内容都未被加密。
-
密钥交换
- Diffie-Hellman密钥交换(DH)
- 1️⃣客户端和服务端各自生成私钥(永远不会被传输)。
- 2️⃣客户端通过私钥生成公共密钥A,服务端通过私钥生成公共密钥B(这里的公钥和建立连接的公钥不是一个东西),然后分别发送给对方。
- 3️⃣客户端通过自己的私钥,得到对称密钥C,服务端通过自己的私钥,得到对称密钥C,注意,这两个对称密钥是相同的,原理是「同余理论」
- 关键是3️⃣,如果没有私钥,是得不到「对称密钥」的。
- 得到了对称密钥后,就可以通过这个对称密钥通信了。
- ECDH:和DH类似,使用的数据原理不同。ECDH 是 DH 的一种更高效的替代方案,通过使用椭圆曲线算法,可以在相同的安全性级别下,提供更短的密钥、更少的计算和更低的带宽消耗
- RSA密钥交换
- 客户端生成对称密钥,然后用服务器的公钥加密,发送给服务器。
- 服务器用自己的私钥解密,双方都得到了对称密钥,之后就可以通过对称密钥通信了。
- Diffie-Hellman密钥交换(DH)
-
身份验证
- 有下面三种方式
- 基于密码身份验证:客户端向服务器发送用户名和密码,服务端通过对比密码来验证身份。
- 不安全,因为密码泄漏了就完了。(密码在网络中传输了,虽然可能被加密了)
- 基于公钥的身份验证
- 1️⃣生成密钥对:客户端首先生成一对公钥和私钥,私钥永远保存在客户端,公钥可以放在服务器上。
- 2️⃣服务端存储公钥:客户端将公钥发送到服务器上,服务器存储客户端的公钥。
- 3️⃣服务端使用之前存储的公钥解密,如果匹配,则验证成功。
- 基于数字证书的身份验证
- 基于密码身份验证:客户端向服务器发送用户名和密码,服务端通过对比密码来验证身份。
- 有下面三种方式
-
加密通信
- 身份验证通过后,SSH通过对称加密来加密客户端和服务器之间的所有通信数据。
-
数据包完整性和防篡改
- SSH使用消息认证码(MAC)来确保数据完整性,防止数据在传输过程中被篡改。如果数据包被篡改,服务器和客户端会发现并拒绝这个数据包。
- MAC过程:双方都有一个「共享密钥」,发送消息者将消息m以及「共享密钥」,共同哈希,得到MAC,然后接收者得到消息,以及「共享密钥」,算出MAC,如果一致则没有被篡改。
- 因为「共享密钥」只有双方拥有,所以能防止其他人篡改消息。
- 能防止中间人攻击。
1.3 和HTTPS中的TLS的区别
-
特性 SSH TLS 主要用途 远程登录、远程命令执行、文件传输 网络通信加密(HTTPS)、应用加密(SMTP、IMAP等) 身份验证 双向身份验证(客户端和服务器) 单向身份验证(服务器认证,客户端可选) 加密方式 非对称加密(密钥交换) + 对称加密 非对称加密(密钥交换) + 对称加密 通信模式 全双工交互式会话 单向通信(请求-响应) 会话持久性 长时间保持会话 短时间(每次请求建立新的会话,也可以持久化HTTP) 主要协议 SSH, SCP, SFTP HTTPS, SMTP, IMAPS
二、文件传输
2.1 SCP
- SCP 是一个基于 SSH 的简单文件传输协议,支持将文件从本地复制到远程服务器,或从远程服务器复制到本地。它使用 SSH 加密 来保护数据在传输过程中的机密性和完整性。
- 从本地传输文件到远程服务器
scp localfile username@remotehost:/remote/path/
localfile
:本地文件路径。username
:远程服务器的用户名。remotehost
:远程服务器的 IP 地址或域名。/remote/path/
:远程目录路径。
- 从远程服务器下载文件到本地
scp username@remotehost:/remote/path/remoteFile localfile
- 下载整个目录内容
scp -r localdir username@remotehost:/remote/path/
2.2 SFTP
-
SFTP 是基于 SSH 的文件传输协议,功能比 SCP 更强大,支持浏览远程目录、修改权限等操作。它使用 SSH 会话进行数据加密和身份验证。
-
使用命令登录到远程服务器
sftp username@remotehost
- 登录后会进入交互界面,可以输入命令执行操作。
-
常见SFTP命令
- 上传文件
put localfile /remote/path/
- 上传整个目录
put -r localdir /remote/path/
- 下载文件
get /remote/path/remoteFile localfile
- 下载整个目录
get -r /remote/path/remoteDir localdir
- 查看远程目录
ls
- 更改远程目录
cd /remote/path/
- 上传文件
-
非交互式SFTP
-
把命令存入文件中,例如
batchfile
内容cd /remote/path/ put localfile get remoteFile bye -
然后执行
sftp -b batchfile username@remotehost
-
三、远程登录
- 基本语法
ssh username@remote_host
username
:远程主机的用户名。remote_host
:远程主机的 IP 地址或域名。
- 指定端口号:如果 SSH 服务运行在非默认的 22 端口,可以使用
-p
参数ssh -p port_number username@remote_host
port_number
:端口号
- 远程执行命令
ssh username@remote_host "command"
- 使用公钥认证登录
- 首先生成密钥对
ssh-keygen -t rsa -b 2048
,默认会将密钥存储在~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
中。 - 将公钥上传到远程服务器:
ssh-copy-id username@remote_host
,将id_rsa.pub
的内容复制到远程服务器的~/.ssh/authorized_keys
文件中。 - 使用密钥登录
ssh username@remote_host
- 首先生成密钥对
- 指定密钥登录
ssh -i /path/to/private_key username@remote_host
四、端口转发
4.1 本地端口转发
- 工作原理:本地端口转发将本地计算机的一个端口与远程计算机的一个端口相连接。任何发往本地端口的流量都会通过 SSH 隧道发送到远程主机的目标端口。
- 命令格式
ssh -L <local_port>:<remote_host>:<remote_port> <user>@<ssh_server>
-L
:指定本地端口转发。<local_port>
:本地计算机上的端口。<remote_host>
:远程主机的地址,可以是远程服务器或局域网中的其他服务器。<remote_port>
:远程主机上的端口,通常是某个服务的端口(如 HTTP 服务 80 端口)。<user>@<ssh_server>
:SSH 登录信息,指定目标 SSH 服务器的地址。
- 通常是本地要访问远程服务器的功能。
- 应用场景
- 通过防火墙访问远程服务:你想访问服务器B的x端口,但是防火墙挡住了,但是你可以访问服务器C,服务器C又可以访问服务器B的x端口,所以用本地端口可以实现。
- 在远程主机上调试和开发:开发人员可以使用本地端口转发来将调试工具、开发环境等本地资源映射到远程主机上,以便更方便地进行远程开发和调试。
4.2 远程端口转发
- 工作原理:远程端口转发允许把远程主机的端口映射到本地计算机上的端口。这意味着可以通过远程服务器上的端口来访问本地计算机的服务。
- 命令格式
ssh -R <remote_port>:<local_host>:<local_port> <user>@<ssh_server>
-R
:指定远程端口转发。<remote_port>
:远程服务器上的端口。<local_host>
:本地计算机的主机地址。<local_port>
:本地计算机上的端口,通常是正在运行的服务的端口。<user>@<ssh_server>
:SSH 登录信息,指定目标 SSH 服务器的地址。- 注意,这里的
ssh_server
就是远程服务器的ip - 只有
user
这个用户才能使用
- 注意,这里的
- 常用于让外部用户通过远程服务器访问本地计算机上的服务。
- 应用场景
- 绕过防火墙访问本地服务。
- 通过跳板机访问内网服务。(上述的ssh_server可以认为就是跳板机,登录这个跳板机后就可以访问内网服务了)
4.3 动态端口转发
- 工作原理:动态端口转发将本地计算机的一个端口作为 SOCKS 代理,所有通过该端口的流量都会通过 SSH 隧道转发到远程服务器。可以使用任何支持 SOCKS 代理的应用程序(如浏览器、命令行工具等)来通过 SSH 隧道访问远程服务。
- 命令格式
ssh -D <local_port> <user>@<ssh_server>
-D
:指定动态端口转发。<local_port>
:本地计算机上的端口,通常是 SOCKS 代理端口。<user>@<ssh_server>
:SSH 登录信息,指定目标 SSH 服务器的地址。
- 其实就是开了一个代理,你的数据包从
local_port
出去,然后交给ssh_server
,然后这个服务器代替你访问你想要访问的资源,再返回给你。 - 可以实现VPN的功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!