通过FRP内网穿透实现Windows RDP远程桌面控制
Jul 10, 2023
1 minute read

FRP 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

RDP 是由微软开发的安全网络通信协议,又被称为远程桌面协议(Remote Desktop Protocol)。用户使用RDP客户端连接到Windows计算机或服务器,被连接的计算机或服务器也需要同时运行RDP。它可是让用户通过“远程桌面连接(Remote Desktop Connection)”可视化地远程控制电脑或服务器。

内网穿透 一般而言,在没有固定公网IP的情况下,外网设备无法直接访问内网设备。而内网穿透技术,就是能让外网的设备找到处于内网的设备,从而实现数据通信。

本文目的:用Windows电脑(控制端)自带的“远程桌面连接”远程控制多台没有公网IP的内网Windows服务器(被控制端)。

为了实现内网穿透,需要一台公网服务器(云主机)用于在控制端和被控制端之间进行服务转发(作者采用阿里云Linux服务器),且被控制端Windows版本需为专业版/企业版/服务器版 (家庭版仅可作为控制端,不可作为被控制端)。

1. 下载FRP并安装

根据控制端、被控制端和云主机的系统版本,从FRP的Github地址(https://github.com/fatedier/frp)下载最新版本的程序包。

此处,Linux云主机作为FRP Server,仅需要保留(*frps, frps.ini, frps_full.ini*)三个服务器端文件;而控制端和被控制端作为FRP Client,仅需要保留(*frpc, frpc.ini, frpc_full.ini*)这三个客户端文件。

首先,编辑用于服务器端的frps.ini文件。bind_port 为客户端与服务端进行通信的端口,默认是7000,可以改成其他的。进入阿里云主机的安全组设置,放行上面的7000端口。

[common]
bind_port = 7000

然后通过Xftp将(*frps, frps.ini, frps_full.ini*)这三个文件传至云主机/etc/frp目录。然后,在此目录内运行如下命令,测试云主机能否正常运行FRP(显示frps started successfully即为运行成功)。

./frps -c frps.ini

完成,服务器端配置后,再修改Windows客户端的frpc.ini文件。文件最上面的[common]部分是和云端服务器通信的部分,server_addr填写的是对应的云服务器的 ip 地址,而下面这个server_port则是刚才我们在服务端所设置的bind_port,两者需要保持一致。而[RDP1]/[RDP2]部分为内网穿透服务的内容,其中local_ip 指的是本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可;而 local_port 指的是对应的服务端口,RDP 服务端口就是 3389;remote_port 是远程控制用来映射的端口。

第一台Windows服务器的frpc.ini文件:

[common]
server_addr = 阿里云主机公网IP
server_port = 7000  #与server端frps.ini文件中的bind_port一致

[RDP1]
type = tcp
local_ip = 127.0.0.1    #本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可
local_port = 3389   #Windows系统RDP服务端口默认为3389
remote_port = 7001  #可自行设置

第二台Windows服务器的frpc.ini文件:

[common]
server_addr = 阿里云主机公网IP
server_port = 7000  #与server端frps.ini文件中的bind_port一致

[RDP2]
type = tcp
local_ip = 127.0.0.1    #本机处于内网的 IP 地址,如果你是自己使用,只需要写 127.0.0.1 即可
local_port = 3389   #Windows系统RDP服务端口默认为3389
remote_port = 7002  #可自行设置,需与其它内网机器所配置端口不同

依此类推……

如果想通过远程桌面控制某内网主机,其对应的地址就是:

server_addr:remote_port(公网服务器IP:映射的端口号)

然后,进入阿里云主机的安全组设置,放行上面的remote_port端口(7001,7002,……)。

将修改好的(*frpc, frpc.ini, frpc_full.ini*)文件传至被控制端的各个Windows服务器,被在该文件目录下右键运行Windows Terminal,运行如下命令,出现“start proxy success”即为连接成功,此时云主机服务器端也会显示“new proxy [RDP] success”提示。

./frps -c frps.ini

2. 通过RDP远程连接Windows服务器

首先,启用被控制端Windows服务器的远程桌面:控制面板->系统->高级系统设置,切换到“远程”,“允许远程连接到此计算机”,并勾选身份验证选项。

然后,在控制端Windows电脑,打开“远程桌面连接”程序,输入server_addr:remote_port (如:阿里云公网IP:7001),就可以连接到第一台内网Windows服务器了。

3. 开机自启FRP

虽然这样实现了远程控制,但每次重启系统后,都需要再手动开启frp服务。为此,可通过如下设置使其实现开机自启。

Linux服务器端:

在/usr/lib/systemd/system文件夹添加frps.service文件,其内容如下:

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=用户名
Restart=on-failure
RestartSec=5s
ExecStart=/etc/frp/frps -c /etc/frp/frps.ini    #输入frps和frps.ini文件的绝对路径
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target

然后,运行以下systemctl命令,实现自动启用frps服务

systemctl daemon-reload
systemctl enable frps
systemctl start frps
systemctl status frps

Windows服务器端:

在frpc文件所在的文件夹,新建frpc_autostart.bat文件,并写入如下内容:

    @echo off

    if not defined TAG (
        set TAG=1
        start wt -p "cmd" %0
        exit
    )

    :home
    .\frpc -c frpc.ini
    goto home

右键frpc_autostart.bat文件,为其生成快捷方式,并将此快捷方式拷贝到C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup文件夹

Reference:

  1. 如何优雅地访问远程主机?SSH与frp内网穿透配置教程

  2. 用开源免费的内网穿透工具frp,实现远程桌面和文件传输

  3. frp内网穿透反向代理实现Windows远程桌面连接

  4. frp实现内网穿透访问内网多台Linux服务器

  5. frp实现一台云服务器连接多个局域网内的主机(仅需一个frp服务端)

  6. 用FRP做内网穿透使用远程桌面连接家里的windows电脑

  7. Frp内网穿透快速实现远程桌面

  8. frp配置内网穿透、通过rdp远程桌面控制windows系统