在管理外网服务器时,出于安全等因素的考虑,咱们通常不会把全部服务器都设置成可ssh直连,而是会从中挑选出一台机器做为跳板机,当咱们想要链接外网服务器时,咱们要先经过ssh登陆到跳板机,再从跳板机登陆到目标服务器。安全
下面咱们用实验来展现一下跳板机的登陆流程。服务器
在该实验中,咱们用机器192.168.57.3来表明目标服务器,该服务器不能ssh直连,只能经过跳板机链接,用机器192.168.56.5来表明跳板机,该跳板机能够用ssh直接链接。微信
为了方便测测试,咱们先把咱们本身电脑上的ssh的public key拷贝到跳板机及目标服务器的.ssh/authorized_keys文件里,这样咱们就能够无密码登陆了。ssh
下面是测试流程:测试
$ ssh u3@192.168.56.5 Last login: Sun Sep 8 19:51:48 2019 from 192.168.56.1 u3@h3:~$
u3@h3:~$ ssh -o "PasswordAuthentication no" u2@192.168.57.3 u2@192.168.57.3: Permission denied (publickey,password).
该命令中的参数 -o "PasswordAuthentication no" 表示不使用密码登陆。spa
由于咱们已经把咱们电脑上的ssh的public key拷贝到目标机器的.ssh/authorized_keys文件里了,理论上来讲,应该是能够登陆成功的,但上面的命令却显示登陆失败,哪里错了呢?code
其实很简单,ssh的key登陆是要public key和private key成对存在的,虽然public key已经拷贝到了目标机器,但咱们此时是在跳板机上,而跳板机上并无咱们本身机器的private key。进程
那咱们把private key拷贝到跳板机能够不?it
不行,由于private key一旦拷贝到跳板机,那其余能登陆到跳板机的人就均可以拿到咱们的private key了,这很是不安全。io
那怎么办呢?
这个问题其实能够经过ssh的agent forwarding来解决,咱们先看下具体操做,而后再讲解其工做原理。
咱们先退回到本身的机器上,而后执行如下流程:
$ eval $(ssh-agent) Agent pid 8350 $ ssh-add Identity added: /home/yt/.ssh/id_rsa (yt@arch) Identity added: /home/yt/.ssh/id_ed25519 (yt@arch)
$ ssh -A u3@192.168.56.5 Last login: Sun Sep 8 21:13:01 2019 from 192.168.56.1 u3@h3:~$
u3@h3:~$ ssh u2@192.168.57.3 Last login: Sun Sep 8 20:45:03 2019 from 192.168.57.4 u2@h2:~$
由上可见,此次从跳板机登陆目标机器是成功了的,缘由就是咱们开启了agent forwarding,但它是怎么帮助咱们从跳板机上登陆目标机器的呢?
当咱们在跳板机上ssh登陆目标机器时,目标机器会要求跳板机用对应的ssh的private key作认证,但跳板机是没有这个key的,这个key保存在咱们本身的电脑上,又由于咱们在从本身的电脑ssh登陆跳板机时开启了agent forwarding,因此跳板机会把该认证请求转发给咱们本身的电脑,咱们本身电脑在收到这个认证请求时,会找ssh-agent进程进行认证,而又由于开始的时候,咱们经过ssh-add命令将咱们的private key加入到了ssh-agent中,因此,这次认证是成功的,咱们的机器把认证结果再转给跳板机,跳板机再将该结果转给目标机器,就这样,在跳板机没有咱们的ssh的private key的状况下,登陆目标机器仍是成功了。
这个就是跳板机的登陆流程,不过,这只是一种最基本的方式,其实还有更简单的方式,咱们仍是用实验看下。
仍是先退回到咱们本身的机器,而后执行下面的命令:
$ ssh -J u3@192.168.56.5 u2@192.168.57.3 Last login: Sun Sep 8 21:09:13 2019 from 192.168.57.4 u2@h2:~$
喔,竟然用一条命令就直接成功了,根本就没有经历从跳板机到目标机器的过程。
该命令中的-J参数是用来指定跳板机的,该命令执行后,ssh会帮咱们先登陆跳板机,而后再登陆目标机器,一切都是自动的。
用-J参数指定跳板机还有一个好处就是在使用scp拷贝文件时更加方便。
若是是普通方式,咱们要先将文件拷贝到跳板机上,再从跳板机上拷贝到目标机器,很是麻烦,若是使用-J参数,咱们用一条命令就能够搞定了。
$ scp -J u3@192.168.56.5 abc.txt u2@192.168.57.3:/home/u2/ abc.txt
完美!
有关ssh跳板机的知识就讲到这吧,但愿对你们有所帮助。
完。
更多原创文章,请关注我微信公众号: