Linux实战笔记(六) SSH

最全的Linux教程,Linux从入门到精通

======================

  1. linux从入门到精通(第2版)

  2. Linux系统移植

  3. Linux驱动开发入门与实战

  4. LINUX 系统移植 第2版

  5. Linux开源网络全栈详解 从DPDK到OpenFlow

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

第一份《Linux从入门到精通》466页

====================

内容简介

====

本书是获得了很多读者好评的Linux经典畅销书**《Linux从入门到精通》的第2版**。本书第1版出版后曾经多次印刷,并被51CTO读书频道评为“最受读者喜爱的原创IT技术图书奖”。本书第﹖版以最新的Ubuntu 12.04为版本,循序渐进地向读者介绍了Linux 的基础应用、系统管理、网络应用、娱乐和办公、程序开发、服务器配置、系统安全等。本书附带1张光盘,内容为本书配套多媒体教学视频。另外,本书还为读者提供了大量的Linux学习资料和Ubuntu安装镜像文件,供读者免费下载。

华为18级工程师呕心沥血撰写3000页Linux学习笔记教程

本书适合广大Linux初中级用户、开源软件爱好者和大专院校的学生阅读,同时也非常适合准备从事Linux平台开发的各类人员。

需要《Linux入门到精通》、《linux系统移植》、《Linux驱动开发入门实战》、《Linux开源网络全栈》电子书籍及教程的工程师朋友们劳烦您转发+评论

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


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 @ -p

:代表服务端主机上需要登录的用户名,如果为空,那么默认为 本机用户名

:代表服务端主机的地址

:代表服务端主机上需要连接的端口号,如果为空,那么默认为 22


执行命令后,就会要求输入服务端对应该用户的密码,若输入正确即可完成登录


这里需要注意的是这条命令是在客户端上执行,同时要求服务端已开启服务才行


  

**密钥认证**也称免密登录,同样也是通过上述命令进行连接,但是却无需输入密码


这种方法自然也要凭证来证明连接者的身份,只不过凭证由公私钥技术提前生成


具体配置步骤如下所示:


1. 本地客户端:生成公钥和私钥对

 

ssh-keygen -t rsa # -t 表示使用的算法类型,这里使用的是 rsa 非对称加密算法

 执行命令后,要求输入相关信息,例如:密钥保存路径、私钥口令短语等等

 若一路回车,默认会在 `~/.ssh` 下生成 `id_rsa` 私钥和  `id_rsa.pub` 公钥
2. 本地客户端:传输公钥给服务端

 

ssh-copy-id @ -p

 执行命令后,输入密码就能传公钥到远程 `~/.ssh/authorized_keys` 目录

 之后使用 ssh 登录时,自动用密钥做验证,无需再次输入密码


  

#### 3、端口转发


所谓端口转发,实际上就是**将发送到一个端口上的数据转发到另一个端口**


这在日常开发中也是一个十分常见的需求


  

端口转发通常可以分为三种,分别是本地转发、远程转发、以及动态转发


这里所用到的命令还挺复杂,不过别怕,下面会进行详细的分析以及总结


  

**本地转发**指的是将发送到本地端口的请求转发到远程端口


通常用于远程端上存在有某个服务,本地主机想进行访问,命令格式如下:



ssh <服务端用户>@<服务端地址> -p <服务端端口> -L <绑定地址>:<绑定端口>:<目标地址>:<目标端口>


首先需要说明的是,**上述命令是由客户端执行**,这里其实是理解转发链路的关键之一


这个命令看起来还挺复杂的,但其实我们可以拆分开来看,分成两个部分:


1. `ssh <服务端用户>@<服务端地址> -p <服务端端口>`
2. `-L <绑定地址>:<绑定端口>:<目标地址>:<目标端口>`


第一部分跟上一小节的远程访问一样,先建立客户端与服务端连接的隧道


第二部分是本地转发的关键配置所在,将绑定端口上的请求转到目标端口


1. 绑定端口:是指**客户端**上所绑定的端口【重点】
2. 目标端口:是由**服务端**进行转发的目标【重点】


一句话概括本地转发的转发链路如下:


**客户端绑定的端口收到请求时,通过隧道发送到服务端,再由服务端转发到目标端口【重点】**



|--------------| |--------------| |-----------|
| 客户端的地址 |------->| 服务端的地址 |------->| 目标地址 |
| 所绑定的端口 |------->| 服务端的端口 |------->| 目标端口 |
|--------------| |--------------| |-----------|
隧道 转发


实际怎么做本地转发呢?这里举一个例子:


一般来说,云服务器只默认开放 `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 <绑定地址>:<绑定端口>:<目标地址>:<目标端口>


**上述命令同样是由客户端负责执行**,这点首先要理解清楚


下面还是将该命令拆解成两个部分来分析:


1. `ssh <服务端用户>@<服务端地址> -p <服务端端口>`
2. `-R <绑定地址>:<绑定端口>:<目标地址>:<目标端口>`


第一部分与本地转发是完全一模一样,先建立客户端与服务端连接的隧道


第二部分是远程转发的关键配置所在,这是与本地转发最大的不同:


1. 绑定端口:是指**服务端**上所绑定的端口【重点】
2. 目标端口:是由**客户端**进行转发的目标【重点】


一句话概括远程转发的转发链路如下:


**服务端绑定的端口收到请求时,通过隧道发送到客户端,再由客户端转发到目标端口【重点】**



|--------------| |--------------| |-----------|
| 服务端的地址 |------->| 客户端的地址 |------->| 目标地址 |
| 所绑定的端口 |------->| 客户端的端口 |------->| 目标端口 |
|--------------| |--------------| |-----------|
隧道 转发


还是举一个例子来说明怎么配置远程转发,这里有一个经典的场景:


假设你需要在家里访问公司内网的服务器,并且你现在有一台外网的服务器,怎么办


很简单,其实就是配置远程转发,这也是我们说的做了个内网穿透



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 服务后才能生效


  

最后介绍**动态转发**,动态转发可以理解成是特殊版的本地转发


通常用于本地主机想访问**多个**远程端服务或**未知的**远程端服务,其命令格式如下:



ssh <服务端用户>@<服务端地址> -p <服务端端口> -D <绑定地址>:<绑定端口>


上述命令同样**是在客户端执行**,也可分为两个部分:


1. `ssh <服务端用户>@<服务端地址> -p <服务端端口>`
2. `-D <绑定地址>:<绑定端口>`


第一部分与本地转发和远程转发一致,用于建立客户端与服务端之间的连接隧道


第二部分是转发规则的配置,在这里,只需配置绑定端口,而无需配置目标端口


这里的绑定端口是**指客户端上的端口**,这与本地转发一致【重要】


这里没目标端口,则是因为**转发目标由发起的请求所决定**【重要】


一句话概括动态转发的转发链路如下:


**客户端绑定的端口收到请求时,通过隧道发送到服务端,再由服务端转发该请求**


**服务端转发的请求就是客户端收到的请求,这样就能达到动态转发的效果啦**


例如,客户端收到的请求地址是 `hostA: portA`,则由服务端转发到 `hostA: portA`



|--------------| |--------------|
| 客户端的地址 |------->| 服务端的地址 |-------> 目标地址和目标端口
| 所绑定的端口 |------->| 服务端的端口 |-------> 由发起的请求所决定
|--------------| |--------------|
隧道 转发


写到这里,不知道大家有没有觉得哪里很奇怪,我们举个例子说:



假设现在本地绑定端口收到请求 :
然后这个请求通过隧道给服务端
最后再由服务端去转发这个请求 :,那么 : 就能收到

这些步骤都没有问题,可问题是 本地主机怎么才能让绑定的端口收到请求 :

举个具体的例子来说:
假如现在要访问百度,行,那么请求就是 百度地址:80,但是这样请求就直接发出去了,没有到绑定的地址和端口
如果想要到绑定端口也行,那么就只能是 127.0.0.1:绑定端口,这样就能通过隧道给服务端,服务端再去做转发
服务端转发了什么呢?由发起的请求决定 127.0.0.1:绑定端口,实际上就发给了自己,而且端口也是绑定的端口


就是说吧,很奇怪,问题在哪呢?


还是那个:本地主机怎么才能让绑定的端口收到请求 `<remoteHost>:<remotePort>`


这时就需要我们先在本地主机上**设置系统或应用代理**


使得发送到本地主机上的请求能先发送到绑定的端口 `127.0.0.1:绑定端口`


然后再通过隧道发送给服务端,并由服务端进行转发


举例来说,如果要在 macOS  设置系统代理,可参考:[官方文档]( )




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值