SSH通过代理访问香港服务器

618的时候在良心云上买了一台香港轻量应用服务器,最近不知道什么原因,用VS Code的Remote SSH连接这台服务器经常掉线,或者干脆连不上。考试到购买时的提示中国香港地域提供的带宽主要面向东南亚地区的用户,从中国内地访问时可能出现较大延迟和丢包。,于时尝试让SSH通过代理去连接这台服务器,折腾了好久终于实现了,目前观察连接还是比较稳定,特地记录一下过程。

升级OpenSSH

我用的系统是Win10,系统自带的ssh版本是8.1,8.1版本的ssh不支持ProxyCommand选项。ssh本身是不支持通过代理服务连接,需要借助ProxyCommand选项去调用外部工具实现,可选的有connect,ncat,nc等等。
首先在Github上的OpenSSH项目的Release页面下载最新的OpenSSH,例如我是64位系统,则下载OpenSSH-Win64.zip。下载后解压到任一目录,然后修改系统环境变量,将解压目录添加到Path环境变量中。注意必须要将新的路径添加到系统默认OpenSSH路径的上面,如下图所示:

SSH通过代理访问香港服务器

添加完成后重启电脑环境变量才会生效,可以在命令行窗口输入命令ssh -V来检查ssh的版本。

测试代理

我们先在命令行窗口测试一下ssh使用代理的命令,成功后再配置到ssh的配置文件中供VS Code的Remote SSH插件使用。
我这里连接代理服务使用的是connect.exe程序,因为系统上安装了Git(基本每个开发都会装),Git自带了connect.exe程序,拿来直接用就完事了。在命令行窗口输入以下命令:

ssh -o ProxyCommand="e:\software\connect.exe -S 127.0.0.1:7890 %h %p" xx.xx.xx.xx

注意,在ProxyCommand选项值中,connect.exe需要填写完整的文件路径(除非你在环境变量Path中配置了),并且路径中不能有空格,我的因为有空格,所以单独复制出来放到一个没有空格的目录了。后面的-S参数表示使用socks协议,如果要使用http协议,则要改用-H参数;再后面的IP和端口表示代理服务的地址,最后的 %h%p 是固定写法,直接填上就行了。整个ProxyCommand选项值需要用双引号包围起来。
如果使用上面的命令通过代理服务器成功访问了目标服务器,那么恭喜你,可以直接跳到最后一步修改配置了。不过我在这里遇到了另一个问题,执行命令后,返回了

kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535

这样的错误。初看之下,好像是ssh登录使用的密钥不对,但是如果不通过代理登录是没有问题,所以可以排除这个原因。经过多番搜索,终于在这个帖子找到了原因:原来很多代理服务提供商为了安全,都阻断了对22端口的代理,而ssh默认就是使用22端口的,为了规避这个问题,我们需要在目标服务器上增加ssh的监听端口。

增加监听端口

为了兼容以前的服务,我们不直接修改默认的ssh的22端口,而是新增一个监听端口。修改/etc/ssh/sshd_config配置文件,找到Port 22这行注释掉,然后在下面添加两行:

ListenAddress 0.0.0.0:22
ListenAddress 0.0.0.0:4444

第二行的端口设置为你想要的端口号就可以,不用跟我的一样。
执行命令service sshd restart重启一下ssh服务使配置生效。最后执行命令netstat -nltp|grep ssh检查一下新增监听端口是否成功,如下图所示:

SSH通过代理访问香港服务器

最后不要忘了在服务器的控制台修改防火墙设置,放行新增加的端口。

修改配置

上面的步骤都确认成功后,我们就可以修改用户目录下的.ssh/config文件,配置让ssh登录某台服务器时走代理,一个示例配置如下:

# 主机名,随意
Host HK01 
  # 主机IP,目标服务器的IP地址
  HostName xx.xx.xx.xx
  # 登录用户名
  User root
  # 密钥文件
  IdentityFile  ~/.ssh/id_rsa
  # 代理命令,上面有详细介绍
  ProxyCommand "D:\Program Files\Git\mingw64\bin\connect.exe" -S 127.0.0.1:7890 %h %p
  # 新增的ssh端口
  Port 4444
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!