(转)使用OpenSSH端口转发让工作生活更轻松


1、前言

本文版权归作者freshegg所有,任何人转载全文或节选,请注明作者和版本信息,否则视为侵权。
版本:0.1
作者:freshegg

俗话说得好“打洞有风险,动手需谨慎”,您需要仔细鉴别本文所列技术可能带来的安全风险。本着“谁打洞,谁受益,谁承担风险”的原则,对于您执行本文中的操作而导致的任何结果和本人无关。另外,本文中所列人物情节纯属虚构,请勿对号入座,如有雷同,纯属巧合 ;

话说家住广州的本文主角very正在位于中山的公司上班,突然接到上司发来的邮件要求他接手一个广告策划,而这个案子原来是由策划部某主任在做,今天某主任因为工作过分操劳身体不支住院了,要求他必须在明天早上之前不惜一切代价完成,将结果发到上司和boss的公司内部邮箱里。very拿到相关电子资料研究了一下,原来是某公司的情侣衫广告,very脑里浮现出在另外一家公司做运维工作的枕头mm的倩影,不觉心里一荡,觉得虽然今天要加班但应该问题不大,顺手回了一句“保证完成任务”便埋头苦干起来。弹指一挥间,下午5点,very接到一个重要电话,是very苦追很久的枕头mm打来的,未来的从未谋面的岳父、岳母邀请他在傍晚7点去吃个饭见个面。“7点”very转念一想,上司布置的任务还没完成啊!这怎生是好?今天必须要去枕头mm家(广州),去了再回家加班?但是今天又没带移动硬盘,在家里也无法访问公司,虽然自己的电脑上已经安装了vnc server,但因为公司有状态检测防火墙,只允许内网访问外网,而且只能访问21,22,25,80,110这几个端口,外网是无法主动连接内网的。very不禁仰天长叹“鱼与熊掌不可兼得啊”,very没辙的时候打电话给枕头mm诉苦,枕头mm听完,说我给你想个办法让你在家里连到公司继续加班,我在电邮里仔细给你说。

2、ssh -i soho_private_key -L 5900:localhost:5900 [email protected]

第一封电邮 写道
为节省本文篇幅,第一封枕头mm发的电邮省略n多字,大概内容如下:

2.1、状态检测防火墙简单的说就是比包过滤防火墙多了一个设施--状态表,当通信双方发起的第一个数据包通过防火墙时,防火墙使用包过滤功能将数据包与防火墙规则进行匹配,当匹配的规则中的动作定义为放行时,防火墙会在状态表中记录下该连接。随后双方的通信中,防火墙将使用状态检测功能,因为状态表中的记录匹配双方之后的通信,所以所有的合法连接和通信将顺利通过。

2.2、very公司的状态检测防火墙的规则只允许当通信双方的第一个数据包通过防火墙时,是从内网访问外网,所以首先very应该从内网向外部发起连接,待到在状态表中生成相应的记录后,再用某种方法从相同的连接访问进来。这种方法枕头mm恰好知道,就是利用OpenSSH的端口转发技术。

2.3、OpenSSH的端口转发技术的一个先决条件就是需要一个ssh server,在本文中假设为fresh.egg,使用FreeBSD7,并且有一个使用远程ssh key方式认证的帐户soho。大部分文档上说的端口转发是ssh -L port:host:hostport user@sshserver这种方法。在windows下可以使用流行的putty来实现,如图1。当执行图1配置的putty时,将在ssh client和ssh server之间建立一个隧道(隧道里面装载的是vnc通信)。在图1中的右边的Source port输入5900,这个表示在ssh client本机虚拟出一个之前未用的服务端口5900,就是隧道的入口;Destination输入localhost:5900表示隧道的出口在ssh server(fresh.egg)上绑定在loopback上的端口5900;下面的单选Local表示隧道的方向--从内向外--vnc client在内而vnc server在外。当在ssh client上用vnc客户端访问ip为127.0.0.1时,请求访问的数据将被putty转移进入隧道,最后数据到达ssh隧道出口处被sshd转发到ssh server的5900。这样,虽然防火墙禁止你访问外部的vnc server,通过OpenSSH您却可以。如果您使用OpenSSH客户端,和图1相对应的命令为:

% ssh -i soho_private_key -L 5900:localhost:5900 [email protected]

very看到这里心想:看了半天还是不大明白,关键是现在我要从家里访问公司的电脑啊,怎么好像方向不对啊?这时候接到枕头mm第二封电邮。
 

图1
sshforwarding-1.JPG

3、ssh -i soho_private_key -R 5900:localhost:5900 [email protected]


 第二封电邮写道
3.1、既然向外都能突破firewall了,当然也能在另外一个方向实现。如图2进行配置。图2右边的Source port输入5900,这个表示在ssh server(fresh.egg)虚拟出服务端口5900,就是隧道的入口;Destination输入localhost:5900表示隧道的出口在ssh client上的端口5900;下面的单选Remote表示隧道的方向--从外向内--vnc server在内而vnc client在外。选择上面的复选框Remote ports do the same表示在ssh server的端口5900绑定在所有接口而可以被外部主机直接访问。只要执行了这样设置的putty,就会在ssh client和ssh server之间建立一个隧道。如果您使用OpenSSH客户端,和图2相对应的命令为:

% ssh -g -i soho_private_key -R 5900:localhost:5900 [email protected]

3.2、您回到家里,使用vnc client设置访问地址为fresh.egg,那么您的桌面将瞬间呈现在你面前;p 另外在ssh server上要使sshd起的5900可以被外部主机直接访问,需要在ssh server上执行命令:

% sudo sed -i ".bak" 's/^#\(GatewayPorts \)no/\1yes/' /etc/ssh/sshd_config

% sudo /etc/rc.d/sshd reload

very看到这封邮件大悦,可转头一想:sshd起的5900可以被任意外部主机直接访问的话,可能有很大的安全风险吧?例如其他人有意无意的通过sshd起的5900访问到very公司的电脑,而putty正在运行中(ssh client保持运行是维持隧道连通性的关键),访问者可以轻松拿到private key,那ssh server的安全就成问题了。。。
 

图2
sshforwarding-2.JPG


4、ssh -i soho_private_key -R 5900:localhost:5900 [email protected]和ssh -i soho_private_key -L 5900:localhost:5900 [email protected]


第三封电邮 写道
4.1、如果刚才您用了sudo sed -i ".bak" 's/^#\(GatewayPorts \)no/\1yes/' /etc/ssh/sshd_config这个命令,请立即在ssh server上执行:

% sudo mv /etc/ssh/sshd_config.bak /etc/ssh/sshd_config

% sudo /etc/rc.d/sshd reload

4.2、在公司设置putty如图3。图3和图2的唯一区别:不选择上面的复选框Remote ports do the same。然后点Add按钮,最后执行putty。如果您使用OpenSSH客户端,和图3相对应的命令为:

% ssh -i soho_private_key -R 5900:localhost:5900 [email protected]

4.3、回到家里设置putty如图1。

4.4、使用vnc client设置访问地址为127.0.0.1。您将访问到公司的电脑。

“呕也”very想:看来这个方案消除我上面的疑虑了,但如果我的soho的key一不小心被别人拿到了,别人就会获得一个交互式shell,那fresh.egg是否会有安全风险?另外我怎么才能保持putty和ssh server之间连通性(不因为client长时间不操作而中断连接),very将疑虑告诉了枕头mm,很快收到了第四封邮件。
 

图3
sshforwarding-3.JPG

5、其他设置

第四封电邮 写道
5.1、在ssh server上执行命令(假设soho只有一个key)

% sudo sed -i ".bak" 's/^\(.*\)/no-pty,command="echo forwarding" \1/' \

/home/soho/.ssh/authorized_keys

这个命令执行后,soho下次用该key登录ssh时,就不能得到一个交互式shell,并且非交互式执行命令将仅限于

"echo forwarding"。

5.2、开启ssh server的keepalive机制

% sudo sed -i ".bak" 's/^#\(ClientAliveInterval \)0/\130/' /etc/ssh/sshd_config

% sudo /etc/rc.d/sshd reload

5.3、在putty上开启ssh client的keepalive机制

在putty的Connection的右边窗体的Seconds between keepalives栏输入15

5.4、在putty上关闭交互式shell方式登录

在putty的Connection=》SSH的右边窗体中,选中Don't start a shell or command at all复选框

最后第四封电邮有个附件,用某种方法加密的soho_private_key。
 


6、后记

very按照邮件执行了上面4.2节 5.3节 5.4节的操作,下班,到广州和枕头mm胜利会师,饭桌上胸有成竹、谈笑风生,得到两位老人的肯定。回到家,执行了4.3节 5.3节 5.4节 4.4节的操作,连到公司的电脑,由于自感幸福指数大增,情侣衫广告的字里行间充满郎情妾意。。。第二天早上10点,very获悉他被任命为策划部主任。



注意:第4节和第5节中的操作相对本文中其他部分要安全一些,另外ssh public-key认证方式涉及的server和client的设置请参考其他资料。

参考资料:

man 1 ssh
man 5 sshd_config
FreeBSD使用手册
PuTTY User Manual
《OReilly SSH The Secure Shell The Definitive Guide 2nd》
使用 SSH 建立安全通信信道http://www.ibm.com/developerworks/cn/aix/library/au-tunnelingssh/index.html


最后感谢very和枕头mm对本文提供的技术支持。



猜你喜欢

转载自lvzun.iteye.com/blog/712924