事情是这样的,单位的网络出国线路比较不稳定,ssh连接服务器经常超时,于是打算通过国内的VPS中转一下,这就涉及一个安全问题,我的服务器都是仅使用私钥(priv key)登陆的,但是把私钥保存在中转机上实在不是什么好主意,在Linux下我们有ssh-agent,然而我日常使用的是Windows 10,怎么办呢?
一个办法是用cmder让ssh-agent在后台运行,不过嫌麻烦,pass。后来发现Xshell自带一个Xagent组件,其实就是一个图形界面化的ssh-agent了,用起来挺方便,就记录一下。
首先你的私钥需要在Xshell的密钥管理器里,然后打开中转机的属性-SSH,勾选“使用密码处理的Xagent(SSH代理)”和“Xagent自启动”,这样登陆服务器时就会自动启动Xagent,并且转发你的所有私钥(可以在中转机上用ssh-add -L查看),后面的用法就和ssh-agent一样了。
如果你的只有一个私钥,到这里就结束了。然而我到这里并没完,因为我发现通过中转登陆某些服务器的时候很顺利,另一些就会报Too many authentication failures。原来Xagent会转发本地所有的私钥,通过中转机连接时,会按照字母顺序挨个尝试,但是服务器在一定次数的失败之后就会拒绝连接(在/etc/ssh/sshd_config里有一项MaxAuthTries定义了这个次数,Ubuntu默认好像是6),然而我每个服务器用的公钥都是不一样的,结果就是我的前6个私钥对应的服务器可以连接,后面的就都Too many authentication failures了。
有没有办法解决呢?Netsarang官方手册里说解决办法是让服务器共用公钥(pub key),以减少私钥个数,要么把MaxAuthTries改大。这样当然可以,然鹅,不够优雅,怎么能所有服务器都用同一个key嘛!费了一番功夫之后我找到了这个,于是这个问题就解决啦。
方法是这样的,在中转机(我这里是Ubuntu 18.04)上建立ssh config文件,位置在~/.ssh/config,格式和之前Windows的一样,不过注意Linux下目录层级之间用/分隔,而Windows用\。把config权限改成600,要登陆的服务器的pub key(重要的事情说三遍,pub key,pub key,pub key,pub key不需要保密所以放在服务器上也无所谓了,如果用priv key那就不折腾Xagent了)也都复制到~/.ssh,权限也改成600,同时Xshell中的私钥、config文件内容、pub key文件名三者要统一,然后所有的服务器在中转机上都可以使用别名免密码登陆了。原理是这样的,Xagent会转发所有私钥到中转机,在中转机上使用ssh连接服务器时,会读取config文件,找到对应的key(我们已经转发了这个私钥,但是这个key文件不可以不存在,所以必须把公钥文件拷过去,非公钥的文件也是不行的)并用它登陆。
顺带,Xagent还有另一个坑,如果启动了Xagent(比如连接中转机),会禁用指定的私钥,如果你的中转机使用的私钥比较靠后,那么连中转机的时候就直接Too many authentication failures了。解决方法也很简单,把中转机用的私钥名字前面加一个英文感叹号“!”,把它手动置顶╮(╯_╰)╭另外Xagent界面里每个key都有一个开启和关闭的选项,研究了一下,就是开启状态时使用不需要输入pass phrase,关闭状态时使用需要用pass phrase开启。
p.s.使用Xshell的SSH隧道可以实现另一种方式的中转,区别在于Xagent在中转端储存服务器信息,SSH隧道在本地储存服务器信息,具体参考这篇文章。
文章评论