0x01 前言

RDP是一个非常好的协议,只需要极少的带宽即可非常流畅地远程操控Windows系统,默认使用TCP 3389端口,和UDP 3391。如果被远程控制的Windows主机在NAT内部,还可以通过端口映射的方式将TCP 3389映射到公网。

但在实际使用中可能会遇到有大量Windows主机需要提供远程控制的情况,这时候进行端口映射的工作会变得及其繁琐,同时难以进行权限控制,最终导致安全问题。

而RD网关解决了此类问题,同时支持基于Windows的VDI,还支持Remote APP。如果在企业内部使用,RD网关高可用配置是必不可少的。

0x02 准备

首先,简单架构图如下:

看上去是挺复杂的,首先需要部署AD,至少需要两台冗余;然后需要MSSQL,至少两台冗余;AD网关也是两台冗余,最后需要部署一个边缘节点与用户通讯。这个边缘节点需要监听TCP 443与UDP 3391,然后通过负载均衡算法将连接分发到两台网关,建议使用IP-HASH算法。

在实际使用中发现几个问题,首先是端口。监听的端口应该是可以修改的,但在server 2019中尝试通过GUI修改会报错,我没有尝试通过powershell修改,无法进一步验证。

端口UDP 3391可以极大程度地提升使用感受,在网络一般的情况下明天优于TCP连接。但在实际使用中发现,当Edge SLB无法保持连接到同一台RD网关时会出现重连的情况,还有可能回落至TCP。在长时间测试后,我决定关闭UDP端口。

另外,RD网关支持RD虚拟化主机、RD会话主机和remote APP,当然,还可以用来作为众多Windows主机的跳板机。这些功能都依赖域控,而且建议不要与域控部署在同一台服务器里,数据库也一样,都需要独立部署。

在这篇文章里不包含域控的部署流程,因为域控部署还是比较简单的。接下来先准备虚拟机:

  1. AD1:10.1.3.201
  2. AD2:10.1.3.202
  3. RDGW1:10.1.3.203
  4. RDGW2:10.1.3.204
  5. MSSQL:10.1.3.205

0x03 远程桌面服务

在部署RD网关高可用前需要先部署一个节点,首先打开AD服务器中的其中一个,需要使用administrator用户登入:

通过RDP登入之后来到“所有服务器”菜单并右击,然后单击点选“添加服务器”

在弹出的对话框中进行如下步骤:

  1. 单击“Active Directory”,单击“立即查找”
  2. 选中所有AD和RD网关节点
  3. 单击箭头
  4. 单击“确定”

完成后单击服务器管理器右上角的“管理”按钮,选择“添加角色和功能”,在弹出的对话框中选择“远程桌面服务器”,最后单击下一步:

然后点选“标准部署”并单击下一步:

然后选择“基于会话的桌面部署”并单击下一步:

继续单击下一步来到“RD连接代理”:

  1. 选中一台RD网关服务器
  2. 单击箭头将其加入“已选择”列表
  3. 单击下一步

勾选“在RD连接代理服务器上安装RD Web访问角色服务”,然后单击下一步:

在接下来的“RD 会话主机”里添加刚才的node,然后单击下一步:

最终确认后勾选“需要时自动重新启动目标服务器”并单击部署:

如果一切正常,在服务器管理器会出现“远程桌面服务”的菜单:

0x04 授权服务器

单击上图中的菜单按钮进入概述界面,然后单击“RD授权”按钮,在弹出的对话框中选中两台AD并加入列表,最后单击下一步:

确认无误后单击“添加”,这两台AD会自动安装RD授权角色服务:

成功部署后单击AD1 服务器管理器右上角的“工具”按钮,从中打开“远程桌面授权管理器”:

在弹出的窗口中应该只有AD1,此时需要右击“所有服务器”单击“连接”:

然后填写AD2的NetBios NAME或者IP,最后单击“连接”:

如果一切正常,那么服务器会出现在列表里,此时可以看到都是处于未激活的状态。我们需要逐一激活服务器,首先右击任意一台服务器并选择“激活服务器“:

在激活向导中,选择连接方式位“Web 浏览器”并单击下一步:

然后打开以下地址:

首先修改显示语言,方便后续步骤:

