Windows直接开启远程桌面，即使使用复杂密码也会遇到撞库或者0day漏洞等问题。常用的安全方案是组件内网并只允许指定的IP访问特定的网卡，这样即使出现了意外情况也不会被碰撞到远程桌面。以最常用的easytier组件内网为例：在需要开启远程桌面的电脑（被控电脑）上安装easytier并配置固定IP地址而不是自动的DHCP，比如给定IP地址10.144.144.20在管理电脑上安装easytier并配置固定IP地址而不是自动的DHCP，比如给定IP地址10.144.144.11修改默认的RDP端口3389改成其他端口，比如53389指定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二、先加固 EasyTier1. 使用固定虚拟 IPRDP 被控电脑和管理电脑都应使用固定 EasyTier IP，不建议对它们使用可能变化的 DHCP 地址。EasyTier 文档说明，DHCP 模式遇到地址冲突时可能自动更换地址；如果地址变化，绑定了本地 IP 的防火墙规则将不再匹配。例如被控电脑固定为：10.144.144.20管理电脑固定为：10.144.144.112. 使用强网络密钥和 Secure ModeEasyTier 至少应配置：--network-name --network-secret --secure-modenetwork_secret 用于验证节点是否属于该虚拟网络；Secure Mode 使用新的安全握手和认证路径。如果使用公共共享节点或第三方中继，仅开启 Secure Mode 还不够。应固定共享节点私钥，并在客户端配置 peer_public_key，否则连接虽然加密，但未必验证了中继节点的真实身份。3. 启用 EasyTier ACL支持 ACL 的版本中，建议把管理电脑放入类似 admin 或 management 组，只允许该组访问被控电脑的 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 YellowWindows 防火墙默认阻止未匹配允许规则的入站流量；自定义规则可以同时限制本地地址、远程地址、服务、端口和接口。因此，不需要再建立一条“阻止其他来源”的 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 电脑。
最开始使用frp进行组网，但是存在多平台的服务持久化、加密认证等一系列不便之处。后来使用ZeroTier，虽然本身设计不错，但无法控制根节点，自建也仅限于moon节点，打洞和UDP很慢。于是，最后采用了EasyTier，不仅能平替ZeroTier，还能完全控制自建节点。以下教程使用Debian 12作为服务端，Windows作为客户端。搭建Linux服务端下载程序在EasyTier GitHub发布页下载对应版本，当前（2025年4月9日）是easytier-linux-x86_64-v2.2.4.zip，随后解压并命名，具体操作如下，需要root权限：cd /opt/ # 进入 /opt目录 wget https://github.com/EasyTier/EasyTier/releases/download/v2.2.4/easytier-linux-x86_64-v2.2.4.zip # 下载软件，注意更新版本 unzip easytier-linux-x86_64-v2.2.4.zip # 解压 mv easytier-linux-x86_64 easytier # 重命名文件夹创建systemd文件创建/etc/systemd/system/easytier.service文件，在里面写入以下内容。注意以下几个关键点：10.144.144.1 是虚拟的IP地址，每个设备分配一个，只要不冲突就可以EasyTierNode 是网络名称，随意即可Password@EasyTierNode 是密码，建议使用复杂度高的，避免被他人滥用完整的systemd文件内容如下：[Unit] Description=EasyTier Service After=network.target syslog.target Wants=network.target [Service] Type=simple ExecStart=/opt/easytier/easytier-core --ipv4 10.144.144.1 --network-name EasyTierNode --network-secret Password@EasyTierNode [Install] WantedBy=multi-user.target启动和使用命令如下：systemctl daemon-reload # 重新加载systemd文件，只有改动之后才需要知性 systemctl enable easytier.service # 设置EasyTier开机自启 systemctl start easytier.service # 立刻启动EasyTier systemctl stop easytier.service # 关闭EasyTier systemctl restart easytier.service # 重启EasyTier systemctl status easytier.service # 查看EasyTier状态此外，可以使用以下命令查看信息：/opt/easytier/easytier-cli peer查看虚拟网中的节点信息/opt/easytier/easytier-cli route查看虚拟网路由信息/opt/easytier/easytier-cli node查看当前节点的信息Linux客户端除了systemd文件以外，所有内容和搭建Linux服务端一致。注意以下几个关键点：10.144.144.2 是新设备的IP地址，不能与其他设备冲突EasyTierNode 是网络名称，必须与服务端一致Password@EasyTierNode 是密码，必须与服务端一致--peers tcp://1.2.3.4:11010中的1.2.3.4是服务端的真实IP地址，不是设置的10.144.144.1完整的systemd文件内容如下：[Unit] Description=EasyTier Service After=network.target syslog.target Wants=network.target [Service] Type=simple ExecStart=/opt/easytier/easytier-core --ipv4 10.144.144.2 --network-name EasyTierNode --network-secret Password@EasyTierNode --peers tcp://1.2.3.4:11010 [Install] WantedBy=multi-user.targetWindows客户端推荐使用安装为Windows服务的方式启用easy tier，不然存在开启后需要手动确认才能启用的bug，具体教程参考官方文档：https://easytier.cn/guide/network/install-as-a-windows-service.html以下是传统的安装方式，不推荐。在EasyTier GitHub发布页下载对应版本，当前（2025年4月9日）是easytier-gui_2.2.4_x64-setup.exe ，随后运行并安装。建议右上角切换成中文以及开机自启。取消DHCP，方便多设备的时候手动控制手动输入一个不冲突的IP地址，比如前面用来10.114.114.1和10.114.114.2，那这里就填写10.114.114.3填写此前设置的名称和密码，以上例子分别为EasyTierNode和Password@EasyTierNode填写服务器的协议方式、IP地址和端口，比如tcp://1.2.3.4:11010，是服务端的真实IP地址，不是设置的10.144.144.1，除了tcp，还有多种方式，可以使用/opt/easytier/easytier-cli node详细查看，推荐使用tcp点击运行即可最终效果如图：注意考虑到节点可能存在的掉线和服务器宕机，建议在4. 填写服务器的协议方式、IP地址和端口的时候，多写一个，比如另外一个客户端tcp://1.2.3.5:11010，这样会在原先服务tcp://1.2.3.4:11010掉线之后，依旧可以正常使用。