TOC

SSH 打洞

网络代理是一种常见的网络技术,其中 SSH 由于其普遍性,用来代理是最顺手不过的。

助记:

  • DLR 独立日, 分别对应三种最常见的代理模式 Dynamic, Local, Remote
  • ProxyPort:DestHost:DestPort User@ProxyHost

比如有三台机器 A, B, C, 其中 A 是本地机器,B 是代理机器,C 是目标机器(注意:A,B,C 可以是同一台机器,或者其中任意两个是同一台机器):

  • 在本地机器上建立隧道,代理机器做跳板,将本地端口绑定到目的机器端口:
// A:80 => B => C:80
ssh -L 80:C:80 root@B
  • 将代理机器的指定端口绑定到目的机器:
// B:80 => C:80
ssh -R 80:C:80 root@B

上面两种都是端口映射模式,应该能够满足所有端口对端口的代理。
最后的 -D 就是动态代理,类似 NAT,将发往指定端口的数据转发到出去。

ssh -D 80 root@B

这个时候,如果设置系统网络代理为 socks5://B:80,然后本地的所有网络请求都会经过 B 中转,比如我访问 C:80,C 服务器接受到的是来自 B 的访问。
PS: 这个 socks5 要是展开带另起一篇,这里就只需要知道,这种代理的方式有一个专门的名字叫 socks 就行了。

如果在 Windows 上,PuTTY 就是一个很好的 SSH 客户端,也可以从来建立代理,这就不展开讲了。
下次我研究研究 PuTTY,另外再发一篇文章。

Update @ 2021-10-01:

  1. 有一些 Linux 命令直接支持 socks5 代理,比如 wget, curl。
  2. 编程时,发起网络请求也可以设置 socks5 代理。

Update @ 2016-09-16:

Update @ 2017-06-09: