Windows直接开启远程桌面,即使使用复杂密码也会遇到撞库或者0day漏洞等问题。常用的安全方案是组件内网并只允许指定的IP访问特定的网卡,这样即使出现了意外情况也不会被碰撞到远程桌面。
以最常用的easytier组件内网为例:

  1. 在需要开启远程桌面的电脑(被控电脑)上安装easytier并配置固定IP地址而不是自动的DHCP,比如给定IP地址10.144.144.20
  2. 在管理电脑上安装easytier并配置固定IP地址而不是自动的DHCP,比如给定IP地址10.144.144.11
  3. 修改默认的RDP端口3389改成其他端口,比如53389
  4. 指定RDP只监听easytier的网卡进入的连接,并且只允许10.144.144.11连接

一、安全模型

预设如下:

被控电脑 EasyTier IP:10.144.144.20
管理电脑 EasyTier IP:10.144.144.11
RDP 端口:53389
EasyTier 网段:10.144.144.0/24

防火墙规则:

来源地址:10.144.144.11/32
目标地址:10.144.144.20
入站接口:EasyTier 虚拟网卡
目标服务:Remote Desktop Services
目标端口:TCP/UDP 53389

这样,即使 EasyTier 网络中还有其他设备,它们也不能访问这台电脑的远程桌面。

只有确实需要所有 EasyTier 节点都能连接时,才放宽为:

10.144.144.0/24

二、先加固 EasyTier

1. 使用固定虚拟 IP

RDP 被控电脑和管理电脑都应使用固定 EasyTier IP,不建议对它们使用可能变化的 DHCP 地址。EasyTier 文档说明,DHCP 模式遇到地址冲突时可能自动更换地址;如果地址变化,绑定了本地 IP 的防火墙规则将不再匹配。

例如被控电脑固定为:

10.144.144.20

管理电脑固定为:

10.144.144.11

2. 使用强网络密钥和 Secure Mode

EasyTier 至少应配置:

--network-name
--network-secret
--secure-mode

network_secret 用于验证节点是否属于该虚拟网络;Secure Mode 使用新的安全握手和认证路径。

如果使用公共共享节点或第三方中继,仅开启 Secure Mode 还不够。应固定共享节点私钥,并在客户端配置 peer_public_key,否则连接虽然加密,但未必验证了中继节点的真实身份。

3. 启用 EasyTier ACL

支持 ACL 的版本中,建议把管理电脑放入类似 adminmanagement 组,只允许该组访问被控电脑的 TCP 53389

EasyTier 支持使用 ACL 限制节点间访问,也提供 --tcp-whitelist 53389 生成简单端口白名单的方式;但从安全角度,最好进一步结合节点组或身份限制来源,而不是只限制端口。

除非确实需要,不要在 RDP 被控电脑上启用:

proxy-networks
子网代理
公共中继
无关的监听端口

三、Windows 11 安全配置脚本

在被控电脑本地,以管理员身份打开 PowerShell。

首先把下面的:

'10.144.144.11/32'

修改为实际管理电脑的 EasyTier IP。

# =====================================================
# Windows 11 RDP over EasyTier 安全配置
# =====================================================

$RdpPort = 53389

# 推荐填写允许管理本机的具体 EasyTier 节点地址
$AllowedSources = @(
    '10.144.144.11/32'

    # 多台管理电脑可以继续添加:
    # '10.144.144.12/32'
)

$TerminalServerPath =
    'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server'

$RdpTcpPath =
    'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp'

$TcpRuleName = 'RDP-EasyTier-Secure-TCP'
$UdpRuleName = 'RDP-EasyTier-Secure-UDP'

# -----------------------------------------------------
# 1. 自动查找本机 10.144.144.x EasyTier 地址
# -----------------------------------------------------

$EasyTierCandidates = @(
    Get-NetIPAddress `
        -AddressFamily IPv4 `
        -ErrorAction Stop |
    Where-Object {
        $_.IPAddress -match '^10\.144\.144\.\d{1,3}$' -and
        $_.AddressState -eq 'Preferred'
    }
)

if ($EasyTierCandidates.Count -eq 0) {
    throw @'
没有找到 10.144.144.x 的 EasyTier 虚拟地址。

请确认:
1. EasyTier 已经启动;
2. 被控电脑已加入虚拟网络;
3. 本机已获得固定 EasyTier IP。
'@
}

if ($EasyTierCandidates.Count -gt 1) {
    Write-Host '检测到多个匹配地址:' -ForegroundColor Yellow

    $EasyTierCandidates |
        Format-Table IPAddress,PrefixLength,InterfaceAlias,InterfaceIndex

    throw '存在多个 EasyTier 地址,请手工指定目标虚拟网卡。'
}

$EasyTierIP    = $EasyTierCandidates[0].IPAddress
$EasyTierAlias = $EasyTierCandidates[0].InterfaceAlias

Write-Host "EasyTier 网卡:$EasyTierAlias" -ForegroundColor Cyan
Write-Host "EasyTier 地址:$EasyTierIP" -ForegroundColor Cyan

# -----------------------------------------------------
# 2. 备份当前 RDP 注册表和防火墙配置
# -----------------------------------------------------

$BackupDirectory = Join-Path `
    $env:ProgramData `
    ("RDP-EasyTier-Backup-{0}" -f (Get-Date -Format 'yyyyMMdd-HHmmss'))

New-Item `
    -Path $BackupDirectory `
    -ItemType Directory `
    -Force | Out-Null

reg.exe export `
    'HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server' `
    "$BackupDirectory\TerminalServer.reg" `
    /y | Out-Null

netsh.exe advfirewall export `
    "$BackupDirectory\WindowsFirewall.wfw" | Out-Null

Write-Host "配置备份位置:$BackupDirectory" -ForegroundColor Cyan

# -----------------------------------------------------
# 3. 确保 Windows 防火墙启用,并默认阻止入站流量
# -----------------------------------------------------

Set-NetFirewallProfile `
    -Profile Domain,Private,Public `
    -Enabled True `
    -DefaultInboundAction Block

# -----------------------------------------------------
# 4. 开启 RDP、启用 NLA、设置端口
# -----------------------------------------------------

Set-ItemProperty `
    -Path $TerminalServerPath `
    -Name 'fDenyTSConnections' `
    -Value 0

Set-ItemProperty `
    -Path $RdpTcpPath `
    -Name 'UserAuthentication' `
    -Value 1

Set-ItemProperty `
    -Path $RdpTcpPath `
    -Name 'PortNumber' `
    -Value $RdpPort

# -----------------------------------------------------
# 5. 禁用 Windows 内置的宽范围 RDP 放行规则
# -----------------------------------------------------

Get-NetFirewallRule -ErrorAction SilentlyContinue |
    Where-Object {
        $_.Name -like 'RemoteDesktop-*'
    } |
    Disable-NetFirewallRule

# -----------------------------------------------------
# 6. 清除之前可能创建的自定义 RDP 规则
# -----------------------------------------------------

$OldRules = @(
    $TcpRuleName
    $UdpRuleName
    'RDP-EasyTier-53389-TCP'
    'RDP-EasyTier-53389-UDP'
    'RDP-53389-TCP-Allow-10.144.144.0-24'
    'RDP-53389-UDP-Allow-10.144.144.0-24'
)

Get-NetFirewallRule `
    -Name $OldRules `
    -ErrorAction SilentlyContinue |
    Remove-NetFirewallRule

# -----------------------------------------------------
# 7. 创建严格限制的 TCP 规则
# -----------------------------------------------------

New-NetFirewallRule `
    -Name $TcpRuleName `
    -DisplayName 'RDP TCP 53389 - EasyTier Restricted' `
    -Description "仅允许指定 EasyTier 节点访问 $EasyTierIP`:53389" `
    -Direction Inbound `
    -Action Allow `
    -Enabled True `
    -Profile Any `
    -Protocol TCP `
    -LocalPort $RdpPort `
    -LocalAddress $EasyTierIP `
    -RemoteAddress $AllowedSources `
    -InterfaceAlias $EasyTierAlias `
    -Service TermService `
    -EdgeTraversalPolicy Block

# -----------------------------------------------------
# 8. 创建严格限制的 UDP 规则
# -----------------------------------------------------

New-NetFirewallRule `
    -Name $UdpRuleName `
    -DisplayName 'RDP UDP 53389 - EasyTier Restricted' `
    -Description "仅允许指定 EasyTier 节点访问 $EasyTierIP`:53389" `
    -Direction Inbound `
    -Action Allow `
    -Enabled True `
    -Profile Any `
    -Protocol UDP `
    -LocalPort $RdpPort `
    -LocalAddress $EasyTierIP `
    -RemoteAddress $AllowedSources `
    -InterfaceAlias $EasyTierAlias `
    -Service TermService `
    -EdgeTraversalPolicy Block

Write-Host ''
Write-Host 'RDP 安全配置已完成:' -ForegroundColor Green
Write-Host "  EasyTier 接口:$EasyTierAlias"
Write-Host "  被控端地址:$EasyTierIP"
Write-Host "  RDP 端口:$RdpPort"
Write-Host "  允许来源:$($AllowedSources -join ', ')"
Write-Host '  NLA:启用'
Write-Host '  Windows 内置 RDP 规则:禁用'
Write-Host ''
Write-Host '请检查输出无误后重新启动电脑。' -ForegroundColor Yellow

Windows 防火墙默认阻止未匹配允许规则的入站流量;自定义规则可以同时限制本地地址、远程地址、服务、端口和接口。因此,不需要再建立一条“阻止其他来源”的 RDP 规则,默认入站阻止已经承担这个作用,而且显式阻止规则可能覆盖允许规则。

Microsoft 建议不要关闭 Windows 防火墙,因为关闭后会失去服务强化、启动阶段过滤和其他网络保护。

四、重启并测试

修改 RDP 监听端口后需要重启 Windows。RDP 默认端口是 3389,也可以修改为其他端口;修改端口本身只能减少普通扫描噪声,真正的安全边界仍然是 EasyTier 身份控制和 Windows 防火墙来源限制。

执行:

Restart-Computer

从允许的管理电脑连接:

mstsc /v:10.144.144.20:53389

先测试端口:

Test-NetConnection 10.144.144.20 -Port 53389

应显示:

TcpTestSucceeded : True

从其他未列入 $AllowedSources 的 EasyTier 节点执行同样测试,应显示:

TcpTestSucceeded : False

同时测试物理局域网地址:

Test-NetConnection 被控电脑物理局域网IP -Port 53389

也应失败。

五、检查规则是否真正绑定到 EasyTier

在被控电脑上执行:

$Rules = @(
    'RDP-EasyTier-Secure-TCP'
    'RDP-EasyTier-Secure-UDP'
)

Get-NetFirewallRule -Name $Rules |
    Format-Table Name,Enabled,Direction,Action,Profile

查看来源和目标地址:

Get-NetFirewallRule -Name $Rules |
    Get-NetFirewallAddressFilter |
    Format-Table LocalAddress,RemoteAddress

正常应类似:

LocalAddress    RemoteAddress
------------    -------------
10.144.144.20   10.144.144.11/32

查看接口:

Get-NetFirewallRule -Name $Rules |
    Get-NetFirewallInterfaceFilter |
    Format-Table InterfaceAlias

查看端口:

Get-NetFirewallRule -Name $Rules |
    Get-NetFirewallPortFilter |
    Format-Table Protocol,LocalPort

成功连接后检查实际来源:

Get-NetTCPConnection `
    -LocalPort 53389 `
    -State Established |
    Select-Object LocalAddress,LocalPort,RemoteAddress,RemotePort

应看到来源为允许的 EasyTier 地址:

LocalAddress    LocalPort    RemoteAddress
------------    ---------    -------------
10.144.144.20   53389        10.144.144.11

最终推荐配置

最理想的结果是:

公网端口转发:无
物理局域网 RDP:不可访问
EasyTier 整个 /24:不全部放行
允许的管理节点:具体 /32 地址
EasyTier Secure Mode:开启
公共中继公钥:固定并校验
Windows 防火墙:开启
默认入站策略:阻止
NLA:开启
RDP 用户:独立标准用户
RDP 端口:53389,可选

其中最重要的改进,是把原来的:

RemoteAddress = 10.144.144.0/24

收紧为:

RemoteAddress = 管理电脑的 EasyTier IP/32

这样即使 EasyTier 网络中的某个普通节点被入侵,也不能直接尝试登录这台 Windows 电脑。

标签: windows, 远程桌面, easytier

添加新评论