19、【Ubuntu】【远程开发】技术方案分析:远程桌面

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【远程开发】技术方案分析:私网ip掩码

局域网 IP 中掩码的相关概念,下面继续

远程开发

之前 blog 【Ubuntu】【远程开发】技术方案分析:公私网ip 说了,想要远程连接办公,得有个公网 IP ,相当于寄快递时,快递上得有收货的街道地址,基于这个点,下面来对比一些技术方案:远程桌面,VPN,内网穿透

远程桌面

一种应用层协议(如 Windows 的远程桌面,开源的 VNC、向日葵,RustDesk 等),允许在一个设备上直接操作另一台设备的图形化桌面,就像坐在那台电脑前一样

远程桌面的操作一般如下

  • 目标电脑先开启 远程桌面服务,或者远程控制软件需要先点击接受远程 之类的设置选项

  • 控制端通过 IP + 端口连接(对于 Windows 的远程桌面)

    或者对于一些远程控制软件,点击发起远程 之类的设置选项

  • 然后就可以使用了,传输的直接是屏幕画面,用的是鼠标键盘指令,就像在家里操作电脑一样

前提是目标电脑必须有公网 IP(共享的也行,不需要独立 IP,只要能上网就行 ) 或在同一局域网 内,否则无法直接连接,核心目的是远程操作电脑的桌面

下面说下这类工具的基本原理,这类工具的连接过程大致可以分为下面三个步骤

一、被控端(目标电脑)主动连接中继服务器

  • 当在目标电脑上打开远程桌面控制软件并登录账号时(点击发起远程),软件会主动向远程服务提供商的公网服务器发起一个出站连接
  • 这个连接从内网到外网,不受网络地址转换 NAT 限制(内网设备访问外网服务器是允许的)
  • 连接建立后,远程服务器就知道,用户 A 的设备(比如 ID: ABC123)已上线,可通过这个连接与其通信

这里的关键点在于连接是由内网设备主动发起的,绕过了外网无法访问内网的限制

二、控制端也连接同一中继服务器

当在外地用电脑打开同样的远程桌面软件,点击远程连接 ABC123 时,电脑也会连接到同一个远程中继服务器,这里服务器就知道用户 A 想要控制设备 ABC123,而且 ABC123 也已经在线

三、中继服务器牵线搭桥

远程中继服务器不会直接发送操作指令设备 ABC123,而是处理中继转发,将远端的控制请求通过已建立的连接转发给内网的被控端,被控端收到指令后执行操作,并将屏幕画面压缩后,通过同一个连接发回给中继服务器,服务器再将画面数据转发回本地电脑

一些高级工具,比如 RustDesk,会尝试进行 P2P 打洞直连 ,这种方式需要 NAT 类型允许,双方设备会协商出一个直接通信的路径,绕过中继服务器,获得更低延迟的连接,如果打洞失败(比如在对称型 NAT 下),则退回到中继模式

可以看到,在公网环境下 ,远程桌面采用的是类似内网穿透的技术

内网穿透的几个核心要素:

  • 内网设备无法被外网直接访问
  • 需要一个公网服务器作为中介
  • 内网设备主动连接公网服务器
  • 外部用户通过服务器间接访问内网
  • 实现外网对内网服务的访问

远程桌面这里是:

  • 目标电脑在 NAT 后,共享公网 IP,ping 不通,端口无法被扫描
  • 远程桌面的中继服务器,有固定公网 IP
  • 被控端开机后可以远程连接中继服务器,建立长连接隧道
  • 控制端通过中继服务器找到并连接被控端,数据经服务器中继
  • 最终实现从外网远程操作内网电脑的桌面

内网穿透是一种技术类别或目标:让外网能访问内网服务,SSH 反向隧道,frp,向日葵、RustDesk、远程桌面等都是实现内网穿透的具体工具或方案,区别在于:

  • 使用的协议(SSH、自定义 TCP/UDP、WebRTC 等)
  • 是否支持 P2P 直连
  • 是否开源,是否免费
  • 用户体验,是图形化,还是命令行

其底层思想基本一致:内网主动连接,借助公网跳板,实现反向访问

ok,先到这里,下篇 blog 继续

相关推荐
是小胡嘛13 小时前
C++之Any类的模拟实现
linux·开发语言·c++
口袋物联14 小时前
设计模式之工厂模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·设计模式·简单工厂模式
qq_4798754315 小时前
X-Macros(1)
linux·服务器·windows
笨笨聊运维16 小时前
CentOS官方不维护版本,配置python升级方法,无损版
linux·python·centos
ζั͡山 ั͡有扶苏 ั͡✾16 小时前
EFK 日志系统搭建完整教程
运维·jenkins·kibana·es·filebeat
jun_bai17 小时前
python写的文件备份网盘程序
运维·服务器·网络
Warren9817 小时前
Python自动化测试全栈面试
服务器·网络·数据库·mysql·ubuntu·面试·职场和发展
HIT_Weston17 小时前
39、【Ubuntu】【远程开发】拉出内网 Web 服务:构建静态网页(二)
linux·前端·ubuntu
欢喜躲在眉梢里17 小时前
CANN 异构计算架构实操指南:从环境部署到 AI 任务加速全流程
运维·服务器·人工智能·ai·架构·计算
weixin_5377658018 小时前
【容器技术】虚拟化原理与Docker详解
运维·docker·容器