好久没有来了,实在是太懒。

经常用SSH的动态端口forwarding 来FQ,使用像这样的命令:

ssh -D 9999 -f -C -q -N sshHost.somewhere.com

这个命令会建立一个tunnel到指定的远程SSH主机,这样你连接本机9999端口,并在所建立连接上读写的任何数据都会被tunnel到远端主机,从而达到FQ的效果。

一直以为SSH这个命令里面做了很复杂的事情(比如实现连接管理和端口映射)来实现这么一个功能,但总觉得对一个小工具来说,它做的太多了,而且这个显然不是SSH所应该focus的功能。直到某一天忍不住google了一把SSH的工作原理,才弄明白原来SSH支持这个功能并没有那么复杂,它其实实现的相当巧妙(参看比如https://chamibuddhika.wordpress.com/2012/03/21/ssh-tunnelling-explained/)。

SSH的实现并不是想象的那样去做了复杂的端口映射和连接管理,而是巧妙的通过内置一个SOCKS proxy的方式来完成dynamic port forwarding的功能;而这个内置的SOCKS PROXY则利用SSH提供的基本功能(remote port forwarding)来提供服务。弄清楚它的做法之后,刚好觉得以前用的Ssh Tunnel Manager不是太好使(经常它自动建立的dynamic port forwarding给hang住,估计是GFW检测到可疑的连接做了什么手脚吧),便手动实现了一个java 版的tunnel manager(感谢D,ZF,google,github和开源项目……)。

简单来说,自己做的这个ssh tunnel manager通过一个类似heart beat的task 检查到特定站点的连接(比如到google),如果发现出问题了便自动创建一个新的tunnel,关闭掉老的tunnel。如果有兴趣的可以看看源码哈,并不复杂:https://github.com/BugsLord/jsocks。

这个小工具只能算一个by product,通过这件事我想说的是

1. 保持好奇心,有时候尝试去知其所以然并不困难(比如这次不过就是动手google 了一把,而不是仅仅停留在奇怪或猜测它是怎么做的层次)

2. 学会去build一个产品而不是去create一个产品。build意味着你可以通过使用一些已经很成熟的产品或组建来实现你自己的需求,从而大大降低产品的复杂度、节约大量的人力物力。比如SSH自身就没有去做自己复杂的端口、连接的管理和映射,而是利用SOCKS proxy来搞定;我自己写的这个tunnel manager也是利用了j2ssh这个开源库而不是自己从touch开始做。这个也是符合design principle中所说的favor composition……

SSH 动态端口forwarding是如何工作的的更多相关文章

  1. ssh动态端口转发

    ssh本地和远程端口转发都需要固定的应用服务器IP和端口,但是很多情况下,应用的端口繁多逐个转发效率不高,而且一些应用使用不固定的端口,经常跳着使用端口,一些网站还不支持IP直接访问,这导致ssh本地 ...

  2. 代理上网(ssh 动态端口转发)

    ssh 是一种加密通讯的网络协议,常用来在两台机器间做远程登陆.在这里,我们用SSH 来做代理上网. 假设情景 你的PC 不能自由联网 但你的PC 可以访问机器B 机器B 可以自由联网 SSH 上网原 ...

  3. SSH的端口转发:本地转发Local Forward和远程转发Remote Forward

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  4. SSH的端口转发

    这里是一篇很好的介绍SSH PortForwarding的文章http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 可以将远端服务器一 ...

  5. SSH的本地、远程、动态端口转发实验笔记

    SSH端口转发 SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务.这一 ...

  6. 【ssh】端口转发

    来源:https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 非常非常好用,可以通过跳板解决两台服务器无法连接的问题 第一部分 概述 ...

  7. SSH 的端口转发

    第一部分 概述 当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我 ...

  8. SSH远程端口转发实战详解

    问题 前段时间在外地没有在实验室,随身携带了一个笔记本电脑.但是笔记本性能不够,想用SSH远程连接实验室的电脑.问如何连接?现有以下设备 设备 IP 备注 系统 实验室电脑C1 192.168.0.2 ...

  9. DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...

随机推荐

  1. Android开发学习---template requires a minimum SDK version of at least 7,build target API version of 14

    adt 22.6.3的bug 当adt更新到22.6.3,其编辑器中最低支持api7,即android 2.1,这里可能是google故意这么做的,也可能是其bug.其target sdk 和comp ...

  2. nginx下开启pathinfo模式

    第一种方式是通过重写url来实现pathinfo模式: location / { if (!-e $request_filename){ rewrite ^/(.*)$ /index.php?s=/$ ...

  3. iOS工作笔记(十五)

    1.使用MJRefresh上拉加载的小细节 MJRefreshBackGifFooter *footer = [MJRefreshBackGifFooter footerWithRefreshingB ...

  4. go的mgo,连接未释放问题,连接泄露。

    api启动几天后,卡住(连接失败,超时) 异常原因 mongo连接被占满,无法建立mgo连接,返回信息 查询点用端口可知,97%的连接被api项目占用. api项目的mongodb连接“泄露”,某处的 ...

  5. 以太坊只能合约摸索——第一关,ubuntu开发环境部署

    1. 安装“eth”命令行工具 sudo add-apt-repository ppa:ethereum/ethereum-qt sudo add-apt-repository ppa:ethereu ...

  6. 学霸网站---Alpha+版本测试报告

    说明:由于老师前几天要求交测试报告,本测试报告只针对当时完成的功能进行测试,并不是几天之后要发布的BETA版本,不会有很多差别,但是BETA版本会包含对其中BUG的修复. 学霸网站测试报告 一.引言 ...

  7. SVN系统的几个术语

    SVN系统的几个术语 User:用户,可以远程连接到SVN服务器的权限实体. User Group:用户组,用于管理一组权限相同的用户. Repository:版本库,在服务器端保存着的项目中所有的文 ...

  8. asp.net 跨域服务器 上传文件

    最近一个项目遇到问题,公司局域网中,在F域下有个服务器Fa,我们的项目就部署在Fa.项目里面有个功能,需要把生成的文件(.doc,.xls,.pdf)保存到O域的一台文件共享服务器Ob.在原有的网络环 ...

  9. ruby on rails爬坑(三):图片上传及显示

    一,问题及思路 最近在用rails + react + mysql基本框架写一个cms + client的项目,里面涉及到了图片的上传及显示,下面简单说说思路,至于这个项目的配置部署,应该会在寒假结束 ...

  10. Android应用程序Monkey测试

    Monkey是Android SDK中附带的一个测试工具:Monkey用于进行压力测试,软件开发人员结合monkey打印日志和系统日志,解决测试中出现的问题. Monkey测试的特点:所有事件都是随机 ...