SSH 隧道作为代理

介绍一种基础的,紧急情况下可使用的,以 SSH 隧道作为代理使用的方法。

近期机场速度和延迟有明显的劣化,出于给自己留个后路的想法,并且尽量减少可能存在的机场跑路事件对我日常上网的冲击,就想着有什么办法能多找几个备用的代理服务器。一个方法是多买几个机场的服务,但是这个方法太耗资金了;另一个方法是自建代理服务,但是现有的加密代理协议除了 trojan,我都不大信任,但是 trojan 又需要一个 443 的端口,而我手头的 VPS 的 443 端口已经被占用了,虽然有复用端口的方法,但是我并没有能够成功实现过。出于这些原因,所以我一直没有在 VPS 上部署代理服务。

前段时间,为了在实验室访问寝室内的NAT下的nanopi,我折腾了一下SSH的转发功能,然后发现SSH有动态转发的选项。基于这个功能,我就可以很容易把 VPS 作为一个临时的代理服务器,所需要的操作也很简单

1
2
3
# ${LOCAL_PORT} 是本地的端口,数据从这个端口转发到远程计算机
# ${REMOTE_SSH_PORT} 是远程 VPS 的 SSH 端口,默认为 22
$ ssh -D ${LOCAL_PORT} -p ${REMOTE_SSH_PORT} user@remote_IP

成功 ssh 上之后,设定本地的代理服务器为 127.0.0.1:${LOCAL_PORT} (socks 协议)就能够访问外网了,所有本机的流量都会通过远程机器转发。

代理的流量走的是 SSH 协议,所以在保证了安全性的同时,也不同担心偶尔使用被封端口(谁没事封 SSH 啊),唯一的缺点可能就是不能根据规则对流量进行选择性转发了。不过作为一个临时性的代理服务器,也足够我在机场跑路的一段时间内找到下一个机场了。