如何使用frp实现远程桌面

自从Mac上经常使用TV(TeamViewer)远程连接公司电脑以后,已经被TeamViewer列入商业名单,无法再顺畅地使用TV。网上有一大堆破解限制的方法,几乎都是针对Windows系统而言的,而针对Mac系统的寥寥无几。思路基本上是修改电脑的MAC地址,一个TV账号对应一个MAC地址,这种方法对于Windows系统有效,但是对于Mac系统而言,MAC地址是固定不变的,就算能修改,重启之后又会变回原来的地址。另外一种解决办法是使用Paralles虚拟机,在虚拟机里使用TeamViewer,但是这么做开销太大,不仅吃内存还耗电。难道就没有一种更好的解决方案吗?

由于我的工作要在Windows系统下开发,平时使用Mac系统的我,基本都是远程连接工作机。以前一直用TV,最近开始用MRD(Microsoft Remote Desktop)这款软件,在内网工作的时候,比TV表现更佳。但是在外网的情况下,我又不得不用回TV。虽然MRD可以在外网情况下连接内网主机,但是需要注册DDNS域名以及进行路由器NAT端口映射。我没有这个权限,运维也不会为了我个人,对路由器进行NAT端口映射,承担不必要的风险,那么我只能想别的办法。

其实TV这些软件的核心在于内网穿透,只要找到可以替代的内网穿透软件就行了,就是我今天要介绍的frp。

内网穿透的软件有很多,国内的花生壳、NAT123评价并不好,而且又收费。TV的收费又太贵,我只能把目光锁定到免费开源的方案上。不搜不知道,开源的内网穿透方案在网上也是一搜一大把,其不变的核心在于ssh隧道连接以及反向代理。那为什么会选择frp呢?因为别的NAT软件要么需要安装Python 3.5,要么需要安装Java,依赖条件一大堆,我的vps系统是CentOS6,上一次为了搞个证书颁发,装了半天Python 3.5也没成功,所以我能不装新软件就不装。最后我把目光锁定到了frp上,它的配置简单,最重要的是,它不需要依赖别的软件,只要一个shell命令就搞定了。

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。

访问内网的网站、ssh连接以及远程桌面都需要建立在tcp协议基础之上,可以看到frp是支持tcp协议的。这篇文章主要讲讲frp实现外网远程内网桌面。

前提

VPS一台,最好是国内的,国外的VPS延时太大。本文以CentOS 6为例。

frp服务端(frps)配置

1. 下载文件

VPS上下载对应的Release版本的frp,下载地址

1
wget https://github.com/fatedier/frp/releases/download/v0.20.0/frp_0.20.0_linux_386.tar.gz
2. 解压文件
1
tar zxvf frp_0.20.0_linux_386.tar.gz
3. 编辑配置文件

解压后的frp文件夹包含了客户端(frpc)和服务端(frps)的所有配置以及执行文件。找到frps.ini配置文件,可以看到其内容为

1
2
[common]
bind_port = 7000

bind_port是客户端和服务端进行通信的端口,默认端口号为7000。

4. 启动服务端
1
./frps -c frps.ini

执行这段命令之后,即可看到服务端的启动输出

frps tcp listen on 0.0.0.0:7000

Start frps success

但是以这种方式启动,一旦和VPS的ssh连接断开,frps服务就会退出。所以需要对frps服务加入后台进程中。

创建frps.sh文件,内容如下

1
nohup ./frps -c frps.ini >log.txt 2>&1 &

然后修改frps.sh的权限

1
chmod 775 fprs.sh

最后运行该脚本

1
./fprs.sh

frps服务以后台方式启动,并且输出日志到log.txt文件中。

frp客户端(frpc)配置

以内网的电脑作为客户端,也就是你要远程的那台内网主机。

1. 下载文件

因为我要远程的内网主机是Windows系统,所以我的客户端下载的是frp_0.20.0_windows_amd64.zip压缩文件,将其解压。

2. 编辑配置文件

找到frpc.ini配置文件,修改如下

1
2
3
4
5
6
7
8
9
[common]
server_addr = X.X.X.X
server_port = 7000

[RDP]

type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000

server_addr是VPS主机的IP,server_port和frps.ini中的bind_port一致。RDP为远程桌面的配置,连接类型为tcp,local_ip保持不变,local_port需要注意,默认远程桌面的端口号为3389,你也可以通过修改注册表的方式修改远程桌面端口号。

修改远程桌面的服务端口:

1: Run - Regedit;

2:找到 HKEY_LOCAL_MACHINE/ SYSTEM/ CurrentControlSet/ Control/ Terminal Server/ Wds/ rdpwd/ Tds/ tcp/ PortNumber子键, 默认为3389, 修改成想要的值,比如1234;

3:找到 HKEY_LOCAL_MACHINE/ SYSTEM/ CurrentControlSet/ Control/ Terminal Server/ Winstations/ RDP-Tcp/ PortNumber子键, 默认为3389, 修改成想要的值,比如1234;

重启才能生效,可先不重启。

remote_port是远程连接时的端口号,它和frps里的bind_port有什么区别呢?frps里的bind_port是VPS和内网电脑进行ssh隧道连接的端口号,而remote_port则是反向代理端口号,通过VPS的IP地址以及该端口号,我们就能远程到内网主机。remote_port默认为6000。

3. 启动客户端

在cmd里运行一下命令

1
frpc.exe -c frpc.ini

看到如下输出

login to server success, get run id [], server udp port [0]

[ssh] start proxy success

恭喜你,客户端和服务端的ssh隧道连接成功。

4. 设置自启服务

由于frpc每次都是以命令窗口方式启动,一旦命令窗口被关闭,整个frpc服务也就随之停止。建议将frpc服务以Windows服务的方式在后台运行。这里需要使用winsw.exe工具,该工具可以将任何.exe文件,作为Windows服务在后台启动。

首先下载winsw.exe对应的Release版本。我下载的是WinSW.NET4.exe下载地址

然后将该WinSW.NET4.exefrpc.exe放在同一目录下,在同一个目录下创建一个WinSW.NET.xml文件,内容如下

1
2
3
4
5
6
7
8
<service>
<id>frp</id>
<name>frp</name>
<description>用frp发布本地电脑网站到外网</description>
<executable>frpc</executable>
<arguments>-c frpc.ini</arguments>
<logmode>reset</logmode>
</service>

以管理员权限打开CMD,运行如下代码

1
WinSW.NET4.exe install

安装成功会提示

Installing the service with id ‘frp’

打开服务,看看是不是多了frp服务。启动frp服务,在WinSW.NET4.out.log文件中可以看输出日志。

配置Mac上的MRD配置

终于可以在Mac上测试了,打开MRD,添加如下配置,进行连接

正常情况下,只要提示证书就说明远程桌面成功了。由于我的VPS处于国外,在远程桌面的时候卡顿很明显,再次推荐使用国内VPS。

总结

frp为什么说是一个反向代理呢?因为对于Mac这样的客户端而言,暴露给我的只是VPS的地址以及frps里配置的remote_port端口号,内网主机它的外网IP对于我是未知的,我也不需要知道。这就是反向代理。

千万不要把frp客户端以及Mac客户端搞混了。frp客户端是我的内网主机,Mac客户端是从外网进行远程桌面的电脑,frp服务端是我的VPS,这样就不会搞混了吧。

avatar

chilihotpot

You Are The JavaScript In My HTML