选择“启用许可证服务器”并单击下一步:

然后将AD1 激活向导中的产品ID地址到页面中,并填写公司名称与选择国家,确认无误后单击下一步:

确认信息后再单击下一步,在最后的界面中复制“许可证服务器 ID”并粘贴到向导中,然后单击向导中的下一步按钮。于此同时,需要单击页面上的“是”,我们还需要获取许可证:

勾选“立即启动许可证安装向导”并单击下一步,而页面中需要选择“企业协议”作为许可证程序:

在向导中确认信息并单击下一步,最终来到许可证密钥包输入窗口;同时在web中进行如下选择和内容的填写:

  1. 产品类型:Windows Server 2019 远程桌面服务每用户客户端访问许可证,如果你使用的不是Windows Server 2019,那么请选择对应的操作系统;
  2. 数量:根据实际情况填写即可
  3. 协议号码:6565792

确认信息无误后,单击下一步即可获取到许可证密钥包ID,将其输入向导后单击下一步即可完成激活:

请以同样的方式激活另一台AD。

最后分别单击服务器名称,选择“复查配置”:

在弹出的对话框中单击“添加到组”即可完成激活步骤:

当提示需要重启时,请重启两台AD服务器,最终确认激活是否成功:

0x05 RD网关与证书

再次来到远程桌面服务管理窗口,单击“RD网关”,在弹出的对话框中选择node1,然后单击下一步:

在接下来这部分非常重要,如果使用自签发证书,则需要在所有客户机上安装自签发的CA或中级证书,否则将无法连接到RD网关,因此建议使用商业证书。

这一步我是用自有域名并使用lets encrypt的证书作为演示:

确认无误后单击“添加”即可,在接下来我们需要生成适用于Windows的数字证书格式。

从lets encrypt获取到的正式都是PEM格式,分为证书与私钥两部分,其中证书包含中级证书,但Windows需要PFX格式的证书。我习惯使用Linux中的openssl进行这项操作:

生成过程中需要填写密码,可留空直接回车,鉴于安全原因,建议填写密码。将生成的PFX文件复制到所有服务器上,稍后会用到。

然后回到刚刚的对话框:

  1. 单击“配置证书”
  2. 进入“证书”选项卡
  3. 选择任意一项以配置证书
  4. 单击“选择现有证书”
  5. 单击“浏览”定位到PFX文件的路径
  6. 勾选“允许向目标计算机上受信任的根证书颁发机构存储中添加证书”
  7. 单击确定
  8. 单击应用

我尝试过那么多次,每次的状态都是“错误”,但这不影响使用,而且我发现在RD网关服务器上其实已经完成配置了。

0x06 RD连接代理高可用

首先来到装有MSSQL的服务器上配置数据库与用户,这里配置只用于演示,在实际生成环境中请务必做好安全防范工作,避免数据库被渗透导致数据泄露。

先通过Microsoft SQL Server Management Studio登入MSSQL数据库,然后创建用户:

  1. 右击“login”
  2. 单击“new login”
  3. 输入用户名
  4. 选择“SQL Server authentication”
  5. 输入密码
  6. 确认保存

请注意下图中的三个选项,最后一个是:User must change password at next login,如果不需要进行其他配置,请勿勾选此项!

然后创建数据库:

  1. 右击“create databases”
  2. 单击“new databases”
  3. 输入新建的数据库名
  4. 选择Owner
  5. 单击确认保存

至此,数据库的部分已经结束。然后将数据库安装包复制到两台RD网关服务器中,安装客户端连接工具:

如果你使用的是虚拟机,建议在安装完数据库客户端连接工具后为虚拟机做一个快照,后续部署可能会出错,当出错时方便回滚。

再次回到远程桌面服务,右击“RD连接代理”并单击配置高可用:

选择“共享数据库服务器”并单击下一步:

填写RD连接代理集群的DNS名称,域名需要预先解析,否则可能会报错,但不影响部署;数据库连接字符串格式如下:

请根据实际情况修改,确认无误后单击下一步:

如果一切正常,那么会见到这个确认界面,请再次确认信息并且给虚拟机做快照,然后单击配置:

如果一切顺利,那么配置已经完成,此时RD连接代理以启用高可用模式,但只有一个节点: