用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下载最新的代码来编译安装喽

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 配置的前面,配置文件默认是找到第一个名字匹配的就不往下找了。

参考:

Tunneling SSH over an HTTP-Proxy Server

Corkscrew offical site

Disable corkscrew for local addresses

孤独的北山羊 /
Published under (CC) BY-NC-SA in categories GNU/Linux  tagged with corkscrew  http  socks  ssh  内网  通道