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 服务后才能生效
最后介绍动态转发,动态转发可以理解成是特殊版的本地转发
通常用于本地主机想访问多个远程端服务或未知的远程端服务,其命令格式如下:
ssh <服务端用户>@<服务端地址> -p <服务端端口> -D <绑定地址>:<绑定端口>
上述命令同样是在客户端执行,也可分为两个部分:
ssh <服务端用户>@<服务端地址> -p <服务端端口>
-D <绑定地址>:<绑定端口>
第一部分与本地转发和远程转发一致,用于建立客户端与服务端之间的连接隧道
第二部分是转发规则的配置,在这里,只需配置绑定端口,而无需配置目标端口
这里的绑定端口是指客户端上的端口,这与本地转发一致【重要】
这里没目标端口,则是因为转发目标由发起的请求所决定【重要】
一句话概括动态转发的转发链路如下:
客户端绑定的端口收到请求时,通过隧道发送到服务端,再由服务端转发该请求
服务端转发的请求就是客户端收到的请求,这样就能达到动态转发的效果啦
例如,客户端收到的请求地址是 hostA: portA
,则由服务端转发到 hostA: portA
|--------------| |--------------|
| 客户端的地址 |------->| 服务端的地址 |-------> 目标地址和目标端口
| 所绑定的端口 |------->| 服务端的端口 |-------> 由发起的请求所决定
|--------------| |--------------|
隧道 转发
写到这里,不知道大家有没有觉得哪里很奇怪,我们举个例子说:
假设现在本地绑定端口收到请求 <remoteHost>:<remotePort>
然后这个请求通过隧道给服务端
最后再由服务端去转发这个请求 <remoteHost>:<remotePort>,那么 <remoteHost>:<remotePort> 就能收到
这些步骤都没有问题,可问题是 本地主机怎么才能让绑定的端口收到请求 <remoteHost>:<remotePort>
举个具体的例子来说:
假如现在要访问百度,行,那么请求就是 百度地址:80,但是这样请求就直接发出去了,没有到绑定的地址和端口
如果想要到绑定端口也行,那么就只能是 127.0.0.1:绑定端口,这样就能通过隧道给服务端,服务端再去做转发
服务端转发了什么呢?由发起的请求决定 127.0.0.1:绑定端口,实际上就发给了自己,而且端口也是绑定的端口
就是说吧,很奇怪,问题在哪呢?
还是那个:本地主机怎么才能让绑定的端口收到请求 <remoteHost>:<remotePort>
这时就需要我们先在本地主机上设置系统或应用代理
使得发送到本地主机上的请求能先发送到绑定的端口 127.0.0.1:绑定端口
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!
这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。
本份面试集锦涵盖了
- 174 道运维工程师面试题
- 128道k8s面试题
- 108道shell脚本面试题
- 200道Linux面试题
- 51道docker面试题
- 35道Jenkis面试题
- 78道MongoDB面试题
- 17道ansible面试题
- 60道dubbo面试题
- 53道kafka面试
- 18道mysql面试题
- 40道nginx面试题
- 77道redis面试题
- 28道zookeeper
总计 1000+ 道面试题, 内容 又全含金量又高
- 174道运维工程师面试题
1、什么是运维?
2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?
3、现在给你三百台服务器,你怎么对他们进行管理?
4、简述raid0 raid1raid5二种工作模式的工作原理及特点
5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?
7、Tomcat和Resin有什么区别,工作中你怎么选择?
8、什么是中间件?什么是jdk?
9、讲述一下Tomcat8005、8009、8080三个端口的含义?
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
10、什么叫CDN?
11、什么叫网站灰度发布?
12、简述DNS进行域名解析的过程?
13、RabbitMQ是什么东西?
14、讲一下Keepalived的工作原理?
15、讲述一下LVS三种模式的工作过程?
16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?
17、如何重置mysql root密码?
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-xEoc3Z1P-1712680803821)]