SSH隧道技术----端口转发,socket代理

 

 

 原文的原始出处不详,本文也是在复制引用了某篇转载,并做了必要的整理与编辑。

本文的受众

如果你遇到了以下问题,那么你应该阅读这篇文章

  1. 我听说过这种技术,我对它很感兴趣
  2. 我想在家里访问我在公司的机器(写程序,查数据,下电影)。
  3. 公司为了防止我们用XX软件封锁了它的端口或者服务器地址。
  4. 公司不让我们上XX网站,限制了网址甚至IP。
  5. 公司不让我们看关于XX的信息,甚至花血本买了XX设备,能够对内容进行过滤。一看XX内容,链接就中断了。
  6. 我爸是搞电脑的,他在家里的路由器上动了手脚,我不能看XXX了。

带着这些问题,我们先从什么是ssh隧道开始。

 

什么是SSH隧道

首 先看下面这张图,我们所面临的大部分情况都和它类似。我们的电脑在左上角,通过公司带有防火墙功能的路由器接入互联网(当然可能还有交换机什么的在中间连 接着你和路由器,但是在我们的问题中交换机并不起到什么关键性的作用)。左下脚的部分是一个网站的服务器,它是我们公司防火墙策略的一部分,也就是说公司 不希望我们访问这个服务器。在左上还有一台机器,它也是属于我们的。但是这台机器并不在我们公司里面,换句话说他不受到公司防火墙的限制。最后也是最重 要的一点是,我们能够在公司通过互联网直接访问这台机器。或者说这台位于公司防火墙外面的机器需要拥有一个独立的互联网IP,同时公司的防火墙规则不会屏 蔽这台机器,并且这台机器运行着一个OpenSSH服务器。

 

现 在,我们清楚地知道了自己所处的网络环境。并且不难理解我们在公司无法访问那个服务器的原因是:线路A-B-C上A-B之间的防火墙屏蔽了对那个服务器的 访问。与此同时,我们也很快注意到,线路A-B-D之间、D-C之间是不受阻碍的。相信你已经想到了,在A-B之间的防火墙不会屏蔽对机器d的访问。因此 我们可以通过机器d建立一个通道A-B-D-C,从而访问到机器c上的数据。

这条通道可以用很多技术来建立,这里我们仅仅介绍如何使用SSH服务器来建立这样一个通道-他被称为SSH隧道。

 

一、如何建立本地SSH隧道

在我们计划建立一个本地SSH隧道之前,我们必须清楚下面这些数据:

  1. 中间服务器d的IP地址
  2. 要访问服务器c的IP地址
  3. 要访问服务器c的端口

现在,我们把上面这张图变得具体一些,给这些机器加上IP地址。并且根据下面这张图列出我们的计划:

 

  1. 需要访问234.234.234.234的FTP服务,也就是端口21
  2. 中间服务器是123.123.123.123

现在我们使用下面这条命令来达成我们的目的

 

ssh -N -f -L 2121:234.234.234.234:21 123.123.123.123
ftp localhost:2121 # 现在访问本地2121端口,就能连接234.234.234.234的21端口了

 

这里我们用到了SSH客户端的三个参数,下面我们一一做出解释:

  • -N 告诉SSH客户端,这个连接不需要执行任何命令。仅仅做端口转发
  • -f 告诉SSH客户端在后台运行
  • -L 做本地映射端口,被冒号分割的三个部分含义分别是最后一个参数是我们用来建立隧道的中间机器的IP地址(IP: 123.123.123.123)
    • 需要使用的本地端口号
    • 需要访问的目标机器IP地址(IP: 234.234.234.234)
    • 需要访问的目标机器端口(端口: 21)

我们再重复一下-L参数的行为。-L X:Y:Z的含义是,将IP为Y的机器的Z端口通过中间服务器映射到本地机器的X端口。

在这条命令成功执行之后,我们已经具有绕过公司防火墙的能力,并且成功访问到了我们喜欢的一个FTP服务器了。

 

二、如何建立远程SSH隧道

通 过建立本地SSH隧道,我们成功地绕过防火墙开始下载FTP上的资源了。那么当我们在家里的时候想要察看下载进度怎么办呢?大多数公司的网络是通过路由器 接入互联网的,公司内部的机器不会直接与互联网连接,也就是不能通过互联网直接访问。通过线路D-B-A访问公司里的机器a便是不可能的。也许你已经注意 到了,虽然D-B-A这个方向的连接不通,但是A-B-D这个方向的连接是没有问题的。那么,我们能否利用一条已经连接好的A-B-D方向的连接来完成 D-B-A方向的访问呢?答案是肯定的,这就是远程SSH隧道的用途。

与本地SSH一样,我们在建立远程SSH隧道之前要清楚下面几个参数:

  • 需要访问内部机器的远程机器的IP地址(这里是123.123.123.123)
  • 需要让远程机器能访问的内部机器的IP地址(这里因为是想把本机映射出去,因此IP是127.0.0.1)
  • 需要让远程机器能访问的内部机器的端口号(端口:22)

在清楚了上面的参数后,我们使用下面的命令来建立一个远程SSH隧道,在192.168.0.100的主机上执行下面的命令:

ssh -Nf -R 2222:127.0.0.1:22 123.123.123.123

 

现在,在IP是123.123.123.123的机器上我们用下面的命令就可以登陆公司的IP是192.168.0.100的机器了。

ssh -p 2222 localhost

 

-N,-f 这两个参数我们已经在本地SSH隧道中介绍过了。我们现在重点说说参数-R。该参数的三个部分的含义分别是:

  • 远程机器使用的端口(2222)
  • 需要映射的内部机器的IP地址(127.0.0.1)
  • 需要映射的内部机器的端口(22)

例如:-R X:Y:Z 就是把我们内部的Y机器的Z端口映射到远程机器的X端口上。

 

三、建立SSH隧道的几个技巧

自动重连

  隧道可能因为某些原因断开,例如:机器重启,长时间没有数据通信而被路由器切断等等。因此我们可以用程序控制隧道的重新连接,例如一个简单的循环或者使用 djb’s daemontools . 不管用哪种方法,重连时都应避免因输入密码而卡死程序。关于如何安全的避免输入密码的方法,请参考我的如何实现安全的免密码ssh登录 。这里请注意,如果通过其他程序控制隧道连接,应当避免将SSH客户端放到后台执行,也就是去掉-f参数。

保持长时间连接

  有些路由器会把长时间没有通信的连接断开。SSH客户端的TCPKeepAlive选项可以避免这个问题的发生,默认情况下它是被开启的。如果它被关闭了,可以在ssh的命令上加上-o TCPKeepAlive=yes来开启。

另一种方法是,去掉-N参数,加入一个定期能产生输出的命令。例如: top或者vmstat。下面给出一个这种方法的例子:

ssh -R 2222:localhost:22 123.123.123.123 "vmstat 30"

 

检查隧道状态

  有些时候隧道会因为一些原因通信不畅而卡死,例如:由于传输数据量太大,被路由器带入stalled状态。这种时候,往往SSH客户端并不退出,而是卡死在 那里。一种应对方法是,使用SSH客户端的ServerAliveInterval和ServerAliveCountMax选项。 ServerAliveInterval会在隧道无通信后的一段设置好的时间后发送一个请求给服务器要求服务器响应。如果服务器在 ServerAliveCountMax次请求后都没能响应,那么SSH客户端就自动断开连接并退出,将控制权交给你的监控程序。这两个选项的设置方法分 别是在ssh时加入-o ServerAliveInterval=n和-o ServerAliveCountMax=m。其中n, m可以自行定义。

如何将端口绑定到外部地址上

  使用上面的方法,映射的端口只能绑定在127.0.0.1这个接口上。也就是说,只能被本机自己访问到。如何才能让其他机器访问这个端口呢?我们可以把这个 映射的端口绑定在0.0.0.0的接口上,方法是加上参数-b 0.0.0.0。同时还需要打开SSH服务器端的一个选项-GatewayPorts。默认情况下它应当是被打开的。如果被关闭的话,可以在/etc /sshd_config中修改GatewayPorts no为GatewayPorts yes来打开它。

如何寻找中间服务器

如果你家里使用ADSL上网,多半你会比较幸运。一般的ADSL(例如 联通 的ADSL)都是有互联网地址的。你只需要在家里的路由器上一台装有OpenSSH server机器的SSH端口映射出去即可。同时一些提供SSH访问的虚拟主机也可以用于这一用途。例如: Hostmonser 或者 Dreamhost .

 

四、通过SSH隧道建立SOCKS服务器

如果我们需要借助一台中间服务器访问很多资源,一个个映射显然不是高明的办法(事实上,高明确实没有用这个方法)。幸好,SSH客户端为我们提供了通过SSH隧道建立SOCKS服务器的功能。

通过下面的命令我们可以建立一个通过123.123.123.123的SOCKS服务器。

ssh -N -f -D 1080 123.123.123 # 将端口绑定在127.0.0.1上
ssh -N -f -D 0.0.0.0:1080 123.123.123.123 # 将端口绑定在0.0.0.0上

 

通过SSH建立的SOCKS服务器使用的是SOCKS5协议,在为应用程序设置SOCKS代理的时候要特别注意。

 

五、总结

至 此,我们已经对如何利用SSH隧道有一个基本的认识了。现在,文章开始时的那些问题应该迎刃而解了吧。这里要特别说一下,由于SSH隧道也使用了SSH加 密协议,因此是不会被防火墙上的内容过滤器监控到的。也就是说一切在隧道中传输的数据都是被加密的。当然,离开隧道后的数据还是会保持自己原有的样子,没 有加密的数据还是会被后续的路由设备监控到。

 

 

PS:编者另注

  在大多数情况下,我们建立ssh隧道的时候,往往是想通过一台公网的主机或者是大家都可以访问的主机做跳转机,来访问内部或者外部不能直接访问的机器。所以一般像这种情况下,请将跳转机中的ssh服务器中的GatewayPorts设为yes

  1.建立本地的ssh隧道时,可以指定本地主机的地址,如下:

ssh -Nf -L 192.168.0.100:2121:234.234.234.234:21 123.123.123.123

   那么本地局域网的任何机器访问192.168.0.100:2121都会自动被映射到234.234.234.234:21

  

  2.建立远程的ssh隧道时,可以指定公网的主机地址,不过一般情况是要访问内网的主机,所以这条命令应该在任何一台内网主机上执行,比如在192.168.0.102的主机上运行:

ssh -Nf -R 123.123.123.123:2222:192.168.0.100:22 123.123.123.123

 只要在局域网里192.168.0.102可以直接连接内网主机192.168.0.100,且192.168.0.102可以直接与公网主机123.123.123.123建立ssh连接。那么任何外网主机通过访问公网主机123.123.123.123:2222就会被连接到192.168.0.100:22,从而可以完成外网穿越NAT到内网的访问,而不需要在内网网关和路由器上做任何操作。

   

  另外,你也可以通过Xshell、Putty等工具来实现linux主机与本地windows的端口转发、socket代理,还有一些像ProxyChains 工具的使用。

 

推荐链接:

通过ssh开启代理[1]xshell开socket代理:http://jingyan.baidu.com/article/3052f5a1b4dc2797f21f866d.html

通过ssh开启代理[2]xshell进行端口转发:http://jingyan.baidu.com/article/09ea3ededbb6b6c0aede39d2.html

通过ssh tunnel访问内网Subversion:http://crazycode.iteye.com/blog/568754

Xshell通过SSH密钥、SSH代理连接Linux服务器详解:http://hi.baidu.com/kdsex/item/40205cc30a84d052ac00ef56

 

转载于:https://www.cnblogs.com/williamjie/p/9684684.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5d4的白平衡模式_佳能5D4/5D3/6D2系列中高端单反相机和全画幅微单EOS R专题系列课程...

【相机市场谁老大?佳能连续18年全球可更换镜头相机市场份额第一】佳能宣布,从2003年到2020年佳能连续18年全球可更换镜头相机市场份额(台数)第一名,包括数码单反以及微单相机。2019-2020年数码相机市场的销售情况。可更换镜头相机中&#xff…

实例55:python

#题目&#xff1a;学习使用按位取反~ #1)先使a右移4位。 #(2)设置一个低4位全为1,其余全为0的数。可用(0<<4) #(3)将上面二者进行&运算。 #!/usr/bin/python -- coding: UTF-8 -- if name ‘main’: a 234 b ~a print (‘The a’s 1 complement is %d’ % b) a …

jQuery 简单案例

案例一&#xff1a;全选、反选、取消实例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><input type"button" value"全选" …

实例56:python

#题目&#xff1a;画图&#xff0c;学用circle画圆形。 #usr/bin/env python #coding:utf-8 if name ‘main’: import turtle turtle.title(“画圆”) turtle.setup(800,600,0,0) penturtle.Turtle() pen.color(“yellow”) pen.width(5) pen.shape(“turtle”) pen.speed(…

JAVA之运算符优先级

Java运算符优先级从高到低 运算符结合性[ ] . ( ) (方法调用)从左向右! ~ -- (一元运算) -(一元运算)从右向左* / %从左向右 -从左向右<< >> >>>从左向右< < > > instanceof从左向右 !从左向右&从左向右^从左向右|从左向右&&从左…

5 html 根据手机转动而转动_手机安装陀螺仪有什么用 手机安装陀螺仪作用介绍【详解】...

手机中有各种传感器&#xff0c;其中陀螺仪是个听起来高大上的玩意&#xff0c;今天小编就来给大家科普一下&#xff0c;陀螺仪在手机中的具体应用及其原理。 陀螺仪(角速度传感器)它的测量物理量是偏转、倾斜时的转动角速度。在手机上&#xff0c;仅用加速度传感器没办法测量或…

实例57:python

#画直线 import turtle def drawline(n): tturtle.Pen() t.color(0.3,0.8,0.6) #设置颜色&#xff0c;在0–1之间 t.begin_fill() #开始填充颜色 for i in range(n): #任意边形 t.forward(50) t.left(360/n) t.end_fill() #结束填充颜色 drawline(4)

光谱 波长_【第三课】红外光谱仪及其联用技术

第三课前两节课&#xff1a;【第一课】什么是红外光谱方法、【第二课】如何进行红外光谱结构解析&#xff0c;孙素琴教带我们学习了红外光谱的前世今生&#xff0c;以及红外光谱的理论基础。相信小伙伴们都有所收获&#xff0c;今天咱们将跟随另一位清华大学红外光谱专家周群老…

实例58:python

#画方块 #!/usr/bin/python -- coding: UTF-8 -- from turtle import * forward(100) left(90) forward(100) for i in range(2): left(90) forward(100)

WPF 蒙罩层 LoadingPage

WPF 蒙罩层 LoadingPage 原文:WPF 蒙罩层 LoadingPageWPF 蒙罩层 LoadingPage 前言 无论是在PC客户端&#xff0c;移动端&#xff0c;网站&#xff0c;在遇到长时间处理的时候都会需要用到蒙罩层&#xff0c;让用户有更好的体现。今天上网逛了一下各位前辈网友的蒙罩层的实现方…

前端对所有文件请求添加header_【前端面试必问】浏览器缓存原理?送你满分答案...

(本文适合所1-3年的前端阅读)原文链接&#xff1a;http://blog.poetries.top/2019/01/02/browser-cache/一、浏览器缓存基本认识分为强缓存和协商缓存浏览器在加载资源时&#xff0c;先根据这个资源的一些http header判断它是否命中强缓存&#xff0c;强缓存如果命中&#xff0…

实例59:python

#题目&#xff1a;计算字符串长度 #!/usr/bin/python -- coding: UTF-8 -- sStr1 ‘strlen’ print (len(sStr1))

华为做raid5步骤_华为验厂验厂流程如何?主要内容是什么呢?

华为作为民族企业是全球领先的信息与通信技术(ICT)解决方案供应商&#xff0c;消除数字鸿沟&#xff0c;促进经济、环境和社会的和谐与可持续发展是华为一直以来的可持续发展愿景。为此&#xff0c;华为不仅支持联合国可持续发展目标的实现&#xff0c;还同时与供应链上下游的客…

实例60:python

#题目&#xff1a;打印出杨辉三角形&#xff08;要求打印出10行如下图&#xff09;。 #!/usr/bin/python3 def Pascal(n): ls [[1]] for i in range (1, n): ls.append([1]) for j in range(1, i): ls[i].append(ls[i-1][j-1] ls[i-1][j]) ls[i].append(1) for i in range(0…

FUI- 我离钢铁侠还差几步?

本文来自网易云社区作者&#xff1a;马宝什么是FUI本文不累赘的可以自行Google&#xff0c;喜欢科幻的同学们都看一张图就能感受到FUI的魅力。本文算是一篇所见即所的&#xff0c;可边学边干的原创教程。总结全文就一句话&#xff0c;“让结构和表现分离&#xff0c;自下而上的…

亿嘉和机器人上市了吗_亿嘉和上半年收入持续增长,拟7亿元定增加码主业研发...

《电鳗财经》 赵超/文作为国内机器人行业中重要成员之一的亿嘉和(603666.SH)&#xff0c;在深耕省内市场、持续拓展省外市场的策略下&#xff0c;上半年收入延续一季度增长态势。《电鳗财经》注意到&#xff0c;在公布半年报的同时&#xff0c;亿嘉和也抛出了7.08亿元的定增方案…

实例61:python

#题目&#xff1a;查找字符串 #!/usr/bin/python -- coding: UTF-8 -- sStr1 ‘abcdefg’ sStr2 ‘cde’ print (sStr1.find(sStr2))

dft计算傅里叶级数系数_一道国外的DFT性质的题目

由于上半年实在太忙太忙&#xff0c;所以导致很久没更新公众号了&#xff0c;特意向各位长期关注的小伙伴表示歉意。今天分享的是DFT性质的应用。背景&#xff1a;DFT的对称性在解题中是非常常见的&#xff0c;很多同学&#xff0c;一看到“实序列”就感觉无从下手。然而它却是…

实例62:python

#输入3个数a,b,c&#xff0c;按大小顺序输出。 #!/usr/bin/python -- coding: UTF-8 -- if name ‘main’: n1 int(input(‘n1 :\n’)) n2 int(input(‘n2 :\n’)) n3 int(input(‘n3 :\n’)) def swap(p1,p2):return p2,p1if n1 > n2 : n1,n2 swap(n1,n2) if n…

扩容是元素还是数组_Map扩容源码

首先我们运行一段代码&#xff1a;此时运行&#xff0c;程序正常&#xff0c;接下来我们将注释放开&#xff1a;此时运行发现&#xff0c;OOM了&#xff1a;为什么new出来HashMap的时候并没有报OOM&#xff0c;而是在第一次进行put操作的时候才报的OOM&#xff1f;我们来看下ma…