相关阅读
项目介绍
新一代主机管理工具,支持web shell和web桌面,居家办公神器
功能特性
- 支持私有化部署
- 较小的内存占用(约20M左右)
- 支持tls安全连接
- 支持多路异步IO
- 支持虚拟链路层
- 支持链路和终端会话监控
- protobuf数据编码
- 支持web shell
- linux和mac系统支持创建pty设备和颜色输出
- windows系统支持powershell
- 支持web vnc
- 支持基本的键盘鼠标操作
- 支持全屏显示
- 支持滚动
- 支持远程剪贴板设置与读取
- 支持多种操作系统
- linux
- windows
- macos
实现原理
支持tls链接,protobuf进行数据传输,下面举例远程连接服务器集群内的某台主机
![图片[1]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072010104.jpg?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
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 # 本地监听端口号
工作流程如下:
- 办公网络与家庭网络中的np-cli创建tls连接到np-svr
- np-cli服务发送握手包,并将配置文件中的secret字段进行md5哈希
- np-svr等待握手报文,若等待超时则为非法链接,直接断开
- 用户打开办公网络主机172.16.1.100上的终端页面,并连接到服务器集群中的主机server
- 172.16.1.100上的np-cli发送connect_request消息,并将连接类型设置为shell
- np-svr转发connect_request消息至192.168.1.100上的np-cli
- 192.168.1.100上的np-cli接收到connect_request消息,创建/bin/bash进程
- 192.168.1.100上的np-cli根据链接创建结果返回connect_response消息
- np-svr转发connect_response消息至172.16.1.100上的np-cli
- 172.168.1.100上的np-cli接收connect_response消息
- 开始转发网页上的输入输出内容
软件架构
![图片[2]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072027126-692x1024.jpg?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
效果截图
dashboard页面
![图片[3]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072221199-1024x506.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
linux命令行效果
![图片[4]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072234812-1024x506.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
windows命令行效果
![图片[5]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072245890-1024x506.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
windows2008远程桌面
![图片[6]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072305761-1024x502.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
windows10远程桌面
![图片[7]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072604916-1024x506.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
windows11远程桌面
![图片[8]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072651660-1024x519.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
ubuntu远程桌面
![图片[9]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072707572-1024x505.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
fedora远程桌面
![图片[10]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072719271-1024x504.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
deepin远程桌面
![图片[11]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072734231-1024x512.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
macos远程桌面
![图片[12]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072746966-1024x498.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
windows读取剪贴板内容
![图片[13]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719072759481-1024x504.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
部署教程
开始使用
部署过程共分为三部分:服务器端、受控端和控制端,下面以debian系统进行举例。
服务器端部署
- 在服务器上下载对应的安装包并解压到任意目录
- 使用以下命令启动服务器端程序
sudo ./np-svr -conf server.yaml
- (可选)开放外网防火墙,默认端口6154
受控端部署
- 在受控端机器上下载并解压到任意目录
- (可选)修改remote.yaml配置文件,修改server地址
- 使用以下命令启动客户端程序
sudo ./np-cli -conf remote.yaml -user `whoami`
控制端部署
- 在本地控制机上下载并解压到任意目录
- (可选)修改local.yaml配置文件,修改server地址
- (可选)修改rule.d目录下的规则配置文件,rule配置方法
- 使用以下命令启动客户端程序
sudo ./np-cli -conf local.yaml
- 在以上操作成功后即可在浏览器中通过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设置为新的密钥,并重启服务
注册系统服务(可选)
- 在命令行中使用
-action install
参数即可将程序注册为系统服务,使用参数-user
可设置该服务的启动身份 - 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
name
: 该规则名称,必须全局唯一target
: 对端客户端IDtype
: shelllocal_addr
: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上local_port
: 本地监听端口号exec
: 连接建立成功后的启动命令- 指定该参数:直接使用设定的命令运行
- linux系统:优先查找bash命令,若没有则查找sh命令,否则报错
- windows系统:优先查找powershell命令,若没有则查找cmd命令,否则报错
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 # 刷新频率
name
: 该规则名称,必须全局唯一target
: 对端客户端IDtype
: shelllocal_addr
: 本地监听地址,如只允许局域网访问可绑定在局域网IP地址上local_port
: 本地监听端口号fps
: 每秒钟截屏多少次,最高50
连接成功后即可使用浏览器访问local_port
所对应的端口来创建vnc,如http://127.0.0.1:5900
注意:
- 创建vnc连接后远端服务会创建一个子进程进行截屏和键鼠操作, 主进程会在
6155~6955
之间选一个端口进行监听用于与子进程通信 - 使用rdp连接的windows主机,需要将np-cli.exe注册为系统服务, 否则在rdp窗口最小化或者rdp连接关闭后将无法刷新
- windows2008系统下需要启用sas策略才可使用ctrl+alt+del按钮进行解锁登录页面,配置方法如下:
- 运行gpedit.msc打开组策略编辑器
- 找到计算机配置 => 管理模板 => Windows组件 => Windows登录选项 => 禁用或启用软件安全注意序列
- 在详情中设置为已启用,设置允许哪个软件生成软件安全注意序列为服务
性能占用
在vmware环境下创建4C2G(AMD Ryzen 7 4800U with Radeon Graphics)测试环境,并进行all in one部署server、remote端和local端,使用bench规则进行压测,结果如下:
![图片[14]-如何搭建一款私有化部署的远程桌面-FancyPig's blog](https://static.iculture.cc/wp-content/uploads/2022/07/20220719073339125.png?x-oss-process=image/auto-orient,1/format,webp/watermark,image_cHVibGljL2xvZ28ucG5nP3gtb3NzLXByb2Nlc3M9aW1hZ2UvcmVzaXplLFBfMTA,x_10,y_10)
- 压测结果仅包含local端发起连接到remote端收到连接并返回成功的整个过程
- 实验结果表明,在4C2G环境下可达到上万+的qps,且p99和p100均在60ms以下
未来开发计划
TODO
支持include的yaml配置文件通用的connect、connect_response、disconnect消息dashboard页面- 文件传输
web远程桌面流量监控统计页面,server还是client?- web端管理规则
- 支持录屏
项目源地址
© 版权声明
THE END
- 最新
- 最热
只看作者