Loading...

文章背景图

修改 Windows 远程桌面端口:三种方案详解(注册表 / PowerShell / 脚本)

2026-08-17
0
-
- 分钟

引言

Windows 远程桌面(Remote Desktop Protocol,RDP)是系统管理员最常用的远程管理工具,其默认监听端口为 3389。这个端口几乎人尽皆知,全球互联网上无时无刻不在进行着针对 3389 端口的扫描与密码暴力破解攻击。尤其是暴露在公网的云服务器,一旦开启 RDP 且使用默认端口,几乎必然会在短时间内遭遇大量登录尝试。

将远程桌面端口从一个"公开的秘密"改成一个自定义端口,是一种成本极低、收益明显的基础安全加固手段。它虽然不能替代强密码、账户锁定策略、网络访问限制等安全措施,但能有效过滤掉绝大多数"撒网式"的自动化扫描攻击。

⚠️ 重要提示:修改 RDP 端口属于系统级敏感操作,请务必:

  1. 确认你有管理员权限

  2. 提前记录原端口并做好注册表备份

  3. 在修改前先配置好防火墙放行新端口(尤其是远程操作云服务器时,顺序弄反可能直接"失联")。

一、动手前的准备工作

无论采用哪种方案,以下准备工作都通用且至关重要。

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 :3390

2. 备份注册表(强烈推荐)

注册表误操作可能导致系统异常,动手前请备份相关项:

# 备份 RDP-Tcp 注册表项到 D 盘
reg export "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" D:\RDP-Tcp-backup.reg

3. 确认当前端口

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:修改端口值

  1. 双击 PortNumber;

  2. 先切换到"十进制"(Decimal)——这是最容易踩的坑,若保持十六进制输入 3390,实际会被当作 0x3390 = 13200,导致端口错误;

  3. 输入新端口号(例如 3390);

  4. 点击"确定"。

![图示:PortNumber 值修改](此处为示意,实际操作以本地注册表编辑器为准)

步骤 4(可选):同步修改第二处注册表路径

部分早期教程和 Windows 版本还会涉及另一条注册表路径:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp

同样修改其中的 PortNumber。虽然微软官方文档目前只强调 WinStations\RDP-Tcp 这一处,但在部分老系统或特殊环境下,同步修改 Wds 路径可避免端口改动不生效。建议两处都改,保证兼容性。

步骤 5:配置防火墙放行新端口

在"高级安全 Windows 防火墙"中新建入站规则:

  1. 打开「控制面板 → Windows Defender 防火墙 → 高级设置」;

  2. 点击「入站规则 → 新建规则」;

  3. 规则类型选「端口」,协议选 TCP,特定本地端口填新端口(如 3390);

  4. 操作选「允许连接」,按需勾选应用配置文件(域 / 专用 / 公用);

  5. 命名规则(如 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

脚本与命令方案的差异:命令方案适合"人在现场、一次操作";脚本方案加入了参数校验、端口占用检查、规则去重、异常处理和结果验证,可安全地重复执行、批量分发,也更适合沉淀为团队规范。

五、容易被忽略的配套事项

无论用哪种方案,下面几点不做好,改动可能"白改"甚至导致断连。

  1. 云服务器安全组 / 网络 ACL:修改端口后,除了系统防火墙,还要在云厂商控制台的「安全组」中放行新端口的入站规则(腾讯云、阿里云、AWS Security Group 等)。这是最常见的失联原因。

  2. 第三方安全软件:部分安全软件(杀软、EDR)会拦截非常见端口的入站连接,需将其加入白名单。

  3. 重启 vs 服务重启:仅重启 TermService 通常已足够,但若改了 Wds 路径或系统提示端口仍占用,直接重启系统最稳妥。

  4. 客户端连接格式:新端口连接时地址格式为 主机名:端口 或 IP:端口,例如 server01:51324。旧版 mstsc 中端口与地址之间用冒号分隔即可。

  5. 别忘了原 3389 的处理:修改端口后,系统不再监听 3389,无需额外删除。若你之前为 3389 建过防火墙规则,建议顺手禁用或删除,避免留下冗余规则。

六、常见问题与排错

现象

可能原因

解决方案

修改后无法连接

防火墙/安全组未放行新端口

检查系统防火墙入站规则 + 云安全组

端口改完仍是 3389

未重启服务;或十六进制/十进制选错

重启 TermService;确认输入方式为十进制

提示端口被占用

新端口被其他程序使用

用 Get-NetTCPConnection 排查并更换端口

连接成功但提示证书/身份问题

正常现象,与端口无关

忽略证书警告即可

远程修改时断线

未先放行防火墙就改了端口并重启

务必先配防火墙,再改注册表,最后重启

总结与展望

修改 Windows 远程桌面端口,本质上就是三件事:改注册表 PortNumber → 放行防火墙 → 重启 TermService。三种方案殊途同归:

  • 手动注册表:最直观,适合一次性操作,但步骤多、易在"十进制/十六进制"上出错;

  • PowerShell 命令:高效、可复用、便于远程与批量执行,是管理员的首选;

  • 一键脚本:把校验、备份、去重、异常处理、结果验证全部自动化,适合标准化部署和团队协作。

需要强调的是,更换端口只是安全加固的第一道防线,它无法替代强密码策略、账户锁定、多因素认证(MFA)、限制来源 IP 以及尽量使用 VPN / 跳板机访问等更根本的措施。建议将"改端口"作为整体远程访问安全方案中的一个环节,而非终点。

随着零信任理念的普及和 RDP 网关、Azure Virtual Desktop、Windows App 等更现代远程方案的推广,传统"裸暴露 RDP"的方式正逐步被更安全的接入架构取代。但对于大量存量 Windows 服务器,一个自定义端口仍是今天最廉价、最立竿见影的加固手段之一。


参考资料:

原创

修改 Windows 远程桌面端口:三种方案详解(注册表 / PowerShell / 脚本)

本文链接: 修改 Windows 远程桌面端口:三种方案详解(注册表 / PowerShell / 脚本)

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

文章目录