2、ssh -i soho_private_key -L 5900:localhost:5900 soho@fresh.egg
第一封电邮 写道
为节省本文篇幅,第一封枕头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 soho@fresh.egg very看到这里心想:看了半天还是不大明白,关键是现在我要从家里访问公司的电脑啊,怎么好像方向不对啊?这时候接到枕头mm第二封电邮。
![]() ![]() 3、ssh -i soho_private_key -R 5900:localhost:5900 soho@fresh.egg
第二封电邮写道
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 soho@fresh.egg 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的安全就成问题了。。。 ![]() ![]() 4、ssh -i soho_private_key -R 5900:localhost:5900 soho@fresh.egg和ssh -i soho_private_key -L 5900:localhost:5900 soho@fresh.egg
第三封电邮 写道
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 soho@fresh.egg 4.3、回到家里设置putty如图1。 4.4、使用vnc client设置访问地址为127.0.0.1。您将访问到公司的电脑。 “呕也”very想:看来这个方案消除我上面的疑虑了,但如果我的soho的key一不小心被别人拿到了,别人就会获得一个交互式shell,那fresh.egg是否会有安全风险?另外我怎么才能保持putty和ssh server之间连通性(不因为client长时间不操作而中断连接),very将疑虑告诉了枕头mm,很快收到了第四封邮件。 ![]() ![]() 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对本文提供的技术支持。 |