如何无视跳板机?

2013-07-26 22:11:49 +08:00
 lequiet
公司连上远程游戏服需要先ssh登到跳板机,再在跳板机上ssh到远程,不能直连,如:
自己的系统(Mac OS) ===> 跳板机 ===>远程服务器

1. 跳板机和远程服务器是Linux,远程服务器有python 2.5(太旧了)
都有ssh、scp,但远程服务器不能用ssh、scp连到跳板机。跳板机不能用ssh和scp连到自己的
系统。也就是说只能正向不能反向。
2. 自己的系统有perl 5.1、python 2.7.5、ssh、scp等各种UNIX必备。
3. 跳板机能用的命令不多,能访问的目录只有自己的home目录。
4. 远程服务器有运维监控着,不能乱搞乱开监听端口开服务。

困难
====
现在的效率比较低的是,有很多的批量可以做的事,比如在N台服务器执行一样的一系列命令,
传文件N个这些服务器,从N个服务器拉特定的日志文件等,因为隔着一台跳板机,不能很轻易的
在自己的系统上搞个脚本自动执行这些重复繁琐的任务。

目前的解决方案
==========
secureCRT脚本。
用secureCRT的Session会话可以一键点击连到远程服务器,secureCRT脚本还可以调用这些预建好的Session自动打开Session然后做跑一些命令(并能自动输入密码)。
但是有时候用得很吃力,有时要打开远程服务器的Session去做,有时如果涉及多个远程的Session,为了不打开太多,就用跳板机的Session用ssh连各个服务器执行各个远程服务器的命令。
传文件也是,比如上传一个文件,secureCRT脚本要执行本地的scp传到跳板机,然后打开跳板机的Session,执行scp拷到远程服务器。

虽然已经封装好了很多函数,用起来比较方便了,但还是免不了打开这个那个Session,在这个那个Session里执行各种命令的状况。

所以想简化这个过程,“绕过”这个跳板机。在本地写脚本,能操作到远程的服务器并执行一些命令。(既然跳板机可以ssh命令到远程服务器执行一个命令就收工,那本地系统上可以用ssh命令到跳板机执行 [前面那段ssh到远程服务器执行命令的命令] ?但这貌似有点复杂,尤其是两次都要输密码,甚至执行的命令本身也要输密码并且又考虑安全的情况下)

寻找解决方法
==========
网上找到了fabric和(R)?ex, 前者是Python实现的,后者是perl实现的。但貌似两者只有在“直连"服务器时才能用,猜测也是在实现了ssh命令的连上某服务器执行命令的功能基础上做了封装。

貌似ssh有本地端口转发,但不太会用,不知能不能结合上fabric或者Rex,在不在跳板机和远程服务器作太多“手脚”的情况下,完成本地和远程方便的交互。
17291 次点击
所在节点    程序员
62 条回复
phuslu
2013-07-26 22:17:28 +08:00
socat
pubby
2013-07-26 22:33:14 +08:00
楼主描述太长了,可能理解不太精确。

3个方案:
1. 能否在跳板机上映射一个端口,或者为每个远程服务器分别映射一批端口
比如 10022 -> server1:22
10122 -> server2:22
本地只要连跳板机的 10022端口就相当于连到了server1的22端口

2. 本地用ssh直接映射端口到本地
ssh -fN -L 10022:<server1>:<server1_port> -p <跳板port> <跳板user>@<跳板ip>
ssh -fN -L 10122:<server2>:<server2_port> -p <跳板port> <跳板user>@<跳板ip>

然后 ssh -p 10022 <server1_user>@localhost 就能连到server1
ssh -p 10122 <server2_user>@localhost 就能连到server2

3. 跳板机上架设socks5 proxy服务器(即使有密码也不太安全)
ssh -o "ProxyCommand nc -x <跳板ip>:1080 %h %p" <server1_user>@<server1_ip>
lequiet
2013-07-26 23:03:11 +08:00
@pubby 是啊,对网络这块不太熟。
3方案明显是不行的,跳板机曾经只能用ssh和scp,连自己目录的东西都不能删,只是最近才开放了点但估计架个服务器是不太现实的了~也不符合不动跳板机的原则。
1方案是否需要被映射的端口常开?能不能只是为了某次特定的任务开一下,然后执行完就关掉?
2方案看着可行噢,就是想知道这个本地端口映射,在跳板机上与两边的是做怎样的连接的?是不是跟普通的ssh长连接没什么区别,然后不可能被运维监控到?
lequiet
2013-07-26 23:05:04 +08:00
@phuslu 查了一下,貌似很高端啊~
reusFork
2013-07-26 23:07:44 +08:00
用expect可以自动输入密码,这样最后那个方法就可行了
reusFork
2013-07-26 23:10:58 +08:00
http://stackoverflow.com/questions/4780893/use-expect-in-bash-script-to-provide-password-to-ssh-command
这里有几个方法,不止expect
不过跳板机应该装不了软件吧,所以还是expect现实
pubby
2013-07-26 23:26:04 +08:00
@lequiet
方案2就是
本地用ssh连跳板,并且做了一系列端口映射规则,可以理解为一个通道
localhost:10022 ---> server1:server1_port

于是在你看来,连localhost:10022就相当于连上 server1:server1_port了

这个方法我经常用来rsync同步一些文件到机房内网的某台服务器。


方案3我也经常用,用来连接一些美国的vps,因为美国的vps多数比较慢,但是还是能找一台比较快(ping <200ms)的做proxy,再通过它连其他vps就快很多了。
pubby
2013-07-26 23:27:56 +08:00
至于输密码,服务器太多,输密码太痛苦了,用证书吧。
lequiet
2013-07-26 23:29:10 +08:00
@reusFork 3Q. 关键是expect在哪执行? 本地和跳板机都有expect但远程服务器没有。在本地执行的话,expect要写跳板机密码、远程服务器密码、远程主机执行某些命令所需的密码,有点烦,不过应该用熟了可以克服~
pubby
2013-07-26 23:29:57 +08:00
@lequiet
方案3其实也是可行的,既然跳板机ssh能用,那就能利用ssh在本地映射一个socks5代理端口,把跳板机当代理用的。
pubby
2013-07-26 23:31:53 +08:00
就像这样:
ssh -fN -D0.0.0.0:1080 -p <跳板port> <跳板user>@<跳板ip>

ok, localhost:1080就是一个socks5代理了,数据自动走跳板机出去的
lequiet
2013-07-26 23:34:45 +08:00
@pubby 关键是我们只是客户端开发+服务端少量开发。不是运维不能想怎么搞怎么搞,也不能保证我们配在服务器上的配置运维同学会帮你留着,所以才想一些能在本地放的脚本和配置,在现有的环境下去自动化地操作远程服务器完成我们自己需要经常操作的东西,但不需要像运维那么正式繁琐,只想找些简单快捷clean的方案。
reusFork
2013-07-26 23:34:53 +08:00
@lequiet expect都是在本地执行,跳板机没有也没问题,它相当是模拟了你的键盘输入
reusFork
2013-07-26 23:37:24 +08:00
http://blog.51yip.com/linux/1462.html 看下这个,看能不能用上吧
pubby
2013-07-26 23:38:00 +08:00
@lequiet 除了证书需要在服务器导入(或者用reusFork的方法看能不能简化输入),方案2、3都不需要去改跳板或者服务器的啊
lequiet
2013-07-26 23:44:05 +08:00
@pubby 3没听太懂,2我觉得可以去试下,只是自己不太理解这个通道是怎么样的细节~
lequiet
2013-07-26 23:54:28 +08:00
@reusFork 嗯谢谢,那篇文章可以去看下。expect我的secureCRT脚本就有调用到,深入研究下的话可以达到想要的目的,只是感觉过个跳板机写起来有点烦。所以想采用 @pubby 的方式把原来两层的ssh变成一层,然后用fabric或者(R)?ex这类用python/perl脚本的运维自动化工具去实现那些重复性任务,因为用shell实在是太痛苦了作为一门编程语言的话。
pubby
2013-07-27 00:18:52 +08:00
@lequiet 比如一个rsync同步脚本

#!/bin/sh
MAPPED=`sockstat -4l|grep :10022`

if [ "X$MAPPED" = X ] ; then

echo "Frist ,we need map remote ssh port to local via ssh,input password:"
#跳板机passwd
ssh -fN -L 10022:<server_ip>:<server_port> -p <跳板ssh port> <跳板user>@<跳板ip>
fi

echo "Start sync ...."

rsync -ave "ssh -p 10022" /local-data-path/ <server_user>@127.0.0.1:/remote-data-path/

# 需要输入服务器密码
summic
2013-07-27 00:22:40 +08:00
lz安全第一,效率可以一起探讨,很多东西大家都有很好的解决方案,或者可以分机63979找我交流
lequiet
2013-07-27 00:38:05 +08:00
@pubby 确实可以两层ssh变一层了的感觉,假如要输密码的,那第一个ssh -fN那个,需要输两次密码吗?如果是,那后面那个rsync用到的ssh -p 10022,还需要输密码不?执行完某个任务(比如你的rsync同步任务)需要不需要把第一步建立的ssh通道干掉?

如果需要密码,“ssh -fN -L 10022:<server_ip>:<server_port> -p <跳板ssh port> <跳板user>@<跳板ip> ” 可以用expect来自动输(安全再考虑)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/77090

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX