ssh使用代理

ssh 使用代理

很久之前,学校 IT 以信息安全为理由封禁了校园网的几个常用端口。

这也导致学校服务器的ssh访问从22变更到了22112端口。

在被封掉了22端口的出口访问之后,我遇到了个麻烦,公司给的服务器是使用22端口的,我不能在校园网内直接登录了。

既然说特殊需求请联系,就打电话问了一下,结果让我自己改掉服务器的端口。这要是我自己的云服务器就直接改掉了,可是公司,我又是个兼职人员,不好意思提需求。

Solution

第一个解决方案是,使用数据网。把ip换掉,数据网的ip不会被拦截。这样凑合了一阵,发现还是有些麻烦,要切换网络,而且数据网下有些文献是打不开的,十分影响工作效率。

一次跟朋友聊天,聊到这个事,然后他给了我第二个解决方案,使用代理。

代理

当机器A与机器C由于隔离限制不能直接ssh连接时,可以通过机器A登录机器B,然后在机器B上ssh登录到机器C。机器B在此过程中充当代理,

我们当然不希望手动进行两次ssh,所以ssh命令提供了ProxyCommand选项,用于直接完成代理机制。

当我们拥有服务器B时,比如一个云服务器,将其登录端口改为10000。

然后,在ssh config文件中编辑如下内容:

Host BHostName serverBUser userPort 22IdentityFile ~/.ssh/id_dsaHost CHostName serverCUser user Port 10000IdentityFile ~/.ssh/id_rsaProxyCommand ssh -W %h:%p B

ssh C就会成功。此处,ProxyCommand使用ssh连接作为代理,要求建立与B的ssh连接,并将数据转发到C上。

-W host:port

Requests that standard input and output on the client be forwarded to host on port over the secure channel.

%h和%p扩展成C的hostname和port。

在没有云服务器时,如果购买了科学上网的服务,也可以将其与国外服务器的socks4/socks5/https通信作为代理。

我的服务是socks5协议,地址为127.0.0.1:10808。

ssh config内容如下:

Host CHostName serverCUser userPort 22IdentityFile ~/.ssh/id_rsaProxyCommand nc -X 5 -x 127.0.0.1:10808 %h %p

在这里,ProxyCommand使用了nc命令提供的连接,-X指定协议,4 (SOCKS v.4), 5 (SOCKS v.5) connect (HTTPS proxy),-x指定地址,最后的%h%p指定数据传输的目标。

实现

windows上默认没有安装nc,可以选择安装netcat[1],或者使用wsl,wsl默认提供了nc命令。

也可以选择使用xshell。

在会话的属性中,连接下选择代理,然后点击浏览,添加一个如图所示的代理。然后选择该代理作为代理服务器。

便可完成连接。

我是 SSSimon Yang,关注我,用code解读世界

References

[1] netcat: