引言
Windows 远程桌面(Remote Desktop Protocol,RDP)是系统管理员最常用的远程管理工具,其默认监听端口为 3389。这个端口几乎人尽皆知,全球互联网上无时无刻不在进行着针对 3389 端口的扫描与密码暴力破解攻击。尤其是暴露在公网的云服务器,一旦开启 RDP 且使用默认端口,几乎必然会在短时间内遭遇大量登录尝试。
将远程桌面端口从一个"公开的秘密"改成一个自定义端口,是一种成本极低、收益明显的基础安全加固手段。它虽然不能替代强密码、账户锁定策略、网络访问限制等安全措施,但能有效过滤掉绝大多数"撒网式"的自动化扫描攻击。
⚠️ 重要提示:修改 RDP 端口属于系统级敏感操作,请务必:
确认你有管理员权限;
提前记录原端口并做好注册表备份;
在修改前先配置好防火墙放行新端口(尤其是远程操作云服务器时,顺序弄反可能直接"失联")。
一、动手前的准备工作
无论采用哪种方案,以下准备工作都通用且至关重要。
1. 选择一个合适的端口
端口取值范围为 1024 ~ 65535(0-1023 为系统保留端口,不建议占用);
避开常见服务端口(如 80、443、22、3306、5432、8080 等),避免冲突;
端口号不要过于简单易猜(如 3333、8888 仍是扫描器的重点目标),推荐使用不太规整的数字,例如 3390、51324、47788 等;
修改前先用命令确认端口未被占用:
# 查看某个端口是否被占用(示例检查 3390)
Get-NetTCPConnection -LocalPort 3390 -ErrorAction SilentlyContinue
# 或使用 netstat
netstat -ano | findstr :33902. 备份注册表(强烈推荐)
注册表误操作可能导致系统异常,动手前请备份相关项:
# 备份 RDP-Tcp 注册表项到 D 盘
reg export "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" D:\RDP-Tcp-backup.reg3. 确认当前端口
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber正常情况下会输出 PortNumber : 3389。
二、方案一:手动修改注册表
这是最直观、最"可见"的方式,适合偶尔操作一次、希望完全掌控每一步的读者。
步骤 1:打开注册表编辑器
按 Win + R,输入 regedit 回车,以管理员身份运行(普通权限可能无法修改系统项)。
步骤 2:定位到 RDP 端口键值
在地址栏粘贴或逐级展开以下路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp找到右侧名为 PortNumber 的 DWORD 值(32 位)。
步骤 3:修改端口值
双击 PortNumber;
先切换到"十进制"(Decimal)——这是最容易踩的坑,若保持十六进制输入 3390,实际会被当作 0x3390 = 13200,导致端口错误;
输入新端口号(例如 3390);
点击"确定"。

