如何搭建一款私有化部署的远程桌面

相关阅读

项目介绍

新一代主机管理工具,支持web shell和web桌面,居家办公神器

功能特性

  1. 支持私有化部署
  2. 较小的内存占用(约20M左右
  3. 支持tls安全连接
  4. 支持多路异步IO
  5. 支持虚拟链路层
  6. 支持链路和终端会话监控
  7. protobuf数据编码
  8. 支持web shell
    • linux和mac系统支持创建pty设备和颜色输出
    • windows系统支持powershell
  9. 支持web vnc
    • 支持基本的键盘鼠标操作
    • 支持全屏显示
    • 支持滚动
    • 支持远程剪贴板设置与读取
  10. 支持多种操作系统
  • linux
  • windows
  • macos

实现原理

支持tls链接,protobuf进行数据传输,下面举例远程连接服务器集群内的某台主机

图片[1]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

server端配置(10.0.1.1):

listen: 6154       # 监听端口号
secret: 0123456789 # 预共享密钥
log:
  dir: /opt/natpass/logs # 路径
  size: 50M   # 单个文件大小
  rotate: 7   # 保留数量
tls:
  key: /dir/to/tls/key/file # tls密钥
  crt: /dir/to/tls/crt/file # tls证书

服务器client配置(192.168.1.100):

id: server            # 客户端ID
server: 10.0.1.1:6154 # 服务器地址
secret: 0123456789    # 预共享密钥,必须与server端相同,否则握手失败
log:
  dir: /opt/natpass/logs # 路径
  size: 50M   # 单个文件大小
  rotate: 7   # 保留数量

办公网络client配置(172.16.1.100):

id: work              # 客户端ID
server: 10.0.1.1:6154 # 服务器地址
secret: 0123456789    # 预共享密钥,必须与server端相同,否则握手失败
log:
  dir: /opt/natpass/logs # 路径
  size: 50M   # 单个文件大小
  rotate: 7   # 保留数量
rules:                          # 远端rule列表可为空
  - name: rdp                   # 链路名称
    target: server              # 目标客户端ID
    type: shell                 # 连接类型tcp或udp
    local_addr: 0.0.0.0         # 本地监听地址
    local_port: 3389            # 本地监听端口号

工作流程如下:

  1. 办公网络与家庭网络中的np-cli创建tls连接到np-svr
  2. np-cli服务发送握手包,并将配置文件中的secret字段进行md5哈希
  3. np-svr等待握手报文,若等待超时则为非法链接,直接断开
  4. 用户打开办公网络主机172.16.1.100上的终端页面,并连接到服务器集群中的主机server
  5. 172.16.1.100上的np-cli发送connect_request消息,并将连接类型设置为shell
  6. np-svr转发connect_request消息至192.168.1.100上的np-cli
  7. 192.168.1.100上的np-cli接收到connect_request消息,创建/bin/bash进程
  8. 192.168.1.100上的np-cli根据链接创建结果返回connect_response消息
  9. np-svr转发connect_response消息至172.16.1.100上的np-cli
  10. 172.168.1.100上的np-cli接收connect_response消息
  11. 开始转发网页上的输入输出内容

软件架构

图片[2]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

效果截图

dashboard页面

图片[3]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

linux命令行效果

图片[4]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

windows命令行效果

图片[5]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

windows2008远程桌面

图片[6]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

windows10远程桌面

图片[7]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

windows11远程桌面

图片[8]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

ubuntu远程桌面

图片[9]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

fedora远程桌面

图片[10]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

deepin远程桌面

图片[11]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

macos远程桌面

图片[12]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

windows读取剪贴板内容

图片[13]-如何搭建一款私有化部署的远程桌面-FancyPig's blog

部署教程

开始使用

部署过程共分为三部分:服务器端受控端控制端,下面以debian系统进行举例。

服务器端部署

  1. 在服务器上下载对应的安装包并解压到任意目录
  2. 使用以下命令启动服务器端程序 sudo ./np-svr -conf server.yaml
  3. (可选)开放外网防火墙,默认端口6154

受控端部署

  1. 在受控端机器上下载并解压到任意目录
  2. (可选)修改remote.yaml配置文件,修改server地址
  3. 使用以下命令启动客户端程序 sudo ./np-cli -conf remote.yaml -user `whoami`

控制端部署

  1. 在本地控制机上下载并解压到任意目录
  2. (可选)修改local.yaml配置文件,修改server地址
  3. (可选)修改rule.d目录下的规则配置文件,rule配置方法
  4. 使用以下命令启动客户端程序 sudo ./np-cli -conf local.yaml
  5. 在以上操作成功后即可在浏览器中通过local.yaml中配置的端口号进行访问,默认地址: http://127.0.0.1:8080

安全连接(可选)

  • 建议使用tls加密连接,使用方式如下
 - 修改服务器端的server.yaml文件,配置tls相关文件路径,并重启服务
 - 修改受控端的remote.yaml配置,将ssl设置为true,并重启服务
 - 修改控制端的local.yaml配置,将ssl设置为true,并重启服务
  • 修改默认连接密钥,修改方式如下
 - 使用以下命令生成一个16位随机串
   tr -dc A-Za-z0-9 < /dev/urandom|dd bs=16 count=1 2>/dev/null
 - 修改服务器端的common.yaml文件,将secret设置为新的密钥,并重启服务
 - 修改受控端的common.yaml文件,将secret设置为新的密钥,并重启服务
 - 修改控制端的common.yaml文件,将secret设置为新的密钥,并重启服务

注册系统服务(可选)

  1. 在命令行中使用-action install参数即可将程序注册为系统服务,使用参数-user可设置该服务的启动身份
  2. linux系统使用systemd管理系统服务,windows系统可用services.msc面板启动或停止服务

规则配置

所有链接均为正向配置,由连接发起方进行配置

shell规则

shell规则用于创建一个网页端的命令行操作页面

- name: shell             # 链路名称
  target: that            # 目标客户端ID
  type: shell             # web shell
  local_addr: 0.0.0.0     # 本地监听地址
  local_port: 8080        # 本地监听端口号
  #exec: /bin/bash        # 运行命令
                          # windows默认powershell或cmd
                          # 其他系统bash或sh
  env:                    # 环境变量设置
    - TERM=xterm
  1. name: 该规则名称,必须全局唯一
  2. target: 对端客户端ID
  3. type: shell
  4. local_addr: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上
  5. local_port: 本地监听端口号
  6. exec: 连接建立成功后的启动命令
    • 指定该参数:直接使用设定的命令运行
    • linux系统:优先查找bash命令,若没有则查找sh命令,否则报错
    • windows系统:优先查找powershell命令,若没有则查找cmd命令,否则报错
  7. env: 进程启动时的环境变量设置

连接成功后即可使用浏览器访问local_port所对应的端口来创建shell,如http://127.0.0.1:8080

vnc规则

vnc规则用于创建一个网页端的远程桌面操作页面,目前仅支持windows操作系统

- name: vnc            # 链路名称
  target: that         # 目标客户端ID
  type: vnc            # web vnc
  local_addr: 0.0.0.0  # 本地监听地址
  local_port: 5900     # 本地监听端口号
  fps: 10              # 刷新频率
  1. name: 该规则名称,必须全局唯一
  2. target: 对端客户端ID
  3. type: shell
  4. local_addr: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上
  5. local_port: 本地监听端口号
  6. fps: 每秒钟截屏多少次,最高50

连接成功后即可使用浏览器访问local_port所对应的端口来创建vnc,如http://127.0.0.1:5900

注意:

  1. 创建vnc连接后远端服务会创建一个子进程进行截屏和键鼠操作, 主进程会在6155~6955之间选一个端口进行监听用于与子进程通信
  2. 使用rdp连接的windows主机,需要将np-cli.exe注册为系统服务, 否则在rdp窗口最小化或者rdp连接关闭后将无法刷新
  3. windows2008系统下需要启用sas策略才可使用ctrl+alt+del按钮进行解锁登录页面,配置方法如下:
    1. 运行gpedit.msc打开组策略编辑器
    2. 找到计算机配置 => 管理模板 => Windows组件 => Windows登录选项 => 禁用或启用软件安全注意序列
    3. 在详情中设置为已启用,设置允许哪个软件生成软件安全注意序列为服务

性能占用

在vmware环境下创建4C2G(AMD Ryzen 7 4800U with Radeon Graphics)测试环境,并进行all in one部署server、remote端和local端,使用bench规则进行压测,结果如下:

图片[14]-如何搭建一款私有化部署的远程桌面-FancyPig's blog
  1. 压测结果仅包含local端发起连接到remote端收到连接并返回成功的整个过程
  2. 实验结果表明,在4C2G环境下可达到上万+的qps,且p99和p100均在60ms以下

未来开发计划

TODO

  1. 支持include的yaml配置文件
  2. 通用的connect、connect_response、disconnect消息
  3. dashboard页面
  4. 文件传输
  5. web远程桌面
  6. 流量监控统计页面,server还是client?
  7. web端管理规则
  8. 支持录屏

项目源地址

https://github.com/lwch/natpass

© 版权声明
THE END
喜欢就支持一下吧
点赞21 分享
评论 共3条

请登录后发表评论