公司出于安全考虑一般都通过防火墙将内网和外网隔离开来,然后为了控制监控员工的上网行为,架设专门与外网交互的代理,所有的电脑要想上网必须通过这个代理。代理的形式一般是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下载最新的代码来编译安装喽
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
然后配置~/.ssh/config文件了
如果要让所有ssh登录都走代理的话(一般也是这种情况)
Host *
ProxyCommand corkscrew http-proxy-server-address 80 %h %p
当然,也可以只上部份ssh登录,只须指明host就行了
Host external.com example.com
ProxyCommand corkscrew http-proxy-server-address 80 %h %p
host也支持一些正则匹配,这是ssh config 文件的语法,这里就不详细说明了
配置改好后就可以登录外网的vps啦
ssh -D 7070 -p 443 username@vps-address
然后就可以在本地用7070这个socks端口,随便访问什么网站了,使用任何端口了,例如使用git。
最后一步也可以写到配置文件里
Host vps-proxy
HostName vps-address
User username
PreferredAuthentications publickey
IdentityFile ~/.ssh/vps-host.ira
DynamicForward 0.0.0.0:7070
Port 443
不过这个配置要写在 corkscrew 配置的前面,配置文件默认是找到第一个名字匹配的就不往下找了。
参考: