作者 adminz 发布于 2019-06-03 修改于

在办公室操作家中电脑——FRP内网穿透与远程桌面

Thumbnail

一、需求

电脑A:在家中,windows10 专业版系统。电脑B:在办公室,深度Linux系统。电脑C:windows7系统,偶尔使用。

假如,电脑A 运行着一套软件开发环境,有时需要在电脑B或电脑C中进行调试,或者需要使用电脑A中的某些windows软件来完成工作。也就是电脑A提供远程桌面服务,将电脑B和电脑C当做终端,使用电脑B或电脑C 来操作 电脑A。反之,有时也同样需要使用电脑A来操作电脑B中的某些内部专用办公系统。

二、解决方法探讨

1、这样的需求不一定非要使用远程桌面吧?

用笔记本,安装双系统,走哪儿带哪儿,一样解决问题啊。额......,好吧,这个解决办法不是本文要讨论的,我说的就是远程连接电脑和远程工作的问题。

2、使用向日葵或 teamviewer 类软件

这类软件使用方法比较简单,并且都有免费版本,本人使用的均是免费版本,主观感觉向日葵速度延迟较大,如果要低延迟那就需要付费。TeamViewer 的速度已经基本能满足远程办公的需要。

向日葵需要在电脑A中安装服务端,注册账号并登录,在电脑B或电脑C中安装控制端,用同样的账号登录,就能看到电脑A已经是在线状态,即可发起远程控制。

teamviewer 在电脑A和电脑B中同时安装,运行TeamViewer后会显示ID和密码,电脑B输入电脑A中的ID进行连接,输入密码即可实现远程控制。此密码会自动更新,但是可以自己指定一个固定密码。

3、 VNC类软件

VNC(Virtual Network Computing)是一个开源、免费的,基于RFB(Remote Frame Buffer)协议进行通信并完成桌面传输显示和操作,RFB (远程帧缓存) 是一个远程图形用户的简单协议,它可以应用于所有的窗口系统:Linux桌面、Windows和Mac系统。

Linux上的VNC服务端,比较常用的就是tigervnc和x11vnc,Linux上的VNC客户端比较多,例如,Remmina 同时支持RDP和VNC协议。

在Windows上支持VNC协议的软件,常用的有RealVNC(收费)、UltraVNC(免费)和TightVNC(免费),它们同时既是服务端又是客户端。

4、远程桌面服务

在桌面虚拟化技术中,当前主流的桌面传输协议有ICA、PCoIP、RDP、SPICE四种,也就是通常所说的桌面云。Windows 10 系统中的远程桌面,使用的就是 RDP(Remote Desktop Protocol),即远程桌面协议。

区别:VNC是服务端把桌面窗口渲染完成后将图像直接传输给客户端,客户端只是对图像进行解码显示;而RDP和SPICE相当于将桌面窗口数据传输给客户端,再由客户端生成图形和图像显示,更加适合虚拟桌面使用。SPICE是一个开源协议,RDP的客户端是开源的但是服务端不开源。

至于那些抓屏幕的远程控制软件,比如PCAnywhere,就不提了吧,毕竟现在已经是云计算、虚拟化技术大行其道的时候了。

5、华为云电脑

华为云电脑估计使用的的是华为自己的HDP协议,HDP源自ICA,不过华为云电脑目前好像只支持华为手机吧,没有PC系统的客户端,并且云电脑可选配置少,不能自定义,但是其中有一款是游戏款,可见已经整合了显卡虚拟化技术,应该类似于微软的RemoteFX。本人简单试用了一下,效果不错,这个或许是以后的发展方向,桌面虚拟化走向大众用户,以后一般情况下就不用再买电脑了,一部手机,或者一台瘦客户终端(机顶盒),一台显示设备(显示器、电视、投影),再配合宽带或5G网络,就可以连接云电脑来完成自己的工作。

三、方案选择

1、电脑B远程连接电脑A

电脑A是Windows10企业版,最方便的当然是开启远程桌面服务(RDP)。但是前提条件是:如果使用RDP,就需要服务端电脑具有公网IP地址。

家里的电脑A,网络使用电信100M,上行4M,虽然有公网IP地址,但是需要用超级管理员(一般是telecomadmin)登录天翼光猫,做端口映射,才能用使用公网IP地址连接到电脑A。另外,家用的电信宽带公网IP地址是动态变化的,需要使用路由器自带的花生壳之类的服用来解决。也就是在没有解决这些问题之前,电脑A属于内网,而无法暴露在公网中。

现在的问题就是如何让内网电脑(电脑A)向外网用户(电脑B)提供远程桌面、WEB等网络服务?那就是使用一台具有公网IP地址的服务器做为反向代理,实现内网穿透。电脑A向反向代理服务器发送请求,接着反向代理向电脑B转交请求,电脑B向代理服务器返回所请求的内容,代理服务器将获得的内容返回给电脑A。正好,本人有一台阿里云的服务器,可以满足这个要求。

2、内网穿透工具选择:Frp

常见的内网穿透的反向代理程序是 ngrok ,国内有许多提供内网穿透服务的平台都是基于 ngrok 搭建的,但是 ngrok 配置略复杂。本人选择 Frp ,因为配置简单,功能强大。

https://github.com/fatedier/frp 有详细的使用文档。

Thumbnail

(图3-1 Deepin 远程连接 Win10)

四、FRP内网穿透及远程桌面配置

(一)代理服务器端配置

1、ssh 连接阿里云主机(centos 7)

2、下载:wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz

下载完成之后解压:tar -zxvf frp_0.27.0_linux_amd64.tar.gz

解压完成后重命名目录:mv frp_0.27.0_linux_amd64 frp

进入frp目录文件夹:cd frp

FRP 默认给出两个服务端配置文件,一个是简版的 frps.ini,另一个是完整版本 frps_full.ini。

删除客户端相关的文件(frpc,frpc.ini,frpc_full.ini)

3、编辑 frps.ini :vim frps.ini

bind_port 为客户端与服务端进行通信的端口

Dashboard 通过浏览器查看 frp 的状态以及代理统计信息展示。

[common]
bind_port = 7000
dashboard_port = 7500
# dashboard 用户名密码,默认都为 admin
dashboard_user = admin
dashboard_pwd = admin

4.1、设置开机启动和后台运行

vi /etc/systemd/system/frps.service

[Unit]
Description=frps daemon
After=syslog.target  network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/home/frp/frps -c /home/frp/frps.ini
Restart= always
RestartSec=1min
[Install]
WantedBy=multi-user.target

注意ExecStart中要配置成自己的路径

然后启动frps:sudo systemctl start frps
打开开机自启动:sudo systemctl enable frps

如果要重启应用:sudo systemctl restart frps
如果要停止应用:sudo systemctl stop frps
如果要查看应用的日志:sudo systemctl status frps

4.2、./frps -c ./frps.ini  前端开启,关闭就会失效,使用 nohup 后端运行

nohup ./frps -c ./frps.ini &

5、由于使用阿里云服务器,需要在阿里云控制面板配置安全组规则,添加 7000 7500 33891 33892 8080 端口。其中 7000 和 7500 是 frps.ini 文件开放的端口,33891 是电脑B frpc.ini 指定的映射到本地的远程端口。如果使用的别的服务器,就在防火墙打开这些端口。

Thumbnail

6、本地通过浏览器打开  http://[server_addr]:7500 ,访问 dashboard 界面,输入用户名及密码 admin,如果能正常显示,说明运行正常

(二)电脑A(windows10)安装Frp客户端

1、首先需要开启 windows10 远程桌面。打开控制面板=>系统=>高级系统设置,切换到"远程",选择“允许远程连接到此计算机”,并勾选身份验证选项,如下图所示:

Thumbnail

2、下载对应的版本,解压,删除与服务端相关的文件(frps.exe, frps.ini,frps_full.ini)

和 FRP 服务端类似,FRP 默认也给出两个客户端配置文件,一个是简版的 frpc.ini,另一个是完整版本 frpc_full.ini。

3、编辑 frpc.ini

[common]
server_addr = 1.2.3.4
server_port = 7000
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin

[RDP]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 33891

这里配置的远程端口(remote_port)要和前面阿里云开放的端口对应。这里指阿里云主机的 33891 端口映射到本机的 3389 端口。还可以继续添加,映射到本机 80 端口,就可以让本机对外提供 http 服务。

4、启动客户端服务

在frp 目录中新建文件 frp.vbs

dim objShell 
set objShell=wscript.createObject("WScript.Shell") 
iReturnCode=objShell.Run("C:\WWW\frp\frpc.exe -c C:\WWW\frp\frpc.ini",0,TRUE)

双击 frp.vbs ,即可启动 frpc 服务。

将 frp.vbs 放在 C:\Users\zmh\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 启动目录中,即可实现开机启动。

(三)电脑B(访问端,Linux)连接电脑A(Win10)远程桌面

电脑B是深度Deepin Linux 系统,Deepin 是国产的基于Debian的系统,和ubuntu系统类似,但是面向国内普通用户做了许多定制,相比其他Linux发行版,开箱即用,使用简单方便。

首先在 Deepin 的应用商店安装 Remmina 工具,Remmina 是一个支持 SSH RDP VNC 等多种协议的远程桌面客户端,运行之后,打开右上角的菜单,选择“首选项”,切换到“RDP”选项卡,质量设置里,可以选择一个预设项,比如“良好”,一定要勾选“平滑字体”,保存。

Thumbnail

 

Thumbnail

回到Remmina主程序,点击左上角创建连接,名称由自己定,,协议选择“RDP”,服务器填写自己的阿里云服务器的IP地址,端口号是电脑A frpc.ini 配置文件指定的 33891,如果使用默认的3389端口,可以不填端口号。切换到高级项,将画质设置为“良好”,声音也可以打开,安全项不变,但是如果电脑A的系统是windows7,安全项一定要设置为"RDP"才能连接。

Thumbnail

 

Thumbnail

一切配置就序,连接之后,输入电脑A的Win10系统的用户名密码登录,如图3-1所示,效果非常好,自己感觉要比 TeamViewer 效果好。使用之后,断开连接,如果再回到电脑A,Win10处于锁定状态,输入密码登录,桌面依然会保持断开时的样子。

如果电脑B是 win7以上系统呢,那连接就更简单了,打开windows的远程桌面连接程序(mstsc.exe),输入代理服务器IP及端口,连接即可。

五、Win10连接Linux远程桌面的尝试

也就是用电脑A远程连接电脑B,由于办公室电脑不能轻易去动光猫或路由器,也就是电脑B也是属于内网,方法和上面第四基本一样。

1、在电脑B中安装远程桌面服务

打开终端,运行:sudo apt-get install xrdp

延续windows的运程桌面,依然使用RDP协议,安装xrdp 做为Deepin 远程桌面服务。

2、在电脑B中安装Frp客户端

下载系统对应的版本,wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz

下载完成之后解压:tar -zxvf frp_0.27.0_linux_amd64.tar.gz

解压完成后重命名目录:mv frp_0.27.0_linux_amd64 frp

进入frp目录文件夹:cd frp

删除与服务端相关的文件(frpc,frpc.ini,frpc_full.ini)

和 FRP 服务端类似,FRP 默认也给出两个客户端配置文件,一个是简版的 frpc.ini,另一个是完整版本 frpc_full.ini。

3、编辑 frpc.ini,开启了3389远程桌面服务和 http 服务。

[common]
server_addr = X.X.X.X
server_port = 7000
[RDP]
type = tcp
local_ip = 0.0.0.0
local_port = 3389
remote_port = 33892
[web]
type = http
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080

4、启动客户端

sudo vim /lib/systemd/system/frpc.service

[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
#启动服务的命令(此处写你的frpc的实际安装目录)
ExecStart=/home/zmh/program/frp/frpc -c /home/zmh/program/frp/frps.ini

[Install]
WantedBy=multi-user.target

然后启动frps:sudo systemctl start frps
打开开机自启动:sudo systemctl enable frps

如果要重启应用,可以这样,sudo systemctl restart frps
如果要停止应用,可以输入,sudo systemctl stop frps
如果要查看应用的日志,可以输入,sudo systemctl status frps

5、在电脑A或其他Win10系统的电脑上,打开远程桌面连接程序(mstsc.exe),输入代理服务器IP地址及端口号,即可连接。但是效果非常不理想,画面质量很好,但是窗口渲染的速度太慢,打开或移动一个窗口要从上到下慢慢才能显示出来,关闭了电脑B的Deepin 系统的窗口特效,也没有多少改变。

6、使用 Teamviwer 连接 deepin ,画面质量明显要比连接 Win10 差一点,不过速度延迟不大还可以接受,看来win10要连接 deepin 桌面暂时只能用 teamviwer 了,后面再试试deepin到deepin的远程桌面连接,用x11vnc,还有 x11转发分别试一下效果。

除了windows3.X 是基于dos的,windows95之后其桌面环境是和内核是集成在一起的,是专为PC打造的桌面操作系统,远程桌面效果好是应该的。Linux 从诞生那天就是为服务器和系统开发者准备的,桌面化方面效果当然就差了。Linux 的图形界面只是Linux 下的一套C/S结构的应用程序,由X协议、X服务器器、显示管理器(DM)、窗口管理器(WM)及其配套的应用程序构成一个完整的Linux桌面环境,通常称做 X-Server 和 X-Client。现在常见的X-server是Xorg,deepin 的桌面环境是DDE(Deepin Desktop Environment,Deepin 桌面环境)

疑问:既然 Linux桌面环境是 C/S 结构,那么两台 deepin 系统的电脑之间远程桌面共享,因为两台电脑系统的 Xserver 和 Xclient 都是相同的,在局域网环境下使用 x11 转发是不是能取得更好的效果呢?


 

 

 

 

 

 

 

 

 

 

 

 

 

参考:

https://github.com/fatedier/frp/blob/master/README_zh.md

https://github.com/fatedier/frp/releases

https://www.jianshu.com/p/a6e9627dbe29

VDI桌面虚拟化四大协议—虚拟化魔鬼象限
http://virtual.51cto.com/art/201801/564530.htm

Linux和Windows间的远程桌面访问
https://blog.csdn.net/u011054333/article/details/79905102