SSH通过跳板机连接服务器

近日在做SDN相关的工作,在使用NCL的相关Testbed,其集群环境是相对封闭的,想要连入每一台机器需要首先连接一台共用跳板机,但这样很不方便。而且跳板机是没有开放ROOT权限的,所以相关的配置,包括转发X11等种种需求都不能很好的实现。

为了解决这种问题,有很多的方案,在查阅了很多网络资料后,我总结了几个我觉得很有帮助的跳板机相关的技巧。

利用SSH转发端口的能力

众所周知,SSH具有不错的轻型端口转发能力,甚至是通道能力,这是一个不错的属性,你可以直接通过跳板机直接转发远程主机的端口来满足你的绝大部分需求。比如我们需要连接远程主机的SSH可以直接

1
2
3
ssh -L 2222:<remote-host>:22 user@<jump-server>
# 该命令语法为
# ssh -L local-port:remote-address:remote-port user@ssh-host

即为将remote-host的22端口,通过jump-server转发到本地(运行这条命令的机器)的2222端口

这里需要特别注意的一点是,remote-host是通过jump-server的身份去访问的,也就是说从remote-host角度看起来,所有的请求是由jump-server发起的。另一方面,remote-host的域名解析也是从jump-server的角度发起的,这很有利于集群中,集群的ip已经存储在了jump-server的hosts里的情况。另一方面,如果你想单纯把一台远程主机本体的端口转发到本地,可以直接用

1
ssh -L local-port:localhost:remote-port user@<ssh-host>

的方法。因为前面说了,remote-host的域名解析是在这里的ssh-host完成的,所以localhost就是ssh-host本身。

这种方法比较常用于存在防火墙,或者中间有跳板机的时候来转发端口,但是如果只是想通过跳板机登录远程主机,还有更简单的方法

一键通过跳板机连接

~/.ssh/ 这个文件夹里面存在着很多与ssh连接有关的配置文件(当然,默认情况下都是不生成的,只有新建后才会有效),比如我们的公私秘钥。同时,你还可以在这个文件夹下面新建config这个文件来配置各种奇葩的ssh连接需求。比如新建 ~/.ssh/config 并输入

1
2
3
Host <name>
User <user>
Hostname <host>

然后直接 ssh <name> 即可连接<user>@<host> 当然既然说他支持很多奇葩设置了,我们就可以用它来完成一键连接跳板机

1
2
3
4
Host <name>
User <remote-user>
Hostname <remote-host>
ProxyCommand ssh <ssh-user>@<ssh-host> nc %h %p 2> /dev/null

然后直接运行 ssh <name> 即可通过ssh-host作为代理直接连接remote-host,这是非常酸爽的,而且非常的干净,切不影响其他用户的使用(没有想上一个方法一样另起新的端口,并且配置文件仅对当前用户有效)

同时,在进行转发后,你的各种ssh相关的命令,甚至于scp都是可以正常工作的。而对于我,我可以清爽的通过 ssh <name> -X 来清爽的开启一个ssh链接并且启用X11转发。(这里特别指出,如果你先ssh到跳板机,再ssh到远程机器,X11是不能直接转发到你本机的!)

同时这里分享几个小技巧,这几个小技巧都是可以在这种代理链接的方法下正常使用的

挂载网络文件

1
sshfs <remote-host>:<file-path> /mnt -o idmap=user

通过这一条简单的命令,我们就可以把remote-host的file-path挂载到本机的mnt上,同时idmap是为了映射远程机器的用户和本机用户,这是一个很实用的功能

远程文件编辑

当然,很多时候你只是需要编辑一个远程服务器上的文件。没有问题,vim直接支持通过scp远程编辑文件

1
vim scp://<remote-host>/<file-path>

需要注意的是,在这种情况下,scp会首先把远程文件拷贝到本机的一个tmp目录里面,然后交给vim编辑,并在编辑完成以后再重新拷贝回远程服务器,vim中各种:pwd之类的命令显示的依旧是你本机的信息,这就意味着那些想让vim的各种插件利用远程资源的人可以洗洗睡了(比如自动补全,用的还是你本机的信息)

SSH SOCK5代理

如果上面的各种东西还是让你不爽,你就是想直接访问远程机器的各种资源。好吧,你可以选择直接用SSH开启SOCK5代理,这好像不是啥冷门技能,算是最快速的开代理的方式了

1
ssh -D 8888 user@host

这里8888是本机代理端口,用任何sock5的代理软件直接连接 localhost:8888即可。其实很多软件自己就可以访问sock5代理。关于性能,不用很担心,通道类的技术一般来说性能都还过得去,实测表示ssh代理算是非常快的了,毕竟没有那些臃肿的ACL等各种东西,就是个通道+SOCK5,但是这种链接不是很可靠,小用可以,长期请用正经的软件。另外,ssh存在链接超时的问题,网上一搜有很多解决方案。

更多信息,我这里贴个blog https://blog.tjll.net/ssh-kung-fu/#trivia-ecdsa-keys ,里面有一些本文没有提到的小技巧,可以看一下。