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操作登录主机: ...
随机推荐
- 开发Protege插件时,出现打开Protege后并不显示插件的原因
最近跟着导师一起开发了一个Protege插件,在按照http://www.cnblogs.com/biaoyu/archive/2011/01/07/1929715.html中所述一步步进行到最后时, ...
- js 基本类型与引用类型的区别
1. 基本类型: string,number,boolean,null,undefined 2. 引用类型: Function,Array,Object 访问方式 ...
- js 事件绑定
事件绑定的方式 1. DOM 元素行内绑定 <div onclick="alert(1)"></div> 2. js on+eventType do ...
- sublime插件 cssComb实现css自动排序及格式化
cssComb是一个实现css代码自动排序,当然顺便也实现了代码的格式化 安装: 首先需要打开sublime搜索安装csscomb插件(前提是已经安装了sublime的package control) ...
- vim 查看文件二进制格式
用vim打开文件,vim -b file,选项-b是二进制模式打开 然后输入 :%!xxd,就可看到二进制编码 其实在linux下,直接输入xxd file 也是可以看到的文件二进制格式的
- SQL Server Bulk Insert批量数据导入
SQL Server的Bulk Insert语句可以将本地或远程的数据文件批量导入到数据库中,速度非常的快.远程文件必须共享才行,文件路径须使用通用约定(UNC)名称,即"\\服务器名或IP ...
- ATL 获取flash信息
// This goes past the ATL includes #import "C:/WINDOWS/system32/Macromed/Flash/Flash9e.ocx" ...
- Vue组件之自定义表单组件
今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...
- 16条Web2.0法则的编程思想
1.在你开始之前,先定一个简单的目标.无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标.就像“我需要保存一个书签”或者“我准 备帮助人们创建可编辑的.共享的页面”这样的目标,让你保 ...
- iOS多线程 GCD常见用法
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...