配置远程桌面反向链接[利用SSH中继]

基本情况

  1. 一台可联网的Windows计算机(Windows客户端),已启用远程桌面服务,但是其位置不确定,用户也没有配置路由器的权限(本文以安装了Putty的Windows 10计算机为例)
  2. 一台Linux服务器,可以通过互联网访问其SSH服务(本文以安装了OpenSSH的Debian服务器为例)

需求

使上述Windows客户端可以通过远程桌面访问

配置步骤

1、测试使用如下命令链接到SSH服务器

plink.EXE -i Path\of\Your\PrivateKey.ppk username@domain.com -P 3333 -R 3389:localhost:3389 -N

本命令采用了公钥身份验证的方法(-i),同时指定ssh客户端链接到自定义端口3333 (-P)(而不是默认的22)。参数-R是关键,该参数指示plink监听ssh服务器的3389端口并转发到客户端的3389端口。-N表示不启动shell。

2、在ssh服务器上,需要修改sshd_config,在该文件的底部,加上:

Match User username

GatewayPorts yes

该配置允许用户username链接到ssh服务器后监听外网

3、其他注意问提包括注意正确配置防火墙(包括windows防火墙,杀毒软件防火墙,linux上的防火墙等)与重启OpenSSH使设置生效

4、检查链接,配置完成OpenSSH后,尝试执行第一步所述命令,然后用另外的ssh客户端,例如putty登录到服务器,输入netstat -tunap,应当可以发现类似如下的一行,即sshd正在监听指定的端口

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp    0 0 0.0.0.0:3389              0.0.0.0:*               LISTEN 888/sshd: username

5、如无意外,完成上述配置后,外网用户就可以通过访问服务器IP/域名+端口号来访问客户端的远程桌面

6、进阶配置:上述配置存在一个重大缺陷,如果客户端意外失去网络连接,那么plink就会提示连接已断开,即使往后网络连接恢复,该反向连接也不会恢复。解决这个问题的一个方法是,使用批处理反复运行plink:

:loop
plink.EXE -i Path\of\Your\PrivateKey.ppk username@domain.com -P 3333 -R 3389:localhost:3389 -N
timeout /t 300
goto loop

将上述指令保存成bat文件,在需要建立反向连接的时候运行它,而不是直接执行指令,即可。该批处理会在plink退出(基本也就是意味着网络断开)后5分钟尝试重连。不过根据笔者的测试,即使重连成功,反向链接也并不总能成功建立。可能是因为网络意外断开的话上次的连接缓存之类的没刷新。确保成功建立的方法是在第一次重连后,重启Linux服务器以重置OpenSSH。这样一来,重连了的反向连接会再次断开并在五分钟后重新执行一次全新的连接(第二次重连),这样的反向连接,根据笔者测试,就总是可用的。

本文参考了下述两篇文章(特别是第一篇):

  1. http://blog.phpdr.net/ssh%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E8%BF%9E%E6%8E%A5%E8%BF%9C%E7%A8%8B%E6%A1%8C%E9%9D%A2.html (只有中文版)
  2. https://blog.netspi.com/how-to-access-rdp-over-a-reverse-ssh-tunnel (只有英文版)

发表评论

电子邮件地址不会被公开。 必填项已用*标注