网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
大家好,我是半虹,这篇文章我们介绍一下 SSH
1、简介
SSH 全称 Secure Shell,本质上是建立在应用层之上的网络传输协议
通过加密和认证机制保证传输安全,经常用于远程登录或者远程访问
除此之外,SSH 也能完成端口转发、安全文件传输等一系列实用功能
SSH 协议的实现有很多,目前应用最为广泛的莫过于 OpenSSH
这是很多 Linux 的默认实现,一般来说,系统都已经默认安装好
如果因为某些原因尚未安装,那么你也可以通过以下命令安装嘞
apt install openssh-server openssh-client
OpenSSH 实际包括两部分,分别是 ssh 服务端以及 ssh 客户端
之后,可以通过以下命令检查应用的安装情况:
ssh -V
然后,可以通过以下命令检查服务的开启情况:
service sshd status # 最后的 d 代表 daemon,意思是【守护进程】,该进程由服务端管理
# 开启服务:service sshd start
# 关闭服务:service sshd stop
# 重启服务:service sshd restart
如果你已经安装好 OpenSSH,那么下面我们一起来看看 SSH 的一些典型应用
具体可分为三点,下面三个小节逐一进行介绍:
- 远程访问,对应第二个小节
- 端口转发,对应第三个小节
- 文件传输,对应第四个小节
2、远程访问
远程访问是 ssh 的重要应用之一,其允许本地主机访问并操作远程主机
通过本地的 ssh 客户端连接远程的 ssh 服务端之后就能在上面执行任务
为了保证安全,客户端连接服务端时,需要进行认证
认证方式常用的有两种,分别是密码认证和密钥认证
密码认证简单来说就是通过账号密码认证后才能登录
这种方式使用起来比较简单,只需要一条命令就可以,其具体格式如下:
ssh <user>@<ip> -p <port>
# <user>:代表服务端主机上需要登录的用户名,如果为空,那么默认为 本机用户名
# <ip> :代表服务端主机的地址
# <port>:代表服务端主机上需要连接的端口号,如果为空,那么默认为 22
执行命令后,就会要求输入服务端对应该用户的密码,若输入正确即可完成登录
这里需要注意的是这条命令是在客户端上执行,同时要求服务端已开启服务才行
密钥认证也称免密登录,同样也是通过上述命令进行连接,但是却无需输入密码
这种方法自然也要凭证来证明连接者的身份,只不过凭证由公私钥技术提前生成
具体配置步骤如下所示:
- 本地客户端:生成公钥和私钥对
ssh-keygen -t rsa # -t 表示使用的算法类型,这里使用的是 rsa 非对称加密算法
执行命令后,要求输入相关信息,例如:密钥保存路径、私钥口令短语等等
若一路回车,默认会在 ~/.ssh
下生成 id_rsa
私钥和 id_rsa.pub
公钥
2. 本地客户端:传输公钥给服务端
ssh-copy-id <user>@<ip> -p <port>
执行命令后,输入密码就能传公钥到远程 ~/.ssh/authorized_keys
目录
之后使用 ssh 登录时,自动用密钥做验证,无需再次输入密码
3、端口转发
所谓端口转发,实际上就是将发送到一个端口上的数据转发到另一个端口
这在日常开发中也是一个十分常见的需求
端口转发通常可以分为三种,分别是本地转发、远程转发、以及动态转发
这里所用到的命令还挺复杂,不过别怕,下面会进行详细的分析以及总结
本地转发指的是将发送到本地端口的请求转发到远程端口
通常用于远程端上存在有某个服务,本地主机想进行访问,命令格式如下:
ssh <服务端用户>@<服务端地址> -p <服务端端口> -L <绑定地址>:<绑定端口>:<目标地址>:<目标端口>
首先需要说明的是,上述命令是由客户端执行,这里其实是理解转发链路的关键之一
这个命令看起来还挺复杂的,但其实我们可以拆分开来看,分成两个部分:
ssh <服务端用户>@<服务端地址> -p <服务端端口>
-L <绑定地址>:<绑定端口>:<目标地址>:<目标端口>
第一部分跟上一小节的远程访问一样,先建立客户端与服务端连接的隧道
第二部分是本地转发的关键配置所在,将绑定端口上的请求转到目标端口
- 绑定端口:是指客户端上所绑定的端口【重点】
- 目标端口:是由服务端进行转发的目标【重点】
一句话概括本地转发的转发链路如下:
客户端绑定的端口收到请求时,通过隧道发送到服务端,再由服务端转发到目标端口【重点】
|--------------| |--------------| |-----------|
| 客户端的地址 |------->| 服务端的地址 |------->| 目标地址 |
| 所绑定的端口 |------->| 服务端的端口 |------->| 目标端口 |
|--------------| |--------------| |-----------|
隧道 转发
实际怎么做本地转发呢?这里举一个例子:
一般来说,云服务器只默认开放 22
端口,但是假设现在 7777
端口运行着一个服务
如果本地要临时访问,则需先修改防火墙,比较麻烦,这时候就可以配置个本地转发
ssh <云服务器用户>@<云服务器地址> -p 22 -L 127.0.0.1:8888:127.0.0.1:7777
# 以上命令在本地主机执行,此时客户端是本地主机,服务端是云服务器,目标地址是 127.0.0.1,也即云服务器 7777 端口
#
# 执行之后,本地主机访问 127.0.0.1:8888 即可访问云服务器 7777 端口
# 特别说明,关于绑定地址的设置,通常是 127.0.0.1 或 0.0.0.0
#
# 如果设置 127.0.0.1,则只允许本机的连接;设置为 0.0.0.0,才会监听所有 IP 的连接
#
# 因为这里的绑定地址是在客户端,即本地主机,后续接收的请求也是来自本地主机,所以设置为 127.0.0.1 就可以
远程转发则是指将发送到远程端口的请求转发到本地端口,这与本地转发的概念相反
通常用于本地端上存在着某个服务,远程主机想进行访问,命令格式如下:
ssh <服务端用户>@<服务端地址> -p <服务端端口> -R <绑定地址>:<绑定端口>:<目标地址>:<目标端口>
上述命令同样是由客户端负责执行,这点首先要理解清楚
下面还是将该命令拆解成两个部分来分析:
ssh <服务端用户>@<服务端地址> -p <服务端端口>
-R <绑定地址>:<绑定端口>:<目标地址>:<目标端口>
第一部分与本地转发是完全一模一样,先建立客户端与服务端连接的隧道
第二部分是远程转发的关键配置所在,这是与本地转发最大的不同:
- 绑定端口:是指服务端上所绑定的端口【重点】
- 目标端口:是由客户端进行转发的目标【重点】
一句话概括远程转发的转发链路如下:
服务端绑定的端口收到请求时,通过隧道发送到客户端,再由客户端转发到目标端口【重点】
|--------------| |--------------| |-----------|
| 服务端的地址 |------->| 客户端的地址 |------->| 目标地址 |
| 所绑定的端口 |------->| 客户端的端口 |------->| 目标端口 |
|--------------| |--------------| |-----------|
隧道 转发
还是举一个例子来说明怎么配置远程转发,这里有一个经典的场景:
假设你需要在家里访问公司内网的服务器,并且你现在有一台外网的服务器,怎么办
很简单,其实就是配置远程转发,这也是我们说的做了个内网穿透
ssh <外网服务器用户>@<外网服务器地址> -R 0.0.0.0.8888:127.0.0.1:22
# 以上命令用内网服务器执行,此时客户端是内网服务器,服务端是外网服务器,目标地址是 127.0.0.1,也即内网服务器 22 端口
#
# 执行之后,家里的电脑使用 ssh 连接外网服务器 8888 端口,即可连接内网服务器 22 端口
# 需要注意,这里的绑定地址设置是 0.0.0.0
#
# 因为绑定的地址是服务端,即外网服务器,但后续接收的请求是来自家里电脑,不是同一台主机,所以需要设置为 0.0.0.0
#
# 这时还要修改服务端上的 ssh 配置文件 `/etc/ssh/sshd\_config`,加上 `GatewayPorts yes`,并重启 sshd 服务后才能生效
最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
7)]
给大家整理的电子书资料:
[外链图片转存中…(img-XO67u4vQ-1714786849198)]
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!