Skip to content

RDP 代理服务器 ​

RDP 代理服务器是 Next Terminal 提供的原生 RDP 入口。开启后,用户可以在 Web 端为已授权的 RDP 资产下载 .rdp 文件,并使用 Windows 远程桌面、Microsoft Remote Desktop 等标准 RDP 客户端连接到 Next Terminal,再由 Next Terminal 代理访问真实的 Windows 远程桌面资产。

和 Web 页面内的远程桌面访问不同,RDP 代理服务器面向本地 RDP 客户端,适合需要原生客户端体验、剪贴板、磁盘重定向、RemoteApp 等能力的场景。

主要特性 ​

  • 标准 RDP 客户端访问: 用户无需安装专用客户端,直接使用系统自带或常见 RDP 客户端打开 .rdp 文件
  • 统一 RDP 入口: 对外只暴露一个固定 RDP 代理地址,通过 Next Terminal 解析到不同目标资产
  • 短期一次性票据: .rdp 文件内使用 NTICKET 票据登录代理,票据默认 300 秒有效,解析成功后立即失效
  • 权限控制: 只能为当前用户已授权的 RDP 资产生成票据和下载 .rdp 文件
  • 会话审计: 通过代理建立的 RDP 会话会创建 Next Terminal 会话记录,可参与审计和录像策略
  • 剪贴板和磁盘重定向: 生成的 .rdp 文件默认启用剪贴板,并重定向客户端全部磁盘
  • RemoteApp 支持: 如果 RDP 资产配置了 RemoteApp,生成的 .rdp 文件会自动携带 RemoteApp 参数

使用方式 ​

步骤 1: 按访问方式决定是否开放 RDP 代理端口 ​

RDP 代理服务器监听独立端口。是否需要在 docker-compose.yaml 中映射该端口,取决于实际访问方式:

  • 直接使用本地 RDP 客户端连接代理地址:需要映射 RDP 代理端口。
  • 在 Web 页面下载 .rdp 文件后打开连接:需要映射 RDP 代理端口,因为本地 RDP 客户端会连接 .rdp 文件中的代理地址。
  • 通过 Termark WebSocket 隧道访问:通常不需要对外暴露 RDP 代理端口,Termark 会通过 Next Terminal Web 服务建立隧道并转发到本地访问。

默认 RDP 代理监听端口为 3390。如果需要直连代理地址,可以按下面方式为 next-terminal 服务增加端口映射:

yaml
services:
  next-terminal:
    ports:
      - "8088:8088"
      - "2022:2022"
      - "3390:3390"

如果你在系统设置中使用了其他监听端口,需要同步修改端口映射。例如监听地址为 0.0.0.0:3391 时,应映射:

yaml
ports:
  - "3391:3391"

修改完成后,重建 next-terminal 容器使端口映射生效:

bash
docker compose up -d --force-recreate next-terminal

Termark WebSocket 隧道

如果只通过 Termark WebSocket 隧道访问 RDP 资产,可以不映射 3390 到宿主机,也不需要在防火墙或安全组中放行该端口。此时需要确保 Termark 能访问 Next Terminal 的 Web 服务地址,并且反向代理支持 WebSocket。

步骤 2: 在系统设置开启 RDP 代理服务器 ​

登录 Next Terminal,进入「系统设置」>「RDP 代理服务器」,按下面的方式配置:

  • RDP 代理服务: 开启后,Next Terminal 会启动 RDP 代理监听服务
  • 监听地址: RDP 代理服务器监听的 IP 地址和端口,默认 0.0.0.0:3390
  • 对外访问地址: 写入 .rdp 文件的连接地址,例如 rdp.example.com:3390。如果为空,系统会根据监听地址和当前 Web 请求地址自动推导
  • 票据有效期(秒): .rdp 文件内票据的有效时间,默认 300 秒,支持设置为 60 到 3600 秒

对外访问地址怎么填

如果 Next Terminal 部署在反向代理、NAT、容器端口映射或负载均衡后面,建议显式填写客户端真正能访问到的 RDP 地址,例如 rdp.example.com:3390 或 10.0.0.10:3390。如果留空,而监听地址是 0.0.0.0:3390,系统会使用当前 Web 请求的主机名加 RDP 端口推导地址,这在复杂网络环境中可能不准确。

安全建议

如果监听地址配置为 0.0.0.0:3390,表示 RDP 代理端口可能被外部网络访问。请在防火墙、安全组或访问控制策略中只允许可信来源访问该端口。

RDP 代理服务器启动时会自动生成用于 RDP 安全层的证书和私钥,默认保存到:

text
data/rdp-proxy/server.crt
data/rdp-proxy/server.key

使用自签名证书时,RDP 客户端首次连接可能会提示证书或服务器身份警告,确认地址无误后继续连接即可。

步骤 3: 创建并授权 RDP 资产 ​

RDP 代理服务器只支持协议为 RDP 的资产。使用前需要确认:

  1. 资产协议选择为 RDP
  2. 资产地址、端口、账号、密码、域等连接信息配置正确
  3. 当前用户已被授权访问该资产
  4. 如果目标资产需要通过网关访问,相关网关配置可正常连通

用户下载 .rdp 文件时,Next Terminal 会先校验资产授权;RDP 客户端连接代理后,代理再根据票据解析真实目标资产和连接凭据。用户不需要知道目标 Windows 主机的账号密码。

步骤 4: 下载 .rdp 文件 ​

进入「资产」页面,找到 RDP 资产,在操作菜单中点击「下载RDP文件」。

Next Terminal 会生成一个短期票据,并下载类似下面名称的文件:

text
next-terminal-RTxxxx.rdp

.rdp 文件中的关键内容类似:

text
full address:s:rdp.example.com:3390
username:s:NTICKET:<ticketId>:<secret>
prompt for credentials:i:0
authentication level:i:2
enablecredsspsupport:i:0
redirectclipboard:i:1
drivestoredirect:s:*

字段含义:

  • full address: RDP 代理服务器地址,对应系统设置中的「对外访问地址」或自动推导地址
  • username: Next Terminal 生成的一次性票据,格式为 NTICKET:<ticketId>:<secret>
  • prompt for credentials:i:0: 不弹出额外凭据输入框
  • enablecredsspsupport:i:0: 关闭前端客户端到代理这一段的 CredSSP/NLA
  • redirectclipboard:i:1: 启用剪贴板重定向
  • drivestoredirect:s:*: 重定向客户端全部磁盘

票据只能短时间使用

.rdp 文件中的票据默认 300 秒过期,并且成功解析一次后就会失效。请在下载后尽快打开连接,不要长期保存或重复使用旧 .rdp 文件。如果连接失败后提示票据过期、票据不存在或票据已使用,重新下载 .rdp 文件即可。

步骤 5: 使用 RDP 客户端连接 ​

下载 .rdp 文件后,使用本地 RDP 客户端打开:

  • Windows: 双击 .rdp 文件,或使用「远程桌面连接」
  • macOS: 使用 Microsoft Remote Desktop 导入或打开 .rdp 文件
  • Linux: 使用支持 .rdp 文件的 RDP 客户端,或根据文件内容手动填写代理地址和用户名

连接流程如下:

  1. RDP 客户端连接到 Next Terminal 的 RDP 代理地址
  2. 代理读取 .rdp 文件中的 NTICKET 票据
  3. Next Terminal 校验票据、用户权限和资产信息
  4. 代理连接真实 RDP 资产,并使用资产中配置的账号密码登录目标 Windows 主机
  5. 会话结束后,Next Terminal 记录会话断开状态

关于 NLA

生成的 .rdp 文件会关闭客户端到 RDP 代理这一段的 NLA/CredSSP,这是代理解析票据所需的行为。代理连接后端 Windows 目标资产时仍会启用 NLA。通常不需要手动修改 .rdp 文件。

文件传输与剪贴板 ​

