一种通过SSH协议构造隧道达成数据加密传输的方法

OpenSSH在实现时,给我们提供一个简单好用的Geek功能——端口转发。说是一个功能,其实是两个用法,一称之为本地端口转发,一称之为远程端口转发。

SSH端口转发其实就是类似iptables的端口数据转发功能,也即是将请求在某一个指定端口的数据,转发到另外一个指定的端口上。呵呵,很抽象啊~

下面说具体的用法:
下文的两个注解:本地:指执行SSH命令的发起端;远程:SSH命令的连接端。执行命令的环境要基于*nix或者是可以实现SSH命令效果的工具(如putty相关),服务所在的环境不限服务类型、不限操作系统。

SSH端口转发之一:本地端口转发
本地端口转发是指通过SSH命令,在本地服务器Listen一个端口(如8000),然后将访问这个端口的数据请求,转发到远程服务器的某一个服务端口上(如3306)。
有人也许会说废话,难道我不能直接连接么?还用你这个?
其实这个有两个场景也许你没有想到:1、当需要数据加密传输时;2、当服务端口只能通过跳板机不能直接访问时,如有些主机是没有外网IP的。这两个场景,直接连接是不可以的。

举例说明:
假设我有本地虚拟机host1(192.168.1.100)工作机器,服务器host2(54.100.1.2)用作跳板机,服务器host3(10.0.0.9)上面部署得有MySQL服务(端口为3306)。host3是对外不开放。host1与host2可以通过ssh直连。host2与host3之间局域网,防火墙互通。
当我在host1上面的web服务器想访问host3上面的MySQL服务时,直接访问是肯定不行的。因为不通。此时,我们就可以通过SSH的端口转发功能实现。
在host1上面执行如下命令:

#ssh -CNfg -L 8000:10.0.0.9:3306 dbfen@54.100.1.2

然后输入host2上dbfen账号的SSH密码。此时,我们在host1上,通过访问本地的192.168.1.100:8000端口,即是访问的host3上面的3306端口。host3上的MySQL授权,针对host3(10.0.0.9)进行授权即可。
因为是通过的SSH长链接,这样就可能达到数据的转发及数据的加密传输。
怎么样?是不是非常赞~
PS:大家用的myentunnel翻墙工具,就是用的plink工具来实现的本地端口转发~~~

SSH端口转发之二:远程端口转发
远程端口转发是指通过SSH命令,在远程服务器Listen一个端口(如8000),然后将访问这个端口的数据请求,转发到本地的某一个服务端口上(如3306)。
跟本地端口转发刚好反着~

举例说明:
假设我有本地虚拟机host1(192.168.1.100)工作机器,服务器host2(54.100.1.2)用作跳板机,公司开发机host3(192.168.117.100)上面部署得有MySQL服务(端口为3306)。host3是开发机,无公网IP,可访问外网。host1与host2可以通过ssh直连。host3可以直连上host2。
现在我在家里,当我想访问公司的开发机时,开发、测试时,抠门的老板又没有部署VPN,绝逼是不可能的。。。是的。。。不可能的。。。可是该死的老板(小编别让DBfen老板看见了哈)又要求解决问题~~~泪奔啊~~~苦逼的攻城狮~~~肿么办~~~难道要我半夜爬去公司吗??????
天不灭我!我有SSH远程端口转发!
在离开公司前,在公司开发机host3上执行命令如下:

#ssh -CNfg -R 8022:192.168.117.100:22 dbfen@54.100.1.2

然后输入host2上dbfen账号的SSH密码。此时,我在家、我在出差、我在飞机上、我在海上,只要我能够上网、能够上host2,哈哈,直接SSH去host2,然后在host2上,输入下面的命令:

# ssh root@127.0.0.1 -p 8022

输入host3上root账号的SSH密码~开发机,我来啦~~~老板,我正在解决问题,我不用去公司的,我可以很快解决问题的啦~~~

有没有很开心?
额,等等,你这个,还有一点儿问题啊,我host2服务器上面还得开放host2的SSH端口,host2上面还有重要数据~现在黑阔蝈蝈好凶的~好危险的哟~~~亲,有解决办法,附加一条我们的本地端口转发马上解决问题,在host2上执行下面的命令

# ssh -CNfg -L 8024:127.0.0.1:8022 dbfen@54.100.1.2

然后输入host2上dbfen账号的SSH密码。以后在家里、在海里、在天上,我只需要直接访问54.100.1.2:8024即可自动访问上host3上面的22端口,不再需要再登陆上host2(可以把host2上除8024外的所有端口全封了),然后登陆host3了~~~

怎么样,有没有很屌?咦,感觉这个功能在哪儿见过啊~这个东西我在哪儿见过。没错,花生壳代理!这就是不同实现啦!

下班回家~~~偶们也可以在家工作了~~~
等等…
既然大家这么嗨,我再给大家说一个应用场景,出过差的蝈蝈,有没有遇到这样的情况:当某个功能或者东西你不熟悉时,你需要求助于相关同事,而客户的服务器又不让远程登陆,这个同事在遥远的天边。。。咋办呢,让丫飞过来?估计老板不让。哈,我有QQ协助~~~
哈~你真2,QQ远程协助也是人用的么?延迟得想让人发疯~
有办法的~
带上你的笔记本电脑(host1),去客户的机房,一根网线接入客户的服务器(host2),wifi连接上外网,找一台临时的外网服务器(host3),操作如下:
在host3上面执行如下命令:

# ssh -CNfg -L 8022:127.0.0.1:8021 root@127.0.0.1

输入host3的root密码
在host1上面执行如下命令:

# ssh -CNfg -R 8021:host2:22 root@host3

输入host3的root密码
然后让同事丫的赶紧连接host3:8022客户服务器,给客户解决问题!!!

(0)

相关推荐

  • 一种通过SSH协议构造隧道达成数据加密传输的方法

    OpenSSH在实现时,给我们提供一个简单好用的Geek功能--端口转发.说是一个功能,其实是两个用法,一称之为本地端口转发,一称之为远程端口转发. SSH端口转发其实就是类似iptables的端口数据转发功能,也即是将请求在某一个指定端口的数据,转发到另外一个指定的端口上.呵呵,很抽象啊~ 下面说具体的用法: 下文的两个注解:本地:指执行SSH命令的发起端:远程:SSH命令的连接端.执行命令的环境要基于*nix或者是可以实现SSH命令效果的工具(如putty相关),服务所在的环境不限服务类型.

  • Hadoop框架起步之图解SSH、免密登录原理和实现方法

    1. 前言 emmm-.最近学习大数据,需要搭建Hadoop框架,当弄好linux系统之后,第一件事就是SSH免密登录的设置.对于SSH,我觉得使用过linux系统的程序员应该并不陌生.可是吧,用起来简单,真让你说出个所以然,还是件比较困难的事(大佬绕路,此篇文章不属于你~).然后,我就好奇心大发,打算写一篇博客详细介绍一下SSH和免密登录的原理及实现. 补充:不管是Hadoop的伪分布还是全分布,Hadoop的名称结点(NameNode)都需要启动集群中所有机器的Hadoop守护进程,而这个过

  • Android基于Http协议实现文件上传功能的方法

    本文实例讲述了Android基于Http协议实现文件上传功能的方法.分享给大家供大家参考,具体如下: 注意一般使用Http协议上传的文件都比较小,一般是小于2M 这里示例是上传一个小的MP3文件 1.主Activity:MainActivity.java public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private EditText timel

  • 5种必会的Java异步调用转同步的方法你会几种

    Sunny先来说一下对异步和同步的理解: 同步调用:调用方在调用过程中,持续等待返回结果. 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数. 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步.换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果. 不卖关子,先列出五种方法,然后一一举例说明: 使用wait和notify方法 使用条件锁 Future 使用CountDownLatch 使用Cyclic

  • 基于HTTP协议实现的小型web服务器的方法

    我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析: 1.实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET.POST方法请求资源 2.服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面) 3.服务器能进行简单的cgi运行.比如当客户在表单中输入数据后,服务器能够将运行结果返回个客户 4.能够通过页面对数据库进行操作,如增删查改等操作 一.http服务器实现的基本框架 关于HTTP协

  • php简单构造json多维数组的方法示例

    本文实例讲述了php简单构造json多维数组的方法.分享给大家供大家参考,具体如下: php构造json多维数组其实很简单 下面列举了将mysqli的查询结果数组序列化为json的php代码如下 $res['result'] = "ok"; $res['msg'] = 'login'; $res['fileinfo'] = array(); while($stmt->fetch()){ $fileinfo['fileid'] = $fileid; $fileinfo['name'

  • java实现多线程的两种方式继承Thread类和实现Runnable接口的方法

    实现方式和继承方式有什么区别呢? *区别: *继承Thread:线程代码存放在Thread子类run方法中 *实现Runnable:线程代码存放在接口的子类的run方法中 *实现方式的好处:避免了单继承的局限性 *在定义线程时,建议使用实现方式,当然如果一个类没有继承父类,那么也可以通过继承Thread类来实现多线程 *注意:Runnable接口没有抛出异常,那么实现它的类只能是try-catch不能throws *Java对多线程的安全问题提供了专业的解决方式就是同步代码块synchroniz

  • python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法

    本文通过将同一个数据集在三种不同的简便项窗口部件中显示.三个窗口的数据得到实时的同步,数据和视图分离.当添加或删除数据行,三个不同的视图均保持同步.数据将保存在本地文件中,而非数据库.对于小型和临时性数据集来说,这些简便窗口部件非常有用,可以用在非单独数据集中-数据自身的显示,编辑和存储. 所使用的数据集: /home/yrd/eric_workspace/chap14/ships_conv/ships.py #!/usr/bin/env python3 import platform from

  • 一种类似JAVA线程池的C++线程池实现方法

    什么是线程池 线程池(thread pool)是一种线程使用模式.线程过多或者频繁创建和销毁线程会带来调度开销,进而影响缓存局部性和整体性能.而线程池维护着多个线程,等待着管理器分配可并发执行的任务.这避免了在处理短时间任务时创建与销毁线程的代价,以及保证了线程的可复用性.线程池不仅能够保证内核的充分利用,还能防止过分调度. 线程池的实现 线程池在JAVA平台上已经有成熟的实现方式,本文介绍参考JAVA线程池实现方式实现的C++线程池类库. 该类库代码已上传至github仓库中,下载地址为:ht

  • python 构造三维全零数组的方法

    如下所示: temp1 = [[] for i in range(10)] temp2 = [temp1 for i in range(20)] temp3 = [temp2 for i in range(30)] for i in range(30): for j in range(20): for k in range(10): temp3[i][j][k] = 0 但是赋值的时候还是发现是指向同一地址的 所以还得这样 matrix3d=[] for i in range(30): matr

随机推荐