美文网首页
pod里使用证书连接其他服务器

pod里使用证书连接其他服务器

作者: shark_tear | 来源:发表于2021-08-25 22:42 被阅读0次

今天在处理工作任务的时候遇到了需要在pod里连接其他服务器的需求,正常来说,只需要将证书文件挂载到Pod里面,然后直接通过ssh连接即可。但是今天遇到了一些问题并且成功解决,下面把问题和解决方案和大家分享一下。

问题1,连接确认问题

在第一次通过ssh连接一个新的服务器的时候,通常会看到这样的提示:

The authenticity of host '172.16.17.219 (172.16.17.219)' can't be established.
RSA key fingerprint is 04:e9:4d:ce:e7:84:08:6d:7d:3a:db:d3:42:3f:f4:90.
Are you sure you want to continue connecting (yes/no)?

即让你确认是否继续连接,在手动执行ssh连接的时候,直接输入yes即可。但是在pod里面执行自动脚本,该怎么输入这个东西呢?经过搜索找到的方案是,在执行ssh的命令之前,先执行

ssh-keyscan  domain.com >> ~/.ssh/know_hosts
或
ssh-keyscan  172.16.17.219 >> ~/.ssh/know_hosts

即通过ssh-keyscan这个命令先扫描一下这个域名或者ip地址,获取到公钥信息,然后将机器信息和公钥信息保存到~/.ssh/known_hosts文件里,这样再通过ssh连接的时候就不会遇到这个问题了,一般情况下这个问题基本上都能解决。但是今天刚好遇到的不是标准问题。

问题2,非标准端口和非标准协议

就像上面说的,非标准问题才是不长久的,遇到了才有挑战,这两个小问题也花费了我将近2个多小时的时间。

首先是非标准端口的问题,在正常的ssh连接的时候,使用的是22号端口,而非标准端口则比较随便了。所以在遇到了提示

port 22: connection refused

的时候,就应该知道是非标准端口,这个时候,只需要将上面的命令改成下面的样子:

ssh-keyscan -p port 172.16.17.219 >> ~/.ssh/know_hosts

将上面命令里的port换成你需要连接的服务器端口即可。还有一种特殊情况需要用到非标端口的是gerrit服务器,gerrit服务器是一个集合git代码管理和代码审计的工具,它的默认端口是29148,因此在进行连接的时候需要使用这个选项。

再看非标准协议,在我们日常管理服务器时,给服务器配置的公私钥都是使用命令:

ssh-keygen

然后一路敲回车来生成的,这个命令默认使用的密钥加密协议是rsa。而在一些安全要求比较高的服务器上,可能会使用其他协议,例如ed25519dsa等非标准协议。这个时候你可以在你的主机上首先执行:

ssh 172.16.17.219

这个命令,然后输入yes,此时默认就会在~/.ssh/know_hosts`文件里保存一条这个主机的连接信息,格式如下:

172.16.17.219 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDf1RUJc36P1GTCBeTGd6RIMVkoPamdlkPpFGYC/LGGBqv7rVHXiTUTO6ahpiSFxoZQ6++h/ED4w5QwIc+ZOxxxxxxxxxxxxxxxxxxxxxxxxxxxxpe5ymsecLujLgpQ4AUK6XdUSosvJVjxTYuDfBXWkXZ1tmOIPuf54wgC9L4/RTlNRi2rLDw36OMUiqr/BMCV1Uy6qF8zRAvImKcWx5YdXM58v5pySBHQzXh66IDCYcv4XG5gtJf9yw8s3p7gSQ56foInvdXmamczB0JnAlglIMG7jDfoAmHAIKZas/Xpa5qNEFbDdCUqK3dNOkMpcdFrTCGN17bdX

这个信息里面第一项是IP地址,第二项就是它使用的协议名称,第三项就是主机的公钥。这样就可以知道你要连接的主机使用的协议是什么类型。然后在ssh-keyscan命令里使用-t选项加上协议名称,就能为你生成上面的主机信息,命令用法如下:

ssh-keyscan -t  protocol_name -p port  domain.com >>~/.ssh/known_hosts

protocol_name就是协议名称,port是非标准端口,domain.com是要连接的主机域名或者IP地址。
示例如下:

ssh-keyscan -t ed25519 -p 29418 172.16.17.219 >> ~/.ssh/known_hosts

这样才能保证正确保存远程主机的连接信息。

ssh-agent加载导入的私钥信息

上面的信息都生成正确了以后,在实际的pod里执行脚本,还是报错,报错如下:

Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights

提示权限被拒绝,这是因为ssh-agent还没有加载新导入的私钥信息,在进行连接的时候报错。让ssh-agent加载私钥的方式是:

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

第一个命令是获取ssh-agent信息,第二个命令是在ssh-agent中加载新的私钥信息。加载完成后,就可以正常连接远程服务器了,包括使用git来克隆ssh:\\开头的代码仓库。

上面第一条命令必须要用eval来执行,如果只是使用ssh-agent -s来执行,会报下面的错误:

Could not open a connection to your authentication agent.

原因未知,等搞明白了再更新。今天就写这么多,明天把gitlab ci/cd任务完成后,再总结一波更新。

相关文章

网友评论

      本文标题:pod里使用证书连接其他服务器

      本文链接:https://www.haomeiwen.com/subject/yooeiltx.html