当前版本生成的 .rdp 文件默认开启:

text
redirectclipboard:i:1
drivestoredirect:s:*

这意味着 RDP 客户端通常可以使用剪贴板复制文本或文件,也可以在远程桌面会话中访问本机重定向磁盘。实际效果仍取决于以下因素:

  • 本地 RDP 客户端是否支持剪贴板和磁盘重定向
  • 本地客户端是否允许重定向全部磁盘
  • 目标 Windows 主机的远程桌面策略是否允许剪贴板或磁盘重定向
  • 企业终端安全软件或组策略是否拦截文件传输

如果资产配置了 RemoteApp,.rdp 文件还会包含 remoteapplicationmode、remoteapplicationprogram 等字段,打开后会直接启动指定远程应用,而不是完整桌面。

常见问题 ​

页面上看不到「下载RDP文件」 ​

请检查:

  1. 资产协议是否为 RDP
  2. 当前用户是否已被授权访问该资产
  3. 当前页面是否为资产列表或支持 RDP 代理下载的入口

下载 .rdp 文件失败 ​

请检查:

  1. 当前登录状态是否有效
  2. 账号是否需要先完成双因素认证
  3. 资产是否仍然存在且协议为 RDP
  4. 用户是否仍有资产访问权限

RDP 客户端无法连接代理地址 ​

请检查:

  1. 端口是否开放: 防火墙、安全组或云厂商安全策略是否允许访问 RDP 代理端口
  2. 端口是否映射: Docker 部署时是否将容器内监听端口映射到宿主机
  3. 对外访问地址是否正确: .rdp 文件中的 full address 是否是客户端可达地址
  4. 服务是否开启: 系统设置中的 RDP 代理服务器是否已开启并保存
  5. 服务是否启动: Next Terminal 日志中是否显示 RDP proxy sidecar 启动成功
  6. 监听地址是否冲突: 3390 或自定义端口是否已被其他进程占用

可以使用下面的命令测试端口连通性:

bash
telnet rdp.example.com 3390
# 或
nc -zv rdp.example.com 3390

提示票据过期、票据不存在或票据已使用 ​

RDP 代理票据是短期一次性凭据,常见原因包括:

  1. 下载 .rdp 文件后等待太久才打开,超过票据有效期
  2. 同一个 .rdp 文件已经成功连接过一次
  3. RDP 客户端自动重连时复用了已消费的旧票据
  4. 手动编辑 .rdp 文件导致 NTICKET 用户名不完整

处理方式是重新在资产页面点击「下载RDP文件」,使用新下载的文件连接。

可以手动输入 Windows 账号密码连接代理吗 ​

不建议,也不是 RDP 代理服务器的设计用法。RDP 代理服务器使用 .rdp 文件中的 NTICKET:<ticketId>:<secret> 票据识别用户和资产,再由 Next Terminal 使用资产中保存的凭据连接真实 Windows 主机。

如果直接在 RDP 客户端里输入 Windows 账号密码,代理无法知道要连接哪一台资产,也无法完成权限校验和会话审计。

与 Web RDP 访问有什么区别 ​

  • RDP 代理服务器: 使用本地 RDP 客户端连接,体验更接近原生远程桌面,适合需要本地剪贴板、磁盘重定向、RemoteApp 或原生客户端能力的场景
  • Web RDP 访问: 通过浏览器访问,无需暴露 RDP 代理端口,也无需本地 RDP 客户端,更适合临时访问或受限终端环境

是否支持在线监控和手动断开 ​

当前 RDP 代理会话会记录会话状态,并可按策略参与录像和审计;但 RDP 代理会话暂不支持在线监控和从 Web 端主动断开。

与 SSH 代理服务器有什么区别 ​

  • RDP 代理服务器: 面向 Windows 远程桌面协议,通过 .rdp 文件和短期票据访问 RDP 资产
  • SSH 代理服务器: 面向 SSH 协议,通过标准 SSH 客户端访问 SSH 资产,支持交互选择、直连模式和 SSH 隧道