步骤 4(可选):同步修改第二处注册表路径
部分早期教程和 Windows 版本还会涉及另一条注册表路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp同样修改其中的 PortNumber。虽然微软官方文档目前只强调 WinStations\RDP-Tcp 这一处,但在部分老系统或特殊环境下,同步修改 Wds 路径可避免端口改动不生效。建议两处都改,保证兼容性。
步骤 5:配置防火墙放行新端口
在"高级安全 Windows 防火墙"中新建入站规则:
打开「控制面板 → Windows Defender 防火墙 → 高级设置」;
点击「入站规则 → 新建规则」;
规则类型选「端口」,协议选 TCP,特定本地端口填新端口(如 3390);
操作选「允许连接」,按需勾选应用配置文件(域 / 专用 / 公用);
命名规则(如 RDP-NewPort-3390)后完成。
若 RDP 同时需要 UDP(新版 RDP 的 UDP 传输优化),建议 TCP、UDP 各建一条规则。
步骤 6:重启服务或重启系统
修改注册表后不会立即生效,需要重启远程桌面服务(或直接重启电脑):
方法 A(服务重启):Win + R → services.msc → 找到 Remote Desktop Services(服务名 TermService)→ 右键「重新启动」。
方法 B(重启电脑):最稳妥,能确保所有依赖服务一并刷新。
步骤 7:连接验证
使用新地址连接:主机名或IP:新端口,例如 192.168.1.100:3390。
三、方案二:PowerShell 命令
对于熟悉命令行的管理员,PowerShell 是最高效的方式,且全程无需点击图形界面,非常适合批量或远程部署。
以下命令均需在管理员权限的 PowerShell 中执行。
步骤 1:查看当前端口
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber步骤 2:修改注册表端口
# 定义新端口(按需修改)
$portValue = 3390
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name 'PortNumber' -Value $portValue
# (可选)同步修改 Wds 路径,保证兼容性
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp' -Name 'PortNumber' -Value $portValue步骤 3:放行防火墙
微软官方推荐使用 New-NetFirewallRule 同时放行 TCP 与 UDP:
# 放行 TCP(-Profile 可按需调整为 Any / Domain,Private / Public)
New-NetFirewallRule -DisplayName 'RDPPORT-TCP-In' -Profile Public -Direction Inbound -Action Allow -Protocol TCP -LocalPort $portValue
# 放行 UDP
New-NetFirewallRule -DisplayName 'RDPPORT-UDP-In' -Profile Public -Direction Inbound -Action Allow -Protocol UDP -LocalPort $portValue-Profile 参数说明:Public 仅公网配置生效;若你同时在内网/域环境使用,建议改为 Any,或按 Domain,Private 组合配置。云服务器公网访问务必确保 Public 已放行。
如果你习惯使用 netsh,也可用以下等价命令:
netsh advfirewall firewall add rule name="RDP-NewPort" dir=in action=allow protocol=TCP localport=3390步骤 4:重启远程桌面服务
# 重启 TermService 服务使其立即生效
Restart-Service TermService -Force如需完全确保生效,也可以直接重启系统:
Restart-Computer -Force步骤 5:验证修改结果
# 再次查询,确认端口已变更
Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name PortNumber
# 确认服务正在监听新端口
netstat -ano | findstr "LISTENING" | findstr ":3390"四、方案三:一键脚本(推荐用于批量/重复操作)
前两种方案每一步都需要手动执行,一旦要在多台机器上重复部署,或者想把它沉淀为团队的标准操作,脚本是最优解。下面提供两个版本:
PowerShell 脚本(.ps1):功能完整、可参数化、含校验与日志;
批处理脚本(.bat):兼容老系统、双击即可运行。
4.1 完整 PowerShell 脚本
将以下内容保存为 Set-RdpPort.ps1,右键「使用 PowerShell 运行」或从管理员 PowerShell 调用。
<#
.SYNOPSIS
一键修改 Windows 远程桌面(RDP)端口,并自动放行防火墙。
.DESCRIPTION
1. 校验端口合法性
2. 修改注册表 PortNumber(含 Wds 兼容路径)
3. 添加防火墙入站规则(TCP/UDP)
4. 重启 TermService 服务
.PARAMETER Port
要设置的新端口号,默认 3390。
.EXAMPLE
.\Set-RdpPort.ps1 -Port 51324
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[ValidateRange(1024, 65535)]
[int]$Port = 3390
)
# 需管理员权限
if (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Error "请以管理员身份运行此脚本!" -ErrorAction Stop
}
$ErrorActionPreference = 'Stop'
$RdpTcpPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'
$WdsPath = 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp'
# 1. 记录原端口并备份
$oldPort = (Get-ItemProperty -Path $RdpTcpPath -Name PortNumber).PortNumber
Write-Host "当前 RDP 端口: $oldPort -> 新端口: $Port" -ForegroundColor Cyan
try {
reg export "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" "$env:TEMP\RDP-Tcp-backup.reg" | Out-Null
Write-Host "注册表已备份至: $env:TEMP\RDP-Tcp-backup.reg" -ForegroundColor Green
} catch {
Write-Warning "注册表备份失败,继续执行..."
}
# 2. 检查端口是否被占用
if (Get-NetTCPConnection -LocalPort $Port -ErrorAction SilentlyContinue) {
Write-Error "端口 $Port 已被占用,请更换端口!" -ErrorAction Stop
}
# 3. 修改注册表
Set-ItemProperty -Path $RdpTcpPath -Name 'PortNumber' -Value $Port
Write-Host "已修改 RDP-Tcp 端口: $Port" -ForegroundColor Green
# Wds 兼容路径(若存在则一并修改)
if (Test-Path $WdsPath) {
Set-ItemProperty -Path $WdsPath -Name 'PortNumber' -Value $Port
Write-Host "已同步修改 Wds 路径端口" -ForegroundColor Green
}
# 4. 防火墙规则(避免重复添加)
$tcpRuleName = "RDP-Port-$Port-TCP-In"
$udpRuleName = "RDP-Port-$Port-UDP-In"
if (-not (Get-NetFirewallRule -DisplayName $tcpRuleName -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName $tcpRuleName -Profile Any -Direction Inbound -Action Allow -Protocol TCP -LocalPort $Port | Out-Null
Write-Host "已添加 TCP 防火墙规则" -ForegroundColor Green
}
if (-not (Get-NetFirewallRule -DisplayName $udpRuleName -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName $udpRuleName -Profile Any -Direction Inbound -Action Allow -Protocol UDP -LocalPort $Port | Out-Null
Write-Host "已添加 UDP 防火墙规则" -ForegroundColor Green
}
# 5. 重启服务
Write-Host "正在重启 Remote Desktop Services..." -ForegroundColor Yellow
Restart-Service TermService -Force
Start-Sleep -Seconds 3
# 6. 验证
$newPort = (Get-ItemProperty -Path $RdpTcpPath -Name PortNumber).PortNumber
if ($newPort -eq $Port) {
Write-Host "✅ 修改成功!请使用 `主机名或IP:$Port` 连接。" -ForegroundColor Green
} else {
Write-Warning "端口校验失败,当前值为 $newPort,请手动检查。"
}4.2 批处理脚本(.bat,兼容老系统)
如果目标机器不方便执行 PowerShell 脚本(例如受执行策略限制),可用批处理 + reg / netsh 实现:
@echo off
setlocal enabledelayedexpansion
:: 设置新端口(按需修改)
set NEWPORT=3390
:: 检查管理员权限
net session >nul 2>&1
if %errorlevel% neq 0 (
echo 请右键"以管理员身份运行"此脚本!
pause & exit /b 1
)
echo [1/4] 修改注册表...
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d %NEWPORT% /f
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp" /v PortNumber /t REG_DWORD /d %NEWPORT% /f
echo [2/4] 配置防火墙...
netsh advfirewall firewall add rule name="RDP-NewPort-%NEWPORT%" dir=in action=allow protocol=TCP localport=%NEWPORT%
echo [3/4] 重启远程桌面服务...
net stop TermService /y
net start TermService
echo [4/4] 完成!请使用 主机名或IP:%NEWPORT% 连接远程桌面。
pause脚本与命令方案的差异:命令方案适合"人在现场、一次操作";脚本方案加入了参数校验、端口占用检查、规则去重、异常处理和结果验证,可安全地重复执行、批量分发,也更适合沉淀为团队规范。
五、容易被忽略的配套事项
无论用哪种方案,下面几点不做好,改动可能"白改"甚至导致断连。
云服务器安全组 / 网络 ACL:修改端口后,除了系统防火墙,还要在云厂商控制台的「安全组」中放行新端口的入站规则(腾讯云、阿里云、AWS Security Group 等)。这是最常见的失联原因。
第三方安全软件:部分安全软件(杀软、EDR)会拦截非常见端口的入站连接,需将其加入白名单。
重启 vs 服务重启:仅重启 TermService 通常已足够,但若改了 Wds 路径或系统提示端口仍占用,直接重启系统最稳妥。
客户端连接格式:新端口连接时地址格式为 主机名:端口 或 IP:端口,例如 server01:51324。旧版 mstsc 中端口与地址之间用冒号分隔即可。
别忘了原 3389 的处理:修改端口后,系统不再监听 3389,无需额外删除。若你之前为 3389 建过防火墙规则,建议顺手禁用或删除,避免留下冗余规则。
六、常见问题与排错
总结与展望
修改 Windows 远程桌面端口,本质上就是三件事:改注册表 PortNumber → 放行防火墙 → 重启 TermService。三种方案殊途同归:
手动注册表:最直观,适合一次性操作,但步骤多、易在"十进制/十六进制"上出错;
PowerShell 命令:高效、可复用、便于远程与批量执行,是管理员的首选;
一键脚本:把校验、备份、去重、异常处理、结果验证全部自动化,适合标准化部署和团队协作。
需要强调的是,更换端口只是安全加固的第一道防线,它无法替代强密码策略、账户锁定、多因素认证(MFA)、限制来源 IP 以及尽量使用 VPN / 跳板机访问等更根本的措施。建议将"改端口"作为整体远程访问安全方案中的一个环节,而非终点。
随着零信任理念的普及和 RDP 网关、Azure Virtual Desktop、Windows App 等更现代远程方案的推广,传统"裸暴露 RDP"的方式正逐步被更安全的接入架构取代。但对于大量存量 Windows 服务器,一个自定义端口仍是今天最廉价、最立竿见影的加固手段之一。
参考资料: