SSH Tunnel 之突破 GFW 整体解决方案

  在不能使用代理服务器或者tor绕开防火长城的场合(比如单位里面不可以使用非企业代理,比如日后tor被土共封锁),如果ssh 22端口没有被封锁,那就可以利用OpenSSH强大的tunnel功能来实现高速安全的访问Internet任意开放网站的任意开放端口 。在这里简称挖地道。

  1、准备条件:

  1.1、某国外主机shell,这个需要你自己去找,买一个或找找一个免费的,需要上面的开启sshd;

  1.2、Firefox浏览器配合foxyproxy扩展,虽然用IE也方便,但是当大多数网站不需要挖地道访问只有个别网站需要挖地道访问自己又是懒人懒得每次访问blocked网站去切换浏览器的代理设置的情况下,用foxyproxy这个基于模版自动匹配代理的扩展还是很方便的;

  1.3、国外代理服务器,任意一个高速匿名免费代理服务器。

  2、原理:

  2.1、首先man ssh,注意ssh的manpage里面这也一个选项:

  -L port:host:hostport

  Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side. This works by allocating a socket to listen to port on the local side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to

  host port hostport from the remote machine. Port forwardings can also be specified in the configuration file. Only root can forward privileged ports. IPv6 addresses can be specified with an alternative syntax: port/host/hostport

  2.2基本格式

  ssh -l USER -L local_port:any_host_blocked_by_gfw:the_blocked_hosts_port ssh host_which_out_of_gfw

  这样任何被屏蔽的主机(any_host_blocked_by_gfw)的任何端口(the_blocked_hosts_port),就可以在本机127.0.0.1的localport访问了

  2.3、解释,这里有好几个host不要搞错。

  ssh -l USER是你用来登录目标ssh主机的用户名,ssh就加上一个-l选项

  local_port:本机的某端口,最好大一些,保证没有被其他程序占用的,以后被屏蔽主机的某端口就被映射在本机的此端口

  any_host_blocked_by_gfw:任何一个被gfw干了的主机,比如zh.wikipedia.org

  the_blocked_hosts_port:前面提到的被干了的这个主机的某个端口,比如25 23 80

  host_which_out_of_gfw:任何一台不在土共的GFW范围内的ssh host

  2.4、例子:

  ssh -l fuckGFW 8088:zh.wikipedia.org:80 fuckgfw.free.com

  我用fuckGFW帐号登录fuckgfw.free.com主机,并且把维基百科中文的80端口映射到本机的8088端口,这样下次用[url]http://localhost:8088[/url]来访问维基百科

  3、应用:

  每次去挖这样一个坑麻烦了点,这时候就要动动脑筋想想别的办法了。普通的代理服务访问国外主机虽然会被土共的gfw盾,但是,如果把普通国外代理服务器加上一个ssh的套套,那土共的GFW就煞笔了,而且即使土共把这个代理服务器本身干了也没用,因为我们的国外ssh host和国外的代理服务器都是在GFW之外的,那就是终极解决方案:

  用ssh tunnel给国外代理服务器加套

  例子:

  ssh -l fuckGFW 3128:proxy.anywhere.com:8080 fuckgfw.free.com

  按照提示输入fuckGFW帐号在fuckfw.free.com主机的密码,然后保持这个ssh连接不要关掉,这样就给国外的代理服务器proxy.anywhere.com加了套,然后在本地的浏览器设置代理为localhost:3128,那么只要你到fuckgfw.free.com的连接是22端口的ssh加密连接,土共就对你的内容无可奈何。

  至于fuckgfw.free.com和proxy.anywhere.com之间是不是加密的会不会监听,目前看来似乎是不加密的(否则我在防火墙内我的本机开一个ssh再加上一个squid就可以访问任意国外主机了),所有这样做还是有风 险,千万不要用这样的方案访问你的paypal帐号gmail等等。但是用来绕开防火墙,正常使用google是足够了,访问blogspot wikipedia等等也没有问题。

  此方案的突出几个优点:

  a:不需要在ssh主机上面安装软件,这样需要相对较少的ssh shell权限,很多免费的国外ssh主机就可以达到这个要求。

  b:不需要在ssh主机上面开允许连入的端口,这样也可以减少对ssh 主机的需求,很多ssh主机只允许22端口连入时,我们这个方法也可以奏效,以上面的例子,3128端口是开设在你自己使用的client 机器的,8080端口是开设在代理服务器proxy.anywhere.com的,ssh主机上面并没有开设额外的端口,还是只有一个22端口。当然,ssh主机应该可以访问intenet的任何端口,这个应该不是问题的吧。

  c:安全。开设在client的端口默认是只允许client本机访问的,同一局域网无法访问,除非你调整ssh client的设置。而且前面提到的,主机上面除了原先的22端口也不开设任何额外的端口,非常的安全。也避免了自己秘密安装的防火墙被其他人透露后带来流量激增的问题。

  d:专门针对GFW的关键字过滤,这个方法同其他的绕开GFW主机方案比如在你购买的国外主机安装Phpproxy等等最大的不同和优点在于此。防火墙最难对付的地方并不是直接block主机地址,而是当访问国外主机返回的字符中有所谓敏感字词的时候给你来个链接重置,非常的讨厌。用普通的代理服务器(无论是国外的还是你自己安装的还是pkblogs.com等等这种类型的) 可以轻松的绕开GFW对block主机地址的屏蔽,但是当有敏感字词的时候还是难逃法眼。而这个方法,由于从你的client到ssh host之间是ssh密文传播的,GFW无能为力。

  4.To Do

  通常网上容易找到的代理服务器都是只支持http的,支持https的还没有找到,所以访问https的内容比如gmail还是没有好的解决方法,目前只能设置一下foxyproxy直接访问https的内容(或者用tor),还有一个办法就是再挖一个通道,把gmail的pop服务器的端口和smtp直接映射在本地的某端口,宁可暂时放弃一下gmail web的丰富feature,也要不受限制的访问google的服务。注意,在ssh到一台主机的时候,可以同时挖n条隧道的,也就是可以在ssh命令后面加上n个-L 参数。

  5.补充

  使用windows操作系统的也可以用此方法,putty对ssh的tunnel有完美的支持。

  抓图一张作为例子,第一行是我自己用的http代理,马赛克一下,hoho,第二行和第三行把gmail的pop.google.com和smtp.google.com的端口加了ssh的套套分别映射到了本机的995和587端口,下面正在填写的那个是一个例子,把国外代理服务器的anyproxy.abroad.com的8080端口加ssh套套映射到本地的5088端口,供浏览器作为代理服务器 localhost:5088使用。