SSH 动态端口forwarding是如何工作的
好久没有来了,实在是太懒。
经常用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是如何工作的的更多相关文章
- ssh动态端口转发
ssh本地和远程端口转发都需要固定的应用服务器IP和端口,但是很多情况下,应用的端口繁多逐个转发效率不高,而且一些应用使用不固定的端口,经常跳着使用端口,一些网站还不支持IP直接访问,这导致ssh本地 ...
- 代理上网(ssh 动态端口转发)
ssh 是一种加密通讯的网络协议,常用来在两台机器间做远程登陆.在这里,我们用SSH 来做代理上网. 假设情景 你的PC 不能自由联网 但你的PC 可以访问机器B 机器B 可以自由联网 SSH 上网原 ...
- SSH的端口转发:本地转发Local Forward和远程转发Remote Forward
关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...
- SSH的端口转发
这里是一篇很好的介绍SSH PortForwarding的文章http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 可以将远端服务器一 ...
- SSH的本地、远程、动态端口转发实验笔记
SSH端口转发 SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务.这一 ...
- 【ssh】端口转发
来源:https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 非常非常好用,可以通过跳板解决两台服务器无法连接的问题 第一部分 概述 ...
- SSH 的端口转发
第一部分 概述 当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我 ...
- SSH远程端口转发实战详解
问题 前段时间在外地没有在实验室,随身携带了一个笔记本电脑.但是笔记本性能不够,想用SSH远程连接实验室的电脑.问如何连接?现有以下设备 设备 IP 备注 系统 实验室电脑C1 192.168.0.2 ...
- DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单
设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...
随机推荐
- Beta-1阶段成员贡献分(代组长更新)
组名:天天向上 组长:王森 小组成员:张金生.张政.林莉.胡丽娜 小组贡献分如下:王森5.2 张金生5.1 张政 5.0 林莉 4.9 胡丽娜 4.8 成员得分如下: 成员 基础分 表现分 ...
- (原创)通用查询实现方案(可用于DDD)[附源码] -- 简介
[声明] 写作不易,转载请注明出处(http://www.cnblogs.com/wiseant/p/3985353.html). [系列文章] 通用查询实现方案(可用于DDD)[附源码] -- ...
- SharePoint中的ASHX
<%@ Assembly Name="namespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=key" %&g ...
- .net 控件
DevComponents.DotNetBar11.8.0.0:百度网盘里 DevExpress13.2.8:百度网盘里
- SVN常用问题汇总
参考文档.http://www.cnblogs.com/newsea/archive/2012/04/28/2474818.html 1.客户端取消记住用户名和密码. 2.汉化后设置为中文
- Java getResourceAsStream() 方法会缓存文件的问题
xxx.getClass().getClassLoader().getResourceAsStream("d:/test-config.properties") 这方法确实会缓存文 ...
- 【Java】:ehcache
ehcache是一个纯Java进程内缓存框架,是hibernate默认的Cacheprovider.(出自百度百科). 1. 快速2. 简单3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需 ...
- Windows下的UDP爆了10054--远程主机强迫关闭了一个现有的连接
原文地址:http://www.cnblogs.com/pasoraku/p/5612105.html 故事是这样的. 前几天在网上逛,看到了一个漂亮的坦克模型. 我觉得这个坦克可以做一个游戏,那需要 ...
- LinuxMM--MemoryHierarchy
MemoryHierarchy 为了理解内核中的页替换算法,有必要认识linux中的存储体系分层架构.访问模式以及混合工作mixed workloads. 存储器分层架构 有两种类型的存储分层架构 ...
- iOS emoji表情转码 或者判断
如果项目中有评论或者信息恢复的地方,往往会用到emoji,有时候如后台不支持emoji,就会显示乱码错误,我们可以把emoji转成unicode编码或者utf8编码格式传给服务器.当然如果后台服务器接 ...