互联网上的扫描器不会等待。只要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 | 仅作为附加防护层 |
分步指南:正确保护RDP
以下步骤层层递进。如果只有时间做一件事,应该先完成第1步——其余步骤则是在此基础上做深度防护。
- 第1步——将访问权限限制为VPN或固定IP。 让Windows防火墙只接受来自特定来源的RDP连接。在服务器上通过PowerShell执行:
将示例IP替换为你自己的固定地址,或VPN服务器所在的子网。如果不使用VPN,这种方式只有在你自己的IP确实保持不变的情况下才可行——IP经常变化时,VPN是更可靠的方案。Set-NetFirewallRule -DisplayName "Remotedesktop - Benutzermodus (TCP-Eingehend)" -RemoteAddress 203.0.113.10/32 -Enabled True - 第2步——启用网络级别身份验证(NLA)。 NLA要求在建立完整的远程桌面会话之前先完成身份验证——许多自动化攻击因此在真正尝试登录之前就已失败:
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1 - 第3步——设置失败多次后的账户锁定。 为了防止机器人无限次尝试密码,Windows会在达到设定的失败次数后锁定账户:
五次失败尝试后锁定30分钟——可根据需要调整,但无论如何都比不限制尝试次数要好。net accounts /lockoutthreshold:5 /lockoutduration:30 /lockoutwindow:30 - 第4步——更换默认端口(可选)。 这不能替代前面的步骤,但能明显减少自动化扫描带来的常规噪音:
修改后需要重启“远程桌面服务”或整台服务器,并且新的端口号必须同步体现在防火墙规则和连接地址(Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber -Value 33899server:33899)中。 - 第5步——强制使用强而独特的密码。 日常访问不使用“Administrator”这类标准用户名,而是使用带有长而唯一密码的独立账户。在其他服务中重复使用的密码,是RDP被成功入侵最常见的原因。
- 第6步——保持系统更新。 定期安装Windows更新,尤其是远程桌面服务相关的安全补丁。一旦协议本身的漏洞被利用,未打补丁的RDP服务会让所有防火墙规则形同虚设。
- 第7步——监控登录尝试。 登录失败会记录在Windows事件查看器中(安全类别,事件ID 4625)。如果不想手动打开事件查看器就能持续掌握服务器状态,也可以让服务器接受额外的外部监控——详见文章Prepaid-Host的监控功能介绍。
检查配置是否真正生效
完成配置后,不应该就此想当然地认为一切都已生效——简单测试一下就能确认:
- 从外部进行端口扫描: 在允许的IP范围或VPN之外的电脑上,用
nmap -p 3389 <server-ip>检查。端口应显示为filtered或已关闭,而不是open。 - 从未授权的IP尝试连接: 从未获授权的地点通过远程桌面发起连接,必须在出现登录窗口之前就已失败。
- 检查NLA状态: 在系统属性的“远程”选项卡中,必须已启用“仅允许运行使用网络级别身份验证的远程桌面的计算机连接”。
- 测试账户锁定: 使用测试账户故意多次输入错误密码,检查是否在设定的尝试次数后触发锁定。
- 核对事件查看器: 测试之后,失败的尝试应显示在事件ID 4625下——这能确认日志记录功能正常运行。
完整走一遍这五个检查点,不仅落实了配置,也证明了它确实有效。这就是“应该是安全的”和“经过验证确实安全”之间的区别。
如果VPN不适用
并非所有情况都适合自建VPN服务器——比如需要多个外部服务商临时获得访问权限时。这种情况下,RD网关是次优选择:它将访问集中在一个经TLS加密的HTTPS端点后面,而不是直接暴露3389端口。搭建RD网关的工作量比VPN更大,但对于用户不断变化的环境来说,往往是更实用的方案。如果用户群体长期固定不变,通常用VPN会更简单,后续维护工作量也更小。
归根结底最重要的是一点:服务器不能指望没有人会找到那个开放的端口。它一定会被找到。唯一的问题是,届时背后还有没有东西可拿。