0x01 前言

疫情3年,很多公司一直或是不是要居家办公,在这种情况下,办公设备的搬动就显得非常麻烦。针对对图形性能需求不是很高的使用环境,甚至是业务系统的前置机都可以使用微软的RD Gateway解决方案。

RD Gateway需要配合AD一起使用,其中的AD可以分布式部署,在有需要的时候部署双机RD Gateway即可。但这种架构不适合只有单一集群的情况,很多时候虚拟机都集中在一个环境,入口网络很难兼顾到不同地区的用户。

这时候就需要配置代理,但全球性或多地域部署RD Gateway的成本非常高,尤其是Windows系统的授权费用。

0x02 架构

RD Gateway的架构非常简单,功能也很强大。在这篇文章里的应用需求是作为统一入口,让使用者通过这个网关连接到后面的虚拟机,当然,也可以是物理机器。因为所有机器都会加入AD,我们使用AD内置的DNS服务器即可让用户访问到他们需要访问的目标。

架构非常简单,其中使用PowerDNS作为DNS服务器,需要设置AD的域名向AD查询,将缓存时间适当加长,以此减轻AD的压力。

还需要调通RD Gateway到后端机器的TCP 3389端口,建议关闭UDP以提高安全性,避免被用来做DDoS和CC攻击源。另外还要根据实际情况控制机器之间的互访,建议直接禁止所有机器间的相互访问,避免内部渗透的情况发生。

VM及PC和各个组件间需要严格控制端口的放通,关闭非必要端口。在机器互访关闭的情况下可以使用GPO关闭VM及PC的防火墙,方便RD Gateway及AD访问这些机器。这个操作较为危险,可靠点的方案是使用GPO创建独立的防火墙规则,按需放通。

0x03 AD及RD Gateway

AD和PowerDNS部分没有什么需要说明的。如果使用AD内的用户信息作为RD Gateway及后端机器的登入用户,则需要确认AD用户是否有Remote Desktop User的权限。这里有2种解决方案:

  1. 在系统初始化的时候将Domain User或对应的用户加入Remote Desktop User Group
  2. 使用GPO将Domain User或对应的用户加入Remote Desktop User Group

使用第2种方案比较省事:

还有一个问题是要确保Domain User有对应机器的本地管理员权限,同样地,可以使用GPO将Domain User Group加到Local Administrator Group中:

RD Gateway的部分建议配置Server farm以便平衡负载:

强烈建议给需要暴露在公网的RD Gateway部署受信任的SSL证书,然后根据需要打开SSL Bridging。使用SSL Bridging可以适配不同的前端代理器,我使用HAProxy的时候一般保持默认或使用HTTPS- HTTPS Bridging:

如果在国内使用没经过备案的域名时使用HTTPS- HTTP协议可能会有问题,建议使用非标端口进行尝试。

0x04 HAProxy

先上Frontend:

frontend ngx_rdp_tsc
  bind *:443 name rdp_web ssl crt /etc/haproxy/ssl/ngx.hk.pem
  mode http
  capture request header Host len 32
  log global
  timeout client 300s
  maxconn 1000

  acl path_rdweb path_beg -i /RDWeb/
  acl RDGW_PATH_0 path_beg -i /remoteDesktopGateway/

  acl ld hdr_dom(host) -i rdgw-ld.ngx.hk
  acl ml hdr_dom(host) -i rdgw-ml.ngx.hk

  use_backend ld if ld
  use_backend ml if ml

这里使用http协议,写2个域名模拟不同地区。下面是backend:

backend ld
  balance leastconn
  mode http
  log global
  option forwardfor
  http-send-name-header rdgw.ngx.hk
  http-request set-header X-Client-IP %[src]
  http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
  timeout connect 4s
  timeout server 300s
  option httpchk GET /RDWeb
  cookie RDPWEB insert nocache
  default-server inter 3s rise 2 fall 3

# main route path, via ipel.
  server rdgw_via_ipel_1 10.1.1.1:443 ssl verify none check cookie rdgw_via_ipel_1
  server rdgw_via_ipel_2 10.1.1.2:443 ssl verify none check cookie rdgw_via_ipel_2

# backup route path, driect connect via public network
  server rdgw_via_bgp_1 8.8.8.8:443 ssl verify none check cookie rdgw_via_bgp_1 backup
  server rdgw_via_bgp_2 8.8.4.4:443 ssl verify none check cookie rdgw_via_bgp_2 backup

backend ml
  balance leastconn
  mode http
  log global
  option forwardfor
  http-send-name-header rdgw.ngx.hk
  http-request set-header X-Client-IP %[src]
  http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
  timeout connect 4s
  timeout server 300s
  option httpchk GET /RDWeb
  cookie RDPWEB insert nocache
  default-server inter 3s rise 2 fall 3

# backup route path, driect connect via public network
  server rdgw_via_bgp_1 8.8.8.8:443 ssl verify none check cookie rdgw_via_bgp_1 backup
  server rdgw_via_bgp_2 8.8.4.4:443 ssl verify none check cookie rdgw_via_bgp_2 backup

整体比较重要的部分是:

http-send-name-header

需要带上RD Gateway的主机头。

0x05 结语

经过超过3年的实践,这套架构极其稳定,RD Gateway资源为4C8G的情况下可以承载100个Session。但在大流量的情况下会出现性能瓶颈,需要根据业务需要提前扩容。