You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于修改RDP端口脚本正确性及添加IP白名单的技术问询

关于RDP端口修改脚本的正确性验证与白名单功能增强

一、原脚本的正确性分析

你的原脚本核心逻辑是有效的,能完成RDP端口修改的基础需求:

  • 正确修改了RDP服务对应的注册表项HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-TCP\PortNumber
  • 为新端口添加了TCP/UDP协议的入站防火墙允许规则
  • 强制重启终端服务使配置生效

但存在几个潜在问题:

  • 未校验输入端口的合法性:如果输入非数字、超出1-65535范围或和现有端口冲突,会导致配置失败或端口冲突
  • 未清理原3389端口的防火墙规则:若之前存在默认RDP规则,会留下冗余规则存在安全隐患
  • 未提示用户重启终端服务会断开当前所有RDP连接,容易造成未保存的工作丢失
  • 脚本需要管理员权限才能执行,未做权限校验

二、增强版脚本(添加白名单+完善校验)

以下是优化后的脚本,加入了IP白名单功能,同时修复了上述问题:

# 检查是否以管理员身份运行
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if (-not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Host "错误:请以管理员身份运行此脚本!" -ForegroundColor Red
    exit 1
}

# 输入并校验新RDP端口
Write-host "请输入新的RDP端口(1-65535):" -ForegroundColor Yellow -NoNewline
$RDPPort = Read-Host
if (-not ($RDPPort -match '^\d+$' -and $RDPPort -ge 1 -and $RDPPort -le 65535)) {
    Write-Host "错误:输入的端口无效,请输入1-65535之间的整数!" -ForegroundColor Red
    exit 1
}
$RDPPort = [int]$RDPPort

# 输入IP白名单(支持多个IP,用逗号分隔)
Write-host "请输入允许访问RDP的IP白名单(多个IP用逗号分隔,如192.168.1.10,10.0.0.0/24):" -ForegroundColor Yellow -NoNewline
$IPWhitelist = Read-Host
if ([string]::IsNullOrEmpty($IPWhitelist)) {
    Write-Host "警告:未输入白名单IP,将允许所有IP访问新RDP端口!" -ForegroundColor Orange
}

# 修改RDP注册表端口
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-TCP\" -Name PortNumber -Value $RDPPort -ErrorAction Stop

# 删除原3389端口的RDP防火墙规则(如果存在)
Get-NetFirewallRule | Where-Object { $_.DisplayName -match 'Remote Desktop' -and $_.LocalPort -eq 3389 } | Remove-NetFirewallRule -ErrorAction SilentlyContinue

# 添加新端口的防火墙规则(带白名单限制)
$firewallParams = @{
    DisplayName = "NewRDPPort-TCP-In-$RDPPort"
    Direction = "Inbound"
    LocalPort = $RDPPort
    Protocol = "TCP"
    Action = "Allow"
    Enabled = "True"
}
if (-not [string]::IsNullOrEmpty($IPWhitelist)) {
    $firewallParams["RemoteAddress"] = $IPWhitelist -split ',' | ForEach-Object { $_.Trim() }
}
New-NetFirewallRule @firewallParams -ErrorAction Stop

# 添加UDP规则(RDP也会用到UDP传输)
$firewallParams.DisplayName = "NewRDPPort-UDP-In-$RDPPort"
$firewallParams.Protocol = "UDP"
New-NetFirewallRule @firewallParams -ErrorAction Stop

# 提示用户即将断开连接
Write-Host "警告:即将重启终端服务,当前所有RDP连接会被断开,请确认已保存工作!按任意键继续..." -ForegroundColor Red
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

# 重启终端服务
Restart-Service termservice -Force -ErrorAction Stop

Write-Host "RDP端口已成功修改为$RDPPort,白名单配置完成!" -ForegroundColor Green

三、关键改动说明

  • 权限校验:确保脚本以管理员身份运行,避免权限不足报错
  • 端口合法性校验:过滤无效端口输入,防止配置失败
  • IP白名单支持:通过防火墙规则的RemoteAddress参数限制仅指定IP可访问RDP,进一步提升安全性
  • 冗余规则清理:删除原3389端口的默认RDP规则,减少安全暴露面
  • 用户提示:提前告知用户重启服务会断开连接,避免数据丢失

四、后续注意事项

  • 修改端口后,后续RDP连接需使用服务器IP:新端口的格式
  • 若使用动态IP作为白名单,需定期更新防火墙规则
  • 对于445、5985端口的暴力破解,建议同样配置防火墙白名单限制访问源,不要仅依赖RDP端口修改
  • 修改完成后,务必测试VPN环境下的RDP访问,确保连接正常

内容的提问来源于stack exchange,提问作者HelloWorld87654

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:13:26