1
phuslu 2013-07-26 22:17:28 +08:00 1
socat
|
2
pubby 2013-07-26 22:33:14 +08:00 1
楼主描述太长了,可能理解不太精确。
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> |
3
lequiet OP @pubby 是啊,对网络这块不太熟。
3方案明显是不行的,跳板机曾经只能用ssh和scp,连自己目录的东西都不能删,只是最近才开放了点但估计架个服务器是不太现实的了~也不符合不动跳板机的原则。 1方案是否需要被映射的端口常开?能不能只是为了某次特定的任务开一下,然后执行完就关掉? 2方案看着可行噢,就是想知道这个本地端口映射,在跳板机上与两边的是做怎样的连接的?是不是跟普通的ssh长连接没什么区别,然后不可能被运维监控到? |
5
reusFork 2013-07-26 23:07:44 +08:00
用expect可以自动输入密码,这样最后那个方法就可行了
|
6
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现实 |
7
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就快很多了。 |
8
pubby 2013-07-26 23:27:56 +08:00
至于输密码,服务器太多,输密码太痛苦了,用证书吧。
|
9
lequiet OP @reusFork 3Q. 关键是expect在哪执行? 本地和跳板机都有expect但远程服务器没有。在本地执行的话,expect要写跳板机密码、远程服务器密码、远程主机执行某些命令所需的密码,有点烦,不过应该用熟了可以克服~
|
10
pubby 2013-07-26 23:29:57 +08:00
@lequiet
方案3其实也是可行的,既然跳板机ssh能用,那就能利用ssh在本地映射一个socks5代理端口,把跳板机当代理用的。 |
11
pubby 2013-07-26 23:31:53 +08:00
就像这样:
ssh -fN -D0.0.0.0:1080 -p <跳板port> <跳板user>@<跳板ip> ok, localhost:1080就是一个socks5代理了,数据自动走跳板机出去的 |
12
lequiet OP @pubby 关键是我们只是客户端开发+服务端少量开发。不是运维不能想怎么搞怎么搞,也不能保证我们配在服务器上的配置运维同学会帮你留着,所以才想一些能在本地放的脚本和配置,在现有的环境下去自动化地操作远程服务器完成我们自己需要经常操作的东西,但不需要像运维那么正式繁琐,只想找些简单快捷clean的方案。
|
14
reusFork 2013-07-26 23:37:24 +08:00
http://blog.51yip.com/linux/1462.html 看下这个,看能不能用上吧
|
15
pubby 2013-07-26 23:38:00 +08:00
@lequiet 除了证书需要在服务器导入(或者用reusFork的方法看能不能简化输入),方案2、3都不需要去改跳板或者服务器的啊
|
17
lequiet OP |
18
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/ # 需要输入服务器密码 |
19
summic 2013-07-27 00:22:40 +08:00 via iPhone
lz安全第一,效率可以一起探讨,很多东西大家都有很好的解决方案,或者可以分机63979找我交流
|
20
lequiet OP @pubby 确实可以两层ssh变一层了的感觉,假如要输密码的,那第一个ssh -fN那个,需要输两次密码吗?如果是,那后面那个rsync用到的ssh -p 10022,还需要输密码不?执行完某个任务(比如你的rsync同步任务)需要不需要把第一步建立的ssh通道干掉?
如果需要密码,“ssh -fN -L 10022:<server_ip>:<server_port> -p <跳板ssh port> <跳板user>@<跳板ip> ” 可以用expect来自动输(安全再考虑) |
22
summic 2013-07-27 00:50:03 +08:00 via iPhone
@lequiet 兄台不是跟张小龙混饭吃的?那我判断错了。这个安全体系的你要绕过去了不等于白做了么?你确信你做的比他们更安全更有效率么?脚本的分发和控制其实可以用私有协议加内部系统来解决
|
23
panzhc 2013-07-27 09:40:16 +08:00
网络连接用SSH代理,把跳板机当作代理;传文件用rzsz,隔多少层ssh都可以直接传文件。
|
24
lequiet OP @summic 作为一个开发者,只是想让日常任务更自动化不太浪费时间在敲命令上,现在也不是想绕过去,而是在现在的基础上去自动化。对我而言,如果都能基于ssh,安全级别跟两次ssh连到服务器一样的话,就足够了。
|
25
lequiet OP @panzhc 忘了说了~,自己机子属内网机,原则上不能上网,跳板机的访问权限也限于那些远程服务器,所以不太清楚跳板机作代理有什么更好的用途。 至于rzsz的话,在远程服务器、跳板机被禁用了。
|
26
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拉, 特别是千万别放在跳板机啊。 |
27
xdays 2013-07-27 19:35:12 +08:00
我知道的有两种方案:
1. fabric有个gateway参数,可以以类似proxy的方式通过跳板机在远程机器上批量执行命令,这个本人亲自验证过,只是fabric对这一点支持还不是很好,需要自己折腾。 2. 多重expect,仅觉得从原理上可行。 另外,楼主是不是蓝汛的呀 |
28
arbeitandy 2013-07-27 19:38:53 +08:00
http://pastebin.com/7qa7rp5i
回复中有格式的 ~/.ssh/config |
29
ETiV 2013-07-27 21:16:28 +08:00
估计LZ被当成腾讯的了...
|
30
julyclyde 2013-07-27 23:36:16 +08:00 via iPad 1
你们只能从跳板机ssh到其它机器吗?能不能 从跳板机到a然后再在a上ssh到b?
|
31
lequiet OP @arbeitandy 哈哈你写得好详细,但是我看不懂,对我们来说,方便肯定是比安全考虑得更多啊。。expect我在跳板机上有调用过,但发现history里会有明文的,所以打算每跑一次脚本自动再rm ~/.bash_history, 不知还有别的地方会log我敲的命令不?
反过来说说,如果不想让大家太麻烦,就应该给我们开发的提供下方便,谁有空两一天到晚敲一串长长的scp,尤其是在找问题的时候。 |
33
lequiet OP @xdays 我了解过expect,应该是可行的只是嫌麻烦,它不比shell写起来累。有fabric这种东西能用上,肯定能省下不少时间调试shell啦。
|
34
9hills 2013-07-30 02:22:26 +08:00 via Android
在公司机器上搞个虚拟机,在这个里面做开发得了
|
35
janxin 2013-07-30 08:44:08 +08:00 via iPad
为了安全起见,在区域内机器建立中央服务器就可以了
|
36
zz1956 2013-08-01 14:29:18 +08:00
ProxyCommand ssh 用户名@跳板机 exec nc %h %p 2 > /dev/null
|
37
peterlu 2013-08-01 15:05:35 +08:00
这根本不是技术问题啊,而是规则问题,如果你觉得这个规则不爽,那你可以提出来,否则就好好遵守,要不然你就跳槽到别的公司干。
这样通过技术手段突破,如果被发现了,最大的可能性就是被Fire。 |
38
lequiet OP @peterlu 我没有说突破,更没说打破。只是想在的基础上简化自动化,并在别人(比如运维)看来还是遵守规则的。规则不好改,也总有不爽的规则存在不管在哪。把别人的一整套规则按着跑,自动化的跑这规则,并不算违反规则,低线我很清楚,也不怕那这个最大的可能性。相反,如果连让你很不爽的规则(不管是出于什么理由而存在的规则),都不去优化,不管是从跟源优化还是从表面上优化,那是不是表示着,已经完全没激情了,工作只为了混口饭吃?
|
39
yangxin0 2013-08-03 09:28:43 +08:00
小心8000给你打电话
|
40
xderam 2013-08-05 10:16:19 +08:00
@lequiet 呃,原来你是开发?我还以为是运维呢。这个,我感觉还是把自己的需求好好和运维哥们说说,毕竟提高生产效率的事也不是什么坏事,互相理解就好了。但如果单纯从技术层面解决的话,运维哥们可能会不太高兴的说--!
|
41
xofyarg 2013-08-05 10:29:18 +08:00
“这根本不是技术问题啊,而是规则问题,如果你觉得这个规则不爽,那你可以提出来,否则就好好遵守,要不然你就跳槽到别的公司干。” 赞同。
是否可以考虑在跳板机后找一台机器作为开发机,自己安装一些常用的软件。然后可以使用这台开发机连接其他服务器。跳板机的目的就是分离办公环境和生产环境。如果能够绕道进去,说明安全建设还不到位。 :) |
43
hfcorriez 2013-08-05 11:39:27 +08:00 1
|
44
snnn 2013-08-05 13:51:47 +08:00
ssh -D5800 tiaoban -NTf
然后让scp和securecrt走5800这个socks proxy即可。 |
45
lequiet OP @xderam 运维有运维的流程和规范,比如他们坚决不给你用rz,但在此种情形下我们总不能老敲长长的scp吧,而且是两次,而且都要密码,而且不同target用户名密码都不同。这种情形写个脚本自动scp两次自动输密码让我们少花很多在“运维”上的事。
|
46
lequiet OP @xofyarg 哪台开发机能连(远程)服务器不是我们能决定的。公司的办公环境跟开发环境是一样的,都是内网。需要跳板机也许是远程服务器安全需要不想那么多可以连进去(远程服务器并不是公司一起维护的),或者公司安全需求跟本不想让内网机能直接连出去而是让跳板机多一层监控。@xderam 测试环境(也就是能直连的内部服务器)也有的,但只限于开发测试。由于网游的运营需要,经常需要线上操作,
|
48
xderam 2013-08-09 11:17:07 +08:00
@lequiet 呃,”经常需要线上操作”。。这个。。呵呵。。作为一个SA其实我想表达的是沟通应该比纯技术解决问题来的更彻底和直接一些。
|
49
xofyarg 2013-08-09 14:51:46 +08:00
@lequiet 我的意思是建议你在跳板机后面找一台机器作为开发机,这样就可以不用折腾这个问题了。当然,对于有些不是特别在意安全的公司来说,跳板机还是比较容易穿越的。
|
50
bjzhush 2013-08-09 15:03:19 +08:00
研发和运维的战争
|
51
lequiet OP @xderam 作为一个小角色表示跟本就没有权力和能力和机会去说服运维改变现有的规则,而且规则也不一定是在做事的运维想改能改的。本贴原意在于讨论脚本、自动化任务,即便没有跳板机,也有可以参考学习的回复。所谓“无视”,也并没有无视鄙视这个种规则和机制的意思。
|
52
lequiet OP @xofyarg 在意安全是肯定的,穿越跳板机(如果可以的话)被抓到估计不止被fire这么简单。本帖所说的远程服务器,是指线上运营中用的服务器,也正是经常需要到上面去操作的服务器,反倒内网的直连的开发测试服务器压根没有脚本自动化的需求。
|
53
zxp 2013-08-09 21:42:28 +08:00
跳板机上screen or tmux 连上目标服务器,只detach不logout,以后只需要连上跳板机就已经在目标服务器上了。
|
56
xderam 2013-08-14 14:48:43 +08:00
@bjzhush 持续交付里想避免的就是这种战争,可惜大多数人都想通过技术绕过研发和运维的那个墙,而不是沟通和交流。作为一个运维,我赶脚不能让开发的同学舒服是运维的失职。
|
57
fatpa 2013-08-14 17:26:15 +08:00
pssh 估计可以帮到你~
|
58
bjzhush 2013-08-19 17:30:44 +08:00
@xderam 有些时候,并不完全是两个部门的事,公司要抓安全,所以运维就暴力地在路由封掉了exe的下载,公司不允许听歌看视频,又疯掉了mp3/flv,有时候,他们也是奉命行事,而且我喜欢技术斗争,随他封掉,我再想办法绕过,这也挺好玩的
|
59
plprapper 2013-08-19 19:04:18 +08:00
https://code.google.com/p/parallel-ssh/ 你大概需要的是这个吧
|
60
lequiet OP 挖旧贴两年后回复:
@pubby @arbeitandy 当时是用的第二方案解决了问题,第三方案没试。远程server们是有做IP限制的,只限从跳板server ip登录。 实现的具体方式: 用Python写个通用的同步脚本,内部调用的就是@pubby 列的那些端口映射ssh命令然后再rsync/scp命令完成目录、文件同步、命令执行,用pexpect模块完成需要密码时的交互。脚本在本地Mac(UNIX命令环境)上执行,不同服务器密码用对称加密的方式(然并卵骗骗自己觉得稍微安全点吧)存在$HOME目录的一个ini文件里。 实际上只有少部分的远程服务器还在用密码其余已是证书,连跳板机也自己改用了证书。 @xdays Fabric当时没看到这功能,一开始尝试用的是perl的Rex,连接远程服务器前先跟跳板机建ssh proxy,跟你说的Fabric的gateway方案应该是一样的。后来觉得用得不爽就自己用Python实现了。 @xofyarg 跳板机后面找一台机器作为开发机,这个听起来行得通但服务开发人员这么多,不能大家都用那个开发机进行开发吧(大家都登录到那台server,用vim写代码?),如果只是拿那个开发server作为分发前的测试和中转,那本地PC跟这台跳板机后的开发机server的同步问题就又绕回来了。 不用理会我,就是说一下后续而已: @xderam @peterlu 线上机器的权限已回收,改文件的权限也没了,不用也不能做这种事了。安全和效率是要运维一开始就考虑好的,比如很久前其它部门有研发用SecureCRT脚本以方便登录跳转到指定服务器,密码都在里面,全体研发大家一起用,而这脚本还是运维帮写的。 |