SSH的HTTP代理设置

我想ssh一台远在美国的虚拟主机。但是公司里为了访问外网需要通过一个http代理(http://proxy.mycompany.com:8080)。如果我在 Windows 下工作,可以用 putty 这样的 ssh client,因为它支持设置 http 代理。但是如果在 Linux 或者 Windows/Cygwin 下用 OpenSSH,就需要一个第三方程序来帮忙了。我在 Cygwin 下尝试用了 Corkscrew,挺好用的。

安装 Corkscrew:
下载 corkscrew 的源码包,解码,编译,安装:

tar -xzvf corkscrew.tar.gz
# [..]
cd corkscrew
./configure
make install

配置SSH客户端
修改~/.ssh/config,在其中添加一下内容:

Host *
  ProxyCommand path-to-corkscrew proxy.mycompany.com 8080 %h %p

注意:proxy.mycompany.com 8080需要被替换成实际的http代理服务的主机名和端口号。
还需要注意设置 ~/.ssh/config 的访问权限:

chmod 600 ~/.ssh/config

设置http代理的口令
如果http代理需要用账户和口令来认证,可以把账户和口令存在文本文件~/.ssh/proxyauth里,格式是:

username:password

然后修改~/.ssh/config

Host *
  ProxyCommand path-to-corkscrew proxy.mycompany.com 8080 %h %p ~/.ssh/proxyauth

这样就让 corkscrew 知道口令和密码了。

试试看
连接一下远程机器(比如叫remote.machine.com):

ssh username@remote.machine.com

在http代理上再打通一层socks代理
用这个命令建立一个ssh tunnel:

ssh -D 12345 username@remote.machine.com

然后把你的浏览器(或者其他会访问Internet的程序)的代理设置成:

  1. 类型:socks5
  2. 主机名:127.0.0.1
  3. 端口号:12345

这样就在开放的http代理之上,利用ssh形成了一个安全的(加密的)socks5 proxy。