0x01 前言

为了方便,我在家中的服务器中配置了一台windows server虚拟机,然后使用pfsense将一个端口对公网开放并将其映射到该虚拟机的RDP端口。这样我无论在哪里都可以通过RDP协议访问家中的服务器,这样能使我有个GUI界面,方便进行一些远程操作。

可我并不信赖RDP的安全性,即使我使用了可靠的数字证书来识别身份:

但我还是担心windows会有其他漏洞导致服务器被渗透或者被爆破攻击。相比之下我比较信赖SSH,那为什么不用SSH做代理,将RDP请求转发到虚拟机上呢?

0x02 配置

首先要准备一台配置了远程桌面的windows系统,然后还需要一台配置了centos系统的虚拟机或电脑。两者在内网中要能互访,至少windows系统的TCP 3389这个端口要能被centos访问。

为了安全起见,我将centos系统的默认SSH端口作了修改并启用密钥验证,然后禁用密码验证:

然后将SSH端口通过pfsense映射到公网中:

0x03 使用

0x03.1 macOS

配置过程非常简单,并不需要使用iptables进行转发。如果你使用的是macOS或其他Linux系统,那么通过以下命令即可连接到远程SSH:

sudo ssh -L [local-listen-port]:[rdp-host]:[rdp-port] [username]@[ssh-host] -p [ssh-port] -i [ssh-key] -N

因为需要在本机监听一个端口,所以需要root权限或使用sudo。上面的参数解释如下:

  • local-listen-port:本地代理端口
  • rdp-host:windows的内网地址
  • rdp-port:RDP端口,默认为3389
  • ssh-username:SSH的用户名
  • ssh-host:centos的IP地址
  • ssh-port:SSH端口
  • ssh-key:SSH密钥的绝对路径

例如:

sudo ssh -L 33890:10.1.1.16:3389 [email protected] -p 2222 -i ./sshuser1.key -N

上面语句的意思是:使用用户名为sshuser1与相对应的ssh密钥sshuser1.key通过2222端口使用SSH协议登入home.t.com这台主机,并将本地端口33890通过SSH隧道转发到10.1.1.16:3389这个地址。

成功连接后并不会返还任何内容,这时候请不要关闭终端:

然后使用RDP软件连接即可:

因为使用了代理模式,所以RDP地址填写127.0.0.1即可,端口则为设定的33890。

0x03.2 windows xshell

打开xshell新建会话属性对话框,并在连接选项框中输入SSH服务器信息:

然后在用户身份验证对话框中输入用户信息:

为了安全起见,请不要在密码一栏输入密码,如果输入密码,xshell将记住并托管你的密码。

然后在隧道对话框中添加代理信息:

完成后先连接SSH,连接后也不会有任何内容返还。这时候使用windows自带的RDP工具即可连接:

输入账号密码后,又见到了熟悉的证书警告:

如果不想总是提示证书错误或者想进一步提高安全性,请阅读以下文章:

0x04 结语

windows下用xshell或putty可以非常便捷地连接和使用,在使用上没有造成任何麻烦;而在macOS或Linux上,可以将命令写入到一个shell里,需要的时候一键打开就可以连接了,非常方便。

最主要是:安全!