如何无视跳板机?

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,在不在跳板机和远程服务器作太多“手脚”的情况下,完成本地和远程方便的交互。
17380 次点击
所在节点    程序员
62 条回复
lequiet
2013-07-27 00:38:51 +08:00
@summic 分机号??!! 对于安全方面,你有什么好的建议或者注意事项指导一下?
summic
2013-07-27 00:50:03 +08:00
@lequiet 兄台不是跟张小龙混饭吃的?那我判断错了。这个安全体系的你要绕过去了不等于白做了么?你确信你做的比他们更安全更有效率么?脚本的分发和控制其实可以用私有协议加内部系统来解决
panzhc
2013-07-27 09:40:16 +08:00
网络连接用SSH代理,把跳板机当作代理;传文件用rzsz,隔多少层ssh都可以直接传文件。
lequiet
2013-07-27 10:26:34 +08:00
@summic 作为一个开发者,只是想让日常任务更自动化不太浪费时间在敲命令上,现在也不是想绕过去,而是在现在的基础上去自动化。对我而言,如果都能基于ssh,安全级别跟两次ssh连到服务器一样的话,就足够了。
lequiet
2013-07-27 10:29:33 +08:00
@panzhc 忘了说了~,自己机子属内网机,原则上不能上网,跳板机的访问权限也限于那些远程服务器,所以不太清楚跳板机作代理有什么更好的用途。 至于rzsz的话,在远程服务器、跳板机被禁用了。
arbeitandy
2013-07-27 19:29:29 +08:00
@pubby 一开始的方案3肯定是改动最少的方案
ssh的ProxyCommand并非在跳板机上启动一个服务,而是调用netcat或者直接用ssh的built-in netcat mode将两端的IO转发。

把tunneling的脚本改了一个用ProxyCommand版本的

#!/bin/sh
proxy_ncmode='ProxyCommand ssh -W %h:%p bastion_serv'
proxy_nc='ProxyCommand ssh bastion_serv nc -w 10 %h %p'
rsync -avze "ssh -o \"$proxy_ncmode\"" ./tmp/ trapped_me:~/tmp
ssh -o "$proxy_nc" trapped_me uptime
# -- end of script

* bastion_serv 是中间hop跳板机
* trapped_me 是只能从跳板机ssh接入的远程机 (生产环境?)
脚本里两个mode都实验了一下:
* proxy_ncmode 参数是使用 ssh 的netcat mode连接
* proxy_nc 参数是使用 跳板机上的netcat转发,如果跳板机没有netcat,就必须使用 proxy_ncmode模式了。 nc -w 10 表示进程idle10秒后自动断开。


比起tunneling来,这个ProxyCommand mode 不需要对不同远程server指定不同端口转发啦。
(万一生产环境有百来台server呢?)。但前提是远程server们没有做ip限制-如果万一它们只许可 跳板server ip登录,那就只能做端口转发 - 不过我觉得更有可能发生的是,中间跳板机做了防火墙限制端口。。so, 用哪种方法其实要看运气。

* 无密码登录和连接方式是两个不同的问题,搜索一下 key-based authentication吧。
假设没有使用公钥验证,用任何方式连接都要输入两次密码。从安全角度看,那还不如尽快启用公钥认证模式。

这一切都可以配置在 .ssh/config 里

Host ec2main
Port 2255
Hostname 23.*.*.*
IdentityFile ~/.ec2/anotheradmin.pem
Host 192.168.*.*
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -NW %h:%p bastion_serv
Host trapped_me
Hostname 192.168.0.1
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -NW %h:%p bastion_serv
Host bastion_serv
Hostname *.*.*.*
Host *
User anotheradmin
ForwardAgent yes
Port 2244
IdentityFile ~/.ssh/id_rsa
UsePrivilegedPort no
ServerAliveInterval 240
ServerAliveCountMax 9999


# --- 这个问题我为毛要写这么详细呢, 因为曾为小公司SA, 真的非常非常想恳求大家别再用expect拉, 特别是千万别放在跳板机啊。
xdays
2013-07-27 19:35:12 +08:00
我知道的有两种方案:
1. fabric有个gateway参数,可以以类似proxy的方式通过跳板机在远程机器上批量执行命令,这个本人亲自验证过,只是fabric对这一点支持还不是很好,需要自己折腾。

2. 多重expect,仅觉得从原理上可行。

另外,楼主是不是蓝汛的呀
arbeitandy
2013-07-27 19:38:53 +08:00
http://pastebin.com/7qa7rp5i
回复中有格式的 ~/.ssh/config
ETiV
2013-07-27 21:16:28 +08:00
估计LZ被当成腾讯的了...
julyclyde
2013-07-27 23:36:16 +08:00
你们只能从跳板机ssh到其它机器吗?能不能 从跳板机到a然后再在a上ssh到b?
lequiet
2013-07-30 00:27:07 +08:00
@arbeitandy 哈哈你写得好详细,但是我看不懂,对我们来说,方便肯定是比安全考虑得更多啊。。expect我在跳板机上有调用过,但发现history里会有明文的,所以打算每跑一次脚本自动再rm ~/.bash_history, 不知还有别的地方会log我敲的命令不?
反过来说说,如果不想让大家太麻烦,就应该给我们开发的提供下方便,谁有空两一天到晚敲一串长长的scp,尤其是在找问题的时候。
lequiet
2013-07-30 00:31:14 +08:00
@xdays 不是啊,只是在家游戏公司做开发的
lequiet
2013-07-30 00:34:24 +08:00
@xdays 我了解过expect,应该是可行的只是嫌麻烦,它不比shell写起来累。有fabric这种东西能用上,肯定能省下不少时间调试shell啦。
9hills
2013-07-30 02:22:26 +08:00
在公司机器上搞个虚拟机,在这个里面做开发得了
janxin
2013-07-30 08:44:08 +08:00
为了安全起见,在区域内机器建立中央服务器就可以了
zz1956
2013-08-01 14:29:18 +08:00
ProxyCommand ssh 用户名@跳板机 exec nc %h %p 2 > /dev/null
peterlu
2013-08-01 15:05:35 +08:00
这根本不是技术问题啊,而是规则问题,如果你觉得这个规则不爽,那你可以提出来,否则就好好遵守,要不然你就跳槽到别的公司干。
这样通过技术手段突破,如果被发现了,最大的可能性就是被Fire。
lequiet
2013-08-02 23:17:05 +08:00
@peterlu 我没有说突破,更没说打破。只是想在的基础上简化自动化,并在别人(比如运维)看来还是遵守规则的。规则不好改,也总有不爽的规则存在不管在哪。把别人的一整套规则按着跑,自动化的跑这规则,并不算违反规则,低线我很清楚,也不怕那这个最大的可能性。相反,如果连让你很不爽的规则(不管是出于什么理由而存在的规则),都不去优化,不管是从跟源优化还是从表面上优化,那是不是表示着,已经完全没激情了,工作只为了混口饭吃?
yangxin0
2013-08-03 09:28:43 +08:00
小心8000给你打电话
xderam
2013-08-05 10:16:19 +08:00
@lequiet 呃,原来你是开发?我还以为是运维呢。这个,我感觉还是把自己的需求好好和运维哥们说说,毕竟提高生产效率的事也不是什么坏事,互相理解就好了。但如果单纯从技术层面解决的话,运维哥们可能会不太高兴的说--!

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

https://tanronggui.xyz/t/77090

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

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

© 2021 V2EX