【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如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 继续