Ssh Over Proxy

 

通过代理使用SSH

由于疫情的缘故,开学的日子遥遥无期。由于校园网屏蔽了常用的端口(如SSH的22端口),而将所有服务器开放端口也会带来一些安全隐患。想了以下几种方法,但也都遇到了一些问题。

方法一:

使用学校官方的VPN。学校官方提供PulseSecureVPN供学生校外访问使用,在连接VPN后也可以顺利的SSH到服务器,但VPN的时延太高,SSH有经常性的卡顿,有时ps -ef甚至要卡顿三四秒才能返回全部结果。

方法二:

设置SSH监听其他不被屏蔽的端口。但是不知道是运营商的缘故还是校园网的策略,几分钟后连接会被reset。

方法三:

在校内搭建httpsocks代理,使SSH通过代理服务访问校内服务器。 linux下可以通过```nc``挂代理。

ssh USER@SERVER -o "ProxyCommand=nc -X connect -x PROXY_SERVER:PROXY_PORT %h %p" # http proxy
ssh USER@SERVER -o "ProxyCommand=nc -X 5 -x PROXY_SERVER:PROXY_PORT %h %p" # socks proxy

或者在~/.ssh/config中进行配置

# http proxy
Host * # or host name here
    ProxyCommand nc -X connect -x PROXY_SERVER:PROXY_PORT %h %p
# socks5 proxy
Host *
    ProxyCommand nc -X 5 -x PROXY_SERVER:PROXY_PORT %h %p

以上,在linux下ssh访问没有问题。在此网络环境系http代理的稳定性看起来会高一些。

但在Windows下使用VSCode的SSH Remote时,VSCode默认使用的是Windows 10中预装的OpenSSH,Windows中默认没有nc(NCat)。遂下载NMap。由于环境变量中没有设置,在ProxyCommand中需要手动指定目录。而Windows下NCAt的参数也与Linux中有所不同。最终配置为

 ssh USER@SERVER -o "ProxyCommand C:\Program Files (x86)\Nmap\ncat.exe --proxy-type http --proxy PROXY_SERVER:PROXY_PORT  %h %p" ssh USER@SERVER -o "ProxyCommand C:\Program Files (x86)\Nmap\ncat.exe --proxy-type socks5 --proxy PROXY_SERVER:PROXY_PORT  %h %p"

或者在C:\Users\[USERNAME]\.ssh中进行配置

# http proxy
Host * # or host name here
  ProxyCommand C:\Program Files (x86)\Nmap\ncat.exe --proxy-type http --proxy PROXY_SERVER:PROXY_PORT %h %p

# socks5 proxy
Host *
  ProxyCommand C:\Program Files (x86)\Nmap\ncat.exe --proxy-type socks5 --proxy PROXY_SERVER:PROXY_PORT %h %p