跳板机
出于安全等因素的考虑,我们一般不会把所有服务器都设置成可 SSH 直连,而是会通过一台机器作为跳板机,跳板机就相当于大门,你想要连接其他服务器的时候,必须要先穿过大门。先通过 SSH 登录到跳板机,再从跳板机登录到目标服务器。
假设
假设在某个机房中,我们用机器 A 来代表目标服务器,该服务器不能 SSH 直连,只能通过跳板机连接,用机器 B 来代表跳板机,我们是可以 SSH 直连跳板机的。
我们先把自己电脑上的 SSH 的 public key 拷贝到跳板机以及目标服务器的 .ssh/authorized_keys
文件里,这样我们理论上可以无密码登录了。
我们尝试:
ssh -u username@B
然后再从跳板机登录到目标服务器
ssh -o "PasswordAuthentication no" username@A
参数 -o "PasswordAuthentication no"
表示不使用密码登录
但是结果是
Permission denied(publickey,password)
这是因为 SSH 的 key 登录是要 public key 和 private key 成对存在的,虽然 public key 已经拷贝到了目标机器,但是当我们已经登录到跳板机上即机器 B 上时会向机器 A 也进行 SSH 登录,而跳板机上并没有我们自己机器的 private key。
可以如果我们把自己电脑的 private key 复制到跳板机上的话,那其他登录到跳板机上的人就可以拿到我的 private key 了,这是不安全的。
这个时候我们需要通过 SSH 的 agent forwarding
来解决。
解决方法
回到我们自己的机器上,进行命令
eval $(ssh-agent)
ssh-add
登录到跳板机
ssh -A username@B
-A 参数表示开启 agent forwarding
从跳板机登录到目标机器
ssh username@A
这样就可以从跳板机登录目标机器了,原因就是我们开启了 agent forwarding。
数据流向
当我们在跳板机上 SSH 登录目标机器时,目标机器会要求跳板机用对应的 SSH 的 private key 做认证,但是跳板机没有我们自己电脑的 private key,但是又因为我们从自己的电脑 SSH 登录到跳板机的时候启用了 agent forwarding,所以跳板机会把认证请求转发给我们自己的电脑。我们自己的电脑在收到这个请求的时候,就会在 shh-agent 进程进行认证,又因为我们已经通过 ssh-add
命令将我们的 private key 加到了 ssh-agen
t 中,所以认证会成功。最后我们机器把认证结果传回给跳板机,跳板机再把结果转回给目标机器,这样就完成了在跳板机没有我们的 SSH 的 private key 的情况下,还是能够成功登录目标机器。
另一种方法(简写)
回到我们自己的机器上,执行命令
ssh -J username@B username@A
一条命令就可以直接登录到目标机器。
参数 -J 是用来指定跳板机的,SSH 会帮我们先登录到跳板机,然后再登录目标机器。