SSH 内网穿透实现远程桌面

两个局域网的主机要进行远程桌面,必须进行内网穿透。frp 是一个不错的选项。但其实不依赖外部的工具,仅仅利用系统的 SSH 也能实现,而且在安全性上可能会更好。

最终架构

参与该网络的各个机器、端口、执行的命令及其顺序如下图所示:


实现步骤

假设我们现在在办公室有一台 MacOS 主机 C,要连接家里的 MacOS 主机 A。

  1. 购买一台公网服务器 B,且具有公网 IP。带宽可能要的比较大,见下文的说明。假设公网 IP 为 123.1.2.3,其 SSHD 端口为 22。
  2. 在主机 A 上,开启 VNC 服务:前往 System Preferences->Share,勾选 Screen Share。它会监听本机的 5900 端口。
  3. 在主机 A 上,开启 SSHD 服务:前往 System Preferences->Share,勾选 Remote Login。它会监听本机的 22 端口。
  4. 在主机 A 上,开启 SSH 反向隧道:ssh -gNTR 127.0.0.1:7000:127.0.0.1:22 root@123.1.2.3。这里相当于在公网服务器 B 上开了一个新的 SSHD 服务代理,其端口是 7000(这里是示例端口,可以自己修改,下同)。
  5. 在公网服务器 B 上,通过 7000 端口代理的 SSHD 服务,建立一个到主机 A 的 VNC 服务的反向代理:ssh -p 7000 -N -L 127.0.0.1:5900:127.0.0.1:5900 admin@127.0.0.1(admin 表示主机 A 的登录用户名,请改成自己使用的)。这里就相当于公网服务器 B 提供了一个 VNC 服务,其端口为 5900。
  6. 在主机 C 上,建立一个到公网服务器 B 的 VNC 服务的反向代理:ssh -N -L 127.0.0.1:5900:127.0.0.1:5900 root@123.1.2.3。这里就相当于主机 C 提供了一个 VNC 服务,其端口为 5900。
  7. 在主机 C 上,打开 Finder->Go->Connect to Server,填写 vnc://127.0.0.1,然后在弹出的用户密码框中输入远程主机的登录用户名(如示例的 admin)及其密码,就可以访问咯。或者用命令行打开:open vnc://127.0.0.1:5900

当用户进行远程桌面时,比如移动一下鼠标,此时其请求数据流向为 C:127.0.0.1:5900 -> B:123.1.2.3:22 -> B:127.0.0.1:5900 -> B:127.0.0.1:7000 -> B:123.1.2.3:22 -> A:127.0.0.1:22 -> A:0.0.0.0:5900。

效果

以上所有的端口都是本地 127.0.0.1 的,除了公网服务器 B 需要对外暴露 SSHD 端口(22),无需再暴露任何其他主机、其他端口,而且使用 OpenSSH 加密通信数据,相对来说比较安全。当然上面用了公网服务器的 root 用户,你也可以新建一个低权限用户来做这个,进一步提升安全性。

但是也存在一些需要关注的问题、优化的地方。最大的一个问题就是卡顿。在 1Mbit/s(其实只有 100KB)的公网带宽服务器上,效果一般。打字什么的没什么问题。要是传送文件,挤占带宽后会导致屏幕完全没法操作。浏览网页比较卡顿,可以看到明显的延迟(尤其是滚动页面时)。这一点相比 TeamViewer 免费版来说都差很多。很大的原因可能还是 VNC 的协议不如 TeamViewer,OpenSSL 的加密也比较重。公网带宽提升到 10Mbit/s 可能会比较流畅,当然还要确保家里的电脑的上传带宽也足够(>=10Mbit/s),可以用 http://www.speedtest.cn/ 测试下网速。

其他的一些问题:

  1. SSH 有时候不太稳定,容易断掉。可以考虑使用 autossh 之类。
  2. 输入文字时会有一个大的光标,可能是协议实现的问题。
  3. 使用 MacOS 自带的 VNC 客户端,复制文件只能通过拖拽方式,无法直接 CMD+C、CMD+V。但复制文字可以用快捷键。
  4. 如果远程主机配置了屏保,有时候取消屏保特别慢。这个时候可以先断开连接,重新连。可能还是带宽不足的并发症。

这个方式一般来说作为 TeamViewer 免费版的一个备份还可以。有时候 TeamViewer 在电脑屏保或锁屏或最小化时,无法连接上。可以通过本方法先登录远程主机来排查解决。Windows 及其 RDP 协议的也差不多类似,只是把上面 VNC 的部分替换成 RDP,使用 Microsoft Remote Desktop 等客户端来连接即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349