跳转到内容

Windows RDP 暴露在公网:如何正确保护访问安全

Christopher Sakel  ·   ·  1 分钟 阅读时间

更新与新闻 · 分钟 1 阅读时间 · Christopher Sakel

Windows RDP 暴露在公网:如何正确保护访问安全

互联网上的扫描器不会等待。只要3389端口是开放的,它就会被发现——不是会不会,只是何时。而一旦被发现,针对用户名和密码的自动化尝试便会开始,全天候不间断地进行。运行着已启用远程桌面的Windows服务器,就该抽出时间把访问权限彻底保护好——做完这一次,就一劳永逸。

简而言之
  • 通过3389端口直接从互联网访问RDP,是自动化攻击最青睐的目标之一。
  • 最有效的措施是从一开始就不让该端口公开可访问——通过VPN或RD网关(RD Gateway)。
  • 网络级别身份验证、强密码以及失败多次后的账户锁定,能堵住最常见的漏洞。
  • 更换端口和IP过滤是有意义的附加防护层,但不能替代真正的访问控制。

为什么RDP是攻击者偏爱的目标

远程桌面很方便:连接一次,Windows服务器用起来就像自己的电脑一样。恰恰是这种便利性,也让它成为攻击者眼中的目标。通过RDP成功登录,意味着对系统拥有完整的交互式访问权限——不需要绕道某个Web应用,也不需要提权。如果在Windows VPS上运行RDP,并让该端口不加保护地暴露在互联网上,这个风险就会全部落到自己头上。

攻击的模式几乎总是一样的:使用“Administrator”或“admin”等常见用户名,结合以往数据泄露事件中流出的密码列表进行自动化登录尝试。这种方式成功的次数多得惊人——不是因为攻击者有多聪明,而是因为总有人在某处重复使用了一个过于简单的密码。

互联网上开放的RDP端口不是一个入口,而是一份邀请函。

各种访问方式对比

在动手配置之前,先要问一个根本问题:3389端口真的有必要从公开互联网访问吗?在绝大多数情况下,答案是否定的。

访问方式攻击面建议
RDP直接开放(3389端口暴露在互联网)最大——任何扫描器都能找到不推荐
RDP通过VPN访问最小——对除VPN用户外的所有人关闭该端口推荐的标准方式
RD网关(RDS)较低,但仍保留一个公开的HTTPS端点用户较多时适用
仅IP白名单,不使用VPN有所降低,但依赖固定的来源IP仅作为附加防护层
最干净的方案是自建VPN服务器:RDP对外完全关闭,只有先建立VPN连接后才能访问。这会多出一个连接步骤——但正是这一步,决定了“理论上可被攻击”和“扫描器根本看不见”之间的区别。

分步指南:正确保护RDP

以下步骤层层递进。如果只有时间做一件事,应该先完成第1步——其余步骤则是在此基础上做深度防护。

  1. 第1步——将访问权限限制为VPN或固定IP。 让Windows防火墙只接受来自特定来源的RDP连接。在服务器上通过PowerShell执行:
    Set-NetFirewallRule -DisplayName "Remotedesktop - Benutzermodus (TCP-Eingehend)" -RemoteAddress 203.0.113.10/32 -Enabled True
    将示例IP替换为你自己的固定地址,或VPN服务器所在的子网。如果不使用VPN,这种方式只有在你自己的IP确实保持不变的情况下才可行——IP经常变化时,VPN是更可靠的方案。
  2. 第2步——启用网络级别身份验证(NLA)。 NLA要求在建立完整的远程桌面会话之前先完成身份验证——许多自动化攻击因此在真正尝试登录之前就已失败:
    Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1
  3. 第3步——设置失败多次后的账户锁定。 为了防止机器人无限次尝试密码,Windows会在达到设定的失败次数后锁定账户:
    net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30
    五次失败尝试后锁定30分钟——可根据需要调整,但无论如何都比不限制尝试次数要好。
  4. 第4步——更换默认端口(可选)。 这不能替代前面的步骤,但能明显减少自动化扫描带来的常规噪音:
    Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber -Value 33899
    修改后需要重启“远程桌面服务”或整台服务器,并且新的端口号必须同步体现在防火墙规则和连接地址(server:33899)中。
  5. 第5步——强制使用强而独特的密码。 日常访问不使用“Administrator”这类标准用户名,而是使用带有长而唯一密码的独立账户。在其他服务中重复使用的密码,是RDP被成功入侵最常见的原因。
  6. 第6步——保持系统更新。 定期安装Windows更新,尤其是远程桌面服务相关的安全补丁。一旦协议本身的漏洞被利用,未打补丁的RDP服务会让所有防火墙规则形同虚设。
  7. 第7步——监控登录尝试。 登录失败会记录在Windows事件查看器中(安全类别,事件ID 4625)。如果不想手动打开事件查看器就能持续掌握服务器状态,也可以让服务器接受额外的外部监控——详见文章Prepaid-Host的监控功能介绍
更换端口和IP过滤只是降噪手段,不是真正的访问控制。如果认为用33899端口代替3389端口就“安全”了,那是把伪装当成了防护。有针对性的端口扫描同样能找到不常见的端口——第1步到第3步才是真正的防护核心。
如果打算重新搭建Windows服务器:一开始就配置好防火墙的Root服务器,能省去日后在时间压力下补救的麻烦——尤其是日志中已经出现登录尝试记录的时候。

检查配置是否真正生效

完成配置后,不应该就此想当然地认为一切都已生效——简单测试一下就能确认:

  • 从外部进行端口扫描: 在允许的IP范围或VPN之外的电脑上,用nmap -p 3389 <server-ip>检查。端口应显示为filtered或已关闭,而不是open
  • 从未授权的IP尝试连接: 从未获授权的地点通过远程桌面发起连接,必须在出现登录窗口之前就已失败。
  • 检查NLA状态: 在系统属性的“远程”选项卡中,必须已启用“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”。
  • 测试账户锁定: 使用测试账户故意多次输入错误密码,检查是否在设定的尝试次数后触发锁定。
  • 核对事件查看器: 测试之后,失败的尝试应显示在事件ID 4625下——这能确认日志记录功能正常运行。

完整走一遍这五个检查点,不仅落实了配置,也证明了它确实有效。这就是“应该是安全的”和“经过验证确实安全”之间的区别。

如果VPN不适用

并非所有情况都适合自建VPN服务器——比如需要多个外部服务商临时获得访问权限时。这种情况下,RD网关是次优选择:它将访问集中在一个经TLS加密的HTTPS端点后面,而不是直接暴露3389端口。搭建RD网关的工作量比VPN更大,但对于用户不断变化的环境来说,往往是更实用的方案。如果用户群体长期固定不变,通常用VPN会更简单,后续维护工作量也更小。

归根结底最重要的是一点:服务器不能指望没有人会找到那个开放的端口。它一定会被找到。唯一的问题是,届时背后还有没有东西可拿。

常见问题

对单台Windows服务器来说,用VPN是不是小题大做?
不是——恰恰对单台服务器而言,配置成本很低:一台VPN服务器、一条连接,3389端口就再也不需要从开放的互联网访问了。每次连接多花的时间不过几秒钟,而安全收益却非常可观。
只更换RDP端口就够了吗?
更换端口能减少自动化攻击带来的常规噪音,但并不是真正的访问控制。有针对性的扫描同样能找到不常见的端口。更换端口应该始终作为IP限制、NLA和账户锁定之外的补充措施,而不是替代它们。
如果经常在外办公,能用固定IP地址来保护RDP吗?
IP白名单只有在来源IP保持稳定的情况下才可靠。如果经常更换所在地,或者通过不断变化的移动网络IP工作,用VPN能获得明显更灵活的保护,因为此时的访问控制是基于VPN登录,而不是IP地址。
如果被自己设置的防火墙规则挡在了外面,该怎么办?
可以通过客户后台中的控制台(即KVM访问)来修正防火墙规则,即使没有RDP连接也能操作,因为这种访问方式不依赖服务器自身的网络。
这些防护措施需要自己配置,还是Windows VPS上的RDP本身就已经受保护?
Windows VPS提供的是可以启用远程桌面的操作系统,但具体的防护措施——VPN、NLA、账户锁定、防火墙规则——仍然需要客户自己完成,因为只有客户自己知道究竟谁真正需要访问权限。