网络与 IP

RDP 端口是多少?3389 端口怎么查、怎么改与放行

RDP 端口默认是 TCP 3389,网络允许时再加一条 UDP 3389。查看用 netstat -ano 或 Get-NetTCPConnection,修改在注册表 RDP-Tcp 下的 PortNumber;改之前先让 Windows 防火墙、云安全组和机房防火墙放行新端口,确认能连再关掉 3389。改端口只能减少扫描,还要配合来源白名单和账户锁定。

作者 顶联产品团队发布于 7 分钟阅读

RDP 端口是多少?Windows 远程桌面默认监听 TCP 3389;从 RDP 8.0(Windows 8、Windows Server 2012)起,同一个端口号上还会监听 UDP 3389,客户端和网络都支持时用它传输画面,UDP 不通就只用 TCP,照样能连。端口号保存在注册表 HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp 的 PortNumber 值里,改它就能换端口。真正容易出错的是放行:远程桌面的数据包要先通过云安全组或机房边界防火墙,再通过 Windows 防火墙,换端口时路径上的每一层都要同步,顺序错了就会把自己关在门外。下面按“查看、修改、放行、验证、加固”的顺序给出步骤和命令。

RDP 端口号是多少:3389 与相关端口

场景 端口 协议 说明
Windows 远程桌面(默认) 3389 TCP 必须放行,认证和会话建立都在这条连接上
RDP 的 UDP 传输 3389 UDP 可选,不放行也能连,只是在高延迟、有丢包的线路上更容易卡顿
改过端口的服务器 PortNumber 的值 TCP,UDP 一般随之变化 以 netstat 的实际输出为准
远程桌面网关(RD Gateway) 443 / 3391 TCP / UDP 客户端经 HTTPS 连网关,网关再用 3389 连后端服务器
Linux 上的 xrdp 3389 TCP 在 /etc/xrdp/xrdp.ini 的 port= 修改
云平台 VNC、BMC 远程控制台 不经过服务器的 3389 — 远程桌面连不上时的备用通道

“RDP 协议端口号”和“远程桌面端口号”说的是同一件事。需要注意的是,端口号是服务器一侧的监听端口;客户端发起连接时用的是系统随机分配的临时端口,防火墙只需要按服务器的端口写规则。

怎么查看服务器当前的 RDP 端口

查端口要分清两个值:注册表里配置的端口,和服务实际监听的端口。改了注册表但还没重启服务、新端口被别的程序占用、远程桌面被关闭,都会让两者对不上。

1. 看注册表里配置的端口。 用命令提示符查询:

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber

输出类似 PortNumber REG_DWORD 0xd3d。值以十六进制显示,0xd3d 换算成十进制就是 3389。PowerShell 直接给出十进制:

(Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp').PortNumber

2. 看实际监听的端口。 netstat 列出所有监听,-ano 分别表示全部连接、数字形式、显示进程号:

netstat -ano | findstr :3389
  TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       1172
  TCP    [::]:3389              [::]:0                 LISTENING       1172
  UDP    0.0.0.0:3389           *:*                                    1172
  UDP    [::]:3389              *:*                                    1172

最后一列 1172 是进程号,用 tasklist /svc /fi "PID eq 1172" 可以确认它是承载 TermService 服务的 svchost.exe。UDP 没有连接状态,所以 UDP 行不显示 LISTENING。

如果你不知道端口被改成了多少,反过来从服务查端口更快:

$svcPid = (Get-CimInstance Win32_Service -Filter "Name='TermService'").ProcessId
Get-NetTCPConnection -State Listen -OwningProcess $svcPid | Select-Object LocalAddress, LocalPort
Get-NetUDPEndpoint -OwningProcess $svcPid | Select-Object LocalAddress, LocalPort

变量不要命名为 $pid,它是 PowerShell 的内置只读变量。

3. 确认远程桌面是开启的。 注册表里 fDenyTSConnections 为 0 表示允许远程连接,为 1 时服务不会监听任何端口:

(Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server').fDenyTSConnections

从外部确认则在你的电脑上执行 Test-NetConnection 203.0.113.10 -Port 3389,TcpTestSucceeded : True 表示 TCP 端口可达。它测不了 UDP,UDP 3389 是否放行,要连上之后在 mstsc 的连接信息里看有没有启用 UDP。

修改 RDP 端口:五个步骤

改端口的原则是先开新门,再关旧门:新端口在三处防火墙都放行、确认能连上之后,才撤掉 3389 的规则。

  1. 准备后路。 打开服务商面板的 VNC 控制台或服务器 BMC 的远程控制台,确认能看到登录界面。改错了,只能从这里进去改回来。
  2. 选一个空闲端口。 选 1024–49151 之间的端口,避开 Windows 的动态端口范围(默认 49152–65535,可用 netsh int ipv4 show dynamicport tcp 查看),也避开服务器上其他程序要用的端口。下面两条命令都没有输出,说明 13389 空闲:
Get-NetTCPConnection -LocalPort 13389 -ErrorAction SilentlyContinue
Get-NetUDPEndpoint -LocalPort 13389 -ErrorAction SilentlyContinue
  1. 先放行新端口。 Windows 防火墙、云安全组、机房防火墙三处都加上新端口的规则,3389 的规则暂时保留,具体写法见下一节。
  2. 修改 PortNumber。 用 reg 命令写入,/d 后面直接写十进制数:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 13389 /f

用注册表编辑器(regedit)手动改时,双击 PortNumber 后先把“基数”切换成“十进制”再输入。默认是十六进制,在十六进制下输入 13389,实际写进去的是 0x13389,即十进制的 78729,超出了 65535,服务就无法按预期监听。

  1. 重启服务并用新端口连接。 当前远程会话会立即断开:
Restart-Service TermService -Force

-Force 会连同依赖它的远程桌面相关服务一起重启。等半分钟左右,在你的电脑上执行 mstsc /v:203.0.113.10:13389 连接;连上之后执行 netstat -ano | findstr :13389 确认 TCP 和 UDP 都已在新端口上。最后回到三处防火墙,删除或禁用 3389 的规则。

三处防火墙同步放行新端口

位置 由谁修改 放行内容 容易漏掉的地方
Windows 防火墙 服务器管理员 入站 TCP 13389,可选 UDP 13389,远程地址限定为管理网段 系统自带的“远程桌面”规则只针对 3389,不会自动跟着变
云安全组或云防火墙 云账号管理员 入方向 TCP:13389(可选 UDP:13389),源地址填办公出口 IP 实例绑定了多个安全组;改到了另一个地域或另一台实例的安全组
机房防火墙、边界 ACL、NAT 映射 机房网络或你自己的防火墙 允许访问服务器 IP 的 13389;有端口映射的改映射 托管在机房的服务器,上游 ACL 由机房管理,要提前提交变更

Windows 防火墙:新建两条规则,-RemoteAddress 直接写上允许的来源,比开放给所有地址再另行限制更省事:

$port  = 13389
$admin = "198.51.100.0/24", "203.0.113.88"
New-NetFirewallRule -DisplayName "RDP-TCP-$port" -Direction Inbound -Protocol TCP -LocalPort $port -RemoteAddress $admin -Action Allow -Profile Any
New-NetFirewallRule -DisplayName "RDP-UDP-$port" -Direction Inbound -Protocol UDP -LocalPort $port -RemoteAddress $admin -Action Allow -Profile Any

-Profile Any 让规则在域、专用、公用三种网络配置文件下都生效,避免规则建在“域”配置文件上、而服务器网卡被识别为“公用网络”导致不生效。新端口验证通过后,禁用系统自带的远程桌面规则组:

Get-NetFirewallRule -Group "@FirewallAPI.dll,-28752" | Disable-NetFirewallRule

云安全组:在实例关联的安全组里添加入方向规则,协议端口填 TCP 13389,源地址填你的办公出口 IP(单个地址写成 /32);需要 UDP 时再加一条 UDP 13389。验证通过后删除 3389 的规则。

机房防火墙与端口映射:服务器直接配置公网 IP 时,在边界防火墙上允许“来源办公网、目的服务器 IP、TCP 13389”;托管在 IDC 的机器,上游 ACL 通常由机房维护,提前把新端口和来源地址告诉机房。服务器在内网、经 NAT 映射对外时,还有一个选择:服务器继续用 3389,只改外部映射的端口。以 Linux 网关为例:

# 外部访问网关的 13389,转发到内网服务器 10.0.0.20 的 3389
# 前提:网关已开启 net.ipv4.ip_forward=1,FORWARD 链已放行 ESTABLISHED,RELATED 回包
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 13389 -j DNAT --to-destination 10.0.0.20:3389
iptables -A FORWARD -p tcp -s 198.51.100.0/24 -d 10.0.0.20 --dport 3389 -j ACCEPT

FORWARD 链看到的是转换之后的目的端口,所以第二条写 3389。这样服务器上什么都不用改,也不会因为改错注册表而失联。

改完连不上怎么排查

先在你的电脑上执行 Test-NetConnection 203.0.113.10 -Port 13389,再通过 VNC 控制台登录服务器查看监听,对照下表:

现象 原因 处理
外部测试 False,服务器上 netstat 能看到新端口在监听 某一层防火墙没放行,或者规则的来源地址不包含你当前的出口 IP 逐层核对;家庭宽带的出口 IP 会变,用 curl ifconfig.me 之类的方式确认当前地址
netstat 里没有新端口 服务没有重启,或 PortNumber 没写进去 用 reg query 核对数值后重启 TermService
PortNumber 是一个大于 65535 的数 在 regedit 里用十六进制输入了十进制数字 切换到十进制重新输入
重启服务后哪个端口都没有监听 新端口被别的程序占用,或远程桌面被关闭 查 fDenyTSConnections,换一个空闲端口
能连上,但画面断续、偶尔冻结 新端口只放行了 TCP,UDP 传输不可用或被限速 放行 UDP 新端口,或接受只用 TCP
mstsc 仍然去连 3389 地址里没写端口,或打开的是旧的 .rdp 文件 写成 IP:端口,更新 .rdp 文件

实在连不上,就从 VNC 控制台把端口改回去:

reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 3389 /f
net stop TermService /y && net start TermService

一切正常后,从外部再确认一次只暴露了新端口。nmap 结果里 3389 显示 filtered 或 closed、13389 显示 open,才说明旧门已经关上:

nmap -Pn -p 3389,13389 203.0.113.10

改端口之外,必须做的白名单与账户锁定

改端口只能挡住专门盯着 3389 的批量爆破。端口扫描器会探测全部 65535 个端口,nmap -sV 这类服务识别能直接认出某个端口上跑的是 RDP(nmap 里的服务名是 ms-wbt-server),换到 13389 依然会被找到。真正起作用的是下面三件事。

1. 来源白名单。 上一节的 -RemoteAddress 和安全组的源地址,就是白名单。只允许办公网出口、堡垒机或 VPN 网关的地址访问远程桌面端口,其余来源的包在第一道防火墙就被丢弃,连输密码的机会都没有。这是效果最明显的一步,比改端口重要得多。

2. 账户锁定策略。 连续输错密码若干次就锁定账户一段时间,让暴力破解慢到没有意义。先查看当前策略,锁定阈值 显示“从不”表示没有启用:

net accounts
net accounts /lockoutthreshold:5 /lockoutwindow:30 /lockoutduration:30

第二条表示:30 分钟内输错 5 次,锁定 30 分钟(锁定观察窗口不能大于锁定时长)。加入域的服务器以域的组策略为准,本地设置会被覆盖。还要注意两点:

  • 锁定策略也会被反过来利用。攻击者故意输错密码,就能把正常用户锁在外面,所以它必须和来源白名单一起用,而不是替代白名单。
  • 内置 Administrator 账户在很多 Windows 版本上默认不受锁定策略约束(较新的系统提供了“允许管理员帐户锁定”的策略,以实际策略设置为准)。稳妥的做法是另建一个管理员账户用于远程登录,把内置的 Administrator 改名或禁用,例如 Rename-LocalUser -Name Administrator -NewName ops-admin。

3. 看日志,确认有没有人在试。 在安全日志里,事件 ID 4625 对应一次登录失败,4740 对应一次账户锁定。下面统计最近 24 小时失败次数最多的来源 IP:

Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} -ErrorAction SilentlyContinue |
  Group-Object { $_.Properties[19].Value } |
  Sort-Object Count -Descending | Select-Object -First 10 Count, Name

开启 NLA 时,部分系统版本记录的失败事件里来源地址显示为“-”,统计结果会集中在这一行,这时要结合安全组或边界防火墙的日志判断来源。开了白名单之后这里仍然有大量记录,说明某一层的来源限制没有生效,回到上一节逐层检查。此外保持网络级别身份验证(NLA)开启、及时安装安全更新;需要从任意地点访问的,用 VPN、堡垒机或远程桌面网关做统一入口,服务器的远程桌面端口只对入口开放。

在管理系统里怎么落地

改 RDP 端口、调整防火墙这类操作,风险都集中在“改完连不上”的那一刻:远程桌面依赖服务器自己的网卡、系统和防火墙,任何一处写错,RDP 通道都会一起断掉。Toplink DCIM 的 IPMI 远程管理 提供经由 BMC 的 VNC 控制台,不经过服务器操作系统的网络,端口改错、防火墙规则写反时,值班人员可以直接在浏览器里看到服务器画面并改回来,整个过程自动录像,事后能回放核对。租用服务器的客户也能在 客户自助端 打开 VNC 控制台,自己处理改端口后连不上的问题,不必等工单。

常见问题

改了端口后,mstsc 和 .rdp 文件怎么写?

mstsc 的“计算机”栏写成 IP:端口,例如 203.0.113.10:13389;.rdp 文件里把 full address 改成同样的写法,或者单独加一行 server port:i:13389。

RDP 端口能改成 443 或 80 吗?

技术上可以,只要该端口没有被其他程序占用。但服务器同时跑网站时会冲突,扫描器也一样会探测这些常用端口,安全上没有额外收益,一般选 1024–49151 之间的一个空闲端口即可。

改 RDP 端口需要重启服务器吗?

不需要,重启远程桌面服务(TermService)就会按新端口监听,但当前的远程会话会断开。服务因依赖关系停不下来时,再重启系统。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88