RDP 端口是多少?3389 端口怎么查、怎么改与放行
RDP 端口默认是 TCP 3389,网络允许时再加一条 UDP 3389。查看用 netstat -ano 或 Get-NetTCPConnection,修改在注册表 RDP-Tcp 下的 PortNumber;改之前先让 Windows 防火墙、云安全组和机房防火墙放行新端口,确认能连再关掉 3389。改端口只能减少扫描,还要配合来源白名单和账户锁定。
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 的规则。
- 准备后路。 打开服务商面板的 VNC 控制台或服务器 BMC 的远程控制台,确认能看到登录界面。改错了,只能从这里进去改回来。
- 选一个空闲端口。 选 1024–49151 之间的端口,避开 Windows 的动态端口范围(默认 49152–65535,可用
netsh int ipv4 show dynamicport tcp查看),也避开服务器上其他程序要用的端口。下面两条命令都没有输出,说明 13389 空闲:
Get-NetTCPConnection -LocalPort 13389 -ErrorAction SilentlyContinue
Get-NetUDPEndpoint -LocalPort 13389 -ErrorAction SilentlyContinue
- 先放行新端口。 Windows 防火墙、云安全组、机房防火墙三处都加上新端口的规则,3389 的规则暂时保留,具体写法见下一节。
- 修改 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,服务就无法按预期监听。
- 重启服务并用新端口连接。 当前远程会话会立即断开:
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)就会按新端口监听,但当前的远程会话会断开。服务因依赖关系停不下来时,再重启系统。