用ssh突破公司http代理

公司出于安全考虑一般都通过防火墙将内网和外网隔离开来,然后为了控制监控员工的上网行为,架设专门与外网交互的代理,所有的电脑要想上网必须通过这个代理。代理的形式一般是HTTP和HTTPS的,这样做不仅可以限制员工上哪些网站,还能看上网在干啥,http是完全透明的,没有隐私。
作为一个技术人员,我们是不能容忍上网被限制和监控的,怎么办,代理!可以代理的前提是,你要能与外界互通,而现在只能通过公司的http代理与外界互通(当然,你可以突破公司的这种代理限制,另寻与网络互联的方法,不过这种从风险和技术角度来说都有点太过了),所以代理必须能基于http才行。常用的代理是ssh的socks,有没有方法可以在http上打通一层socks通道呢,有,Corkscrew就是专门来干这事的,官方主页的介绍 “Corkscrew is a tool for tunneling SSH through HTTP proxies”,这正事我们想要的。

背景故事讲完了,下面说说如何用这个螺丝锥(Corkscrew)在http上钻出一条socks通道出来。

前提条件
1、外网有一台支持sshd服务的服务器,一般的linux vps是肯定有的
2、sshd服务监听在443或者80端口(因为公司的http代理一般只允许访问外网的80-http或443-https服务,如果你的vps本身就用到这2个端口的话,考虑端口复用
3、本地有一台linux(因为我是在linux下面配的,Windows应该也可以,用putty,因为putty配置里有基于其它代理的配置选项)

首先从corkscrew下载最新的代码来编译安装喽
[code lang="bash"]
wget http://www.agroman.net/corkscrew/corkscrew-2.0.tar.gz
tar zxvf corkscrew-2.0.tar.gz
cd corkscrew-2.0
./configure
make install
[/code]

然后配置~/.ssh/config文件了
如果要让所有ssh登录都走代理的话(一般也是这种情况)
[code lang="bash"]
Host *
ProxyCommand corkscrew http-proxy-server-address 80 %h %p
[/code]
当然,也可以只上部份ssh登录,只须指明host就行了
[code lang="bash"]
Host external.com example.com
ProxyCommand corkscrew http-proxy-server-address 80 %h %p
[/code]
host也支持一些正则匹配,这是ssh config 文件的语法,这里就不详细说明了

配置改好后就可以登录外网的vps啦
[code lang="bash"]
ssh -D 7070 -p 443 username@vps-address
[/code]
然后就可以在本地用7070这个socks端口,随便访问什么网站了,使用任何端口了,例如使用git。

最后一步也可以写到配置文件里
[code lang="bash"]
Host vps-proxy
HostName vps-address
User username
PreferredAuthentications publickey
IdentityFile ~/.ssh/vps-host.ira
DynamicForward 0.0.0.0:7070
Port 443
[/code]
不过这个配置要写在 corkscrew 配置的前面,配置文件默认是找到第一个名字匹配的就不往下找了。
参考:
Tunneling SSH over an HTTP-Proxy Server
Corkscrew offical site
Disable corkscrew for local addresses

2 thoughts on “用ssh突破公司http代理

  1. Pingback: irssi在http代理条件下登录irc聊天室 | 山羊博客

  2. Pingback: http代理环境下使用github | 山羊博客

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>