无拘无束的猪

一只无拘无束会飞的猪
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

SSH实现隧道功能穿墙

Posted on 2015-05-13 10:34  无拘无束的猪  阅读(7174)  评论(0编辑  收藏  举报

Putty和SSH tunnel

目前寻求FQ的方式无非就几种: 

  1. 寻找web代理(这个可以进我放置的在线代理进行测试)
  2. 自行寻找http/sock5代理(这个可以去网上搜索代理ip)
  3. vpnFQ(目前可以自行架设vpn服务器,或者用外国的免费vpn服务,可见:免费实用简单的国外VPN-UltraVPN)
  4. ssh 加密隧道转发sock5代理(本文所提)

 

原理:

  SSH客户端连接SSH服务器采用的是22号端口。然后在这个通过22号端口建立的连接上,客户端和服务器可以互相进行通信,这便是SSH的22号端口的一般功能。

除了上面的SSH连接的一般功能之外,SSH服务器还支持另外一种神奇的通信方式,就是在SSH连接上承载另外端口的连接。这个功能读起来比较复杂,其实很简单。

比如,http服务器开放80端口来让客户连接,客户通过与服务器上的80端口直接建立一个通道用来与服务器进行http通信。这也是http通信的一个最最普遍的形式。

但是,我们还可以使用SSH服务器,不使用直接连接的方式,而是用另外一种比较怪异的方式来和服务器建立起80端口的连接通道。

  客户端不直接跟服务器的80端口建立一个连接通道,反而是和服务器的22端口建立一个连接通道,但是在这个22端口的连接通道中,建立一个子连接通道,这个子连接通道是用来访问服务器的80端口。也就是说,在22号端口上建立的连接,传输的数据不是22号端口本来的数据,而是与服务器的80端口通信的一整条的连接通道。

  在与服务器的22端口建立的大的通道中,又包裹了一个与服务器的80端口的小连接通道。

SSH的这个功能就是所谓的SSH隧道,也即SSH Tunnel.使用“隧道”这个词还是很贴切的,因为数据不是直接跟服务器建立连接,而是在已经建立号的22号端口的隧道中建立跟服务器的连接。

 

这意味着,我们能通过连接主机A的22号端口,所实现的功能是访问另外一台主机B的80端口。实现穿墙

 

所需的工具

  1. 一个SSH客户端软件,用来连接SSH服务器的,一般我们使用putty软件
  2. 一个能够设代理服务器的网络浏览器基本上所有的浏览器都满足这个要求,firefox,chorme,IE….
  3. 一个SSH服务器。并不是所有的SSH服务器都能够让我们用来FQ,还需要满足三个条件:
  • 这个SSH服务器能够允许我们连接,或者说这个SSH服务器本身并没有被墙屏蔽掉,而导致我们连访问这个SSH服务器都不可能,那么说什么都是白搭了。
  • 这个SSH服务器能够连接上墙外的世界,如果它不能连接墙外的世界,那么我们既是用SSH隧道技术连接上它,也没辙。(一般来说,只要这个SSH服务器是在国外的,那么就都是可以用来FQ,同样的,国内的提供SSH连接的服务器,比如unix-center,就不能用来FQ,因为服务器本身就是在墙内)
  • 这个服务器允许客户端,也就是我们,进行SSH隧道(ssh tunnel)的操作,很多国外的服务器,虽然提供ssh接入功能,但是其不提供ssh tunnel服务,那么这些服务器对FQ来说,还是废柴。

但是欣喜的是,我们找到了一个同时满足上面三点要求的SSH服务器提供商,而且是免费的。就是www.cjb.net.使用这个网站提供的ssh功能,就能够轻松进行FQ作业了!

技术优势

使用SSH隧道方法的技术优势在于,只要22号端口没有被屏蔽,我们就能够利用这个22号端口作为隧道,开辟出各种天地,用它来连接http,ftp,qq,msn等。

这在公司灰常的有用,公司内部为了管理员工的网络使用,很多的端口都被屏蔽了,qq之类的热门端口都会被屏蔽。有了SSH隧道,所有被屏蔽的端口,我们都能够找回来!

还有一个优势就是SSH建立的连接都是经过加密的,所以,保密性会比较好一点

 

        

 

                   

                            

注意,你的终端期间是不能关的,关了后代理就失效了,如果想关终端的话,就要用putty里面的plink.exe,以命令行方式运行 plinkusername@hostname -C -D 127.0.0.1:8088(username就是你的登录帐号,hostname是服务器的地址),后面的8088是你自己定义的端口号。-C 表示允许压缩。-D 表示基于SOCKS的动态端口转发。根据提示,输入你的密码。不要关闭这个窗口,否则通道就关闭了。为了避免因为过久没有数据传输而连接被中断,你可以在窗口输入一条这样的指令,让它保持连接:ping google.com -i 60 (-i 60 表示每隔 60 秒才 ping 一次)。

        在使用SSH做代理的时候,发现一个问题,就是其他所有网站都能打开,但Youtube和http的Facebook打不开。  后来发现,原来某些网站的域名会被DNS劫持,使用SSH代理也无法解决,必须更换DNS服务器。  解决的方法是,域名不使用本地解析,而使用服务端来解析,对于Firefox来说,在 about:config 改成 network.proxy.socks_remote_dns=true 就可以了。