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种解决方案:
- 在系统初始化的时候将Domain User或对应的用户加入Remote Desktop User Group
- 使用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。但在大流量的情况下会出现性能瓶颈,需要根据业务需要提前扩容。