frp + rdp 实现跨局域网远程桌面控制

发布时间 2023-11-09 16:45:48作者: LynneHuan

frp + rdp 实现跨局域网远程桌面控制

利用frp工具和rdp协议,借助公网IP自己搭建一个远程桌面服务,用于代替向日葵和teamview等软件。

前言

严格来说,本篇博客不算是教程,只是之前折腾frp这款工具的一个记录,即如何利用frp这款强大的代理软件和一个公网服务器实现内网rdp协议穿透,进而可以远程访问在内网中的Windows主机。Windows自带的远程桌面比其他远程软件如Teamview、花生壳等体验都要好很多,在拥有大带宽的网络环境时,可以做到延时低,操作流畅。

自己有个笔记本,家里放了一个台式,有时候带笔记本外出的时候有访问台式机的需求。刚开始自己也是用一些免费的远程控制软件,但是用到后期基本需要付费。前段时间趁着阿里云打折(一直在打折)的时候买了一个ECS云服务器,于是万事俱备,只需要借助frp手动搭建一下服务即可。

本篇教程的前提:

  • 拥有一个公网IP服务器,最好是静态IP
  • 系统至少需要为Windows专业版,或者想办法开启了远程桌面服务

本教程要做的事情:

  • 有一个电脑A,处于内网;有另一个电脑B,也处于内网;AB均可以访问外网;有一台公网服务器C
  • C上部署frp服务端
  • AB上部署frp客户端
  • 最后实现A远程桌面访问B或者B远程访问A

frp和rdp

这里的介绍不会太多,只是简单提一下。

关于frp详细的介绍可以参考官网,实在搞不懂的地方也可以翻翻源码。这款软件简洁而强大,封装性很好,使用起来非常方便。这类代理软件都是一种类似中介的角色,可以转发流量,并且在转发的过程中添加一些鉴权、认证等工作,frp支持的协议(模式)很多,有tcp/udp/http,还支持tls加密,点对点穿透等。需要注意的是,使用软件过程中一定注意不要违法!尤其需要注意,通过IP地址对外提供网站服务是需要备案的!

rdp是远程桌面协议,用于远程桌面接入,关于协议的详情可以自行搜索,这里主要关注其在windows上的监听的端口号为3389

搭建过程

云服务器

主要涉及到云服务器的购买,ssh设置等。

  • 可以上阿里云、腾讯云等购买一台云服务器,使用固定IP,资金充足的情况下,带宽越大越好。我买的是阿里云,相对来收较为便宜~

  • 获取到ECS实例后,首先使用root登录到服务器上,修改好密码,创建一个普通用户,配置好sudo之类的。最后,修改sshd的配置文件,主要修改项为:

    • 禁止root登录
    • 禁止密码登录
    • 使用公私钥认证
    • 上传自己的公钥到服务器
  • 到云服务器控制台开启相关端口。阿里云的控制台是:

    image-20220119200317643

    如需要开启frps运行的绑定端口、看板端口、公网服务器暴露出去的remote port等。

服务端

frp的官网上下载最新的release包,选择符合当前公网服务器架构的二进制包。我采用的是stcp模式,这样可以避免在服务器上暴露端口,修改frps.ini,配置如下:

[common]
bind_port = 7000
authentication_method = token
token = auth_token # 修改为自己的token
dashboard_port = 7500
dashboard_user = admin # 最好不要用这样的用户名和密码
dashboard_pwd = admin123

客户端(被远程访问)

同样需要下载frp二进制包,修改frpc.ini,配置如下:

[common]
server_addr = server_ip
server_port = 7000
token = auth_token # 与服务器的token保持一致

[rdp_server]
type = stcp
use_encryption = true
use_compression = true
sk = secret_key # 修改为自己的sercet key
local_ip = 127.0.0.1
local_port = 3389

客户端(远程访问)

修改fprc.ini,配置如下:

[common]
server_addr = server_ip
server_port = 7000
token = auth_token # 与服务器的token保持一致

[rdp_client]
type = stcp
role = visitor
use_encryption = true
use_compression = true
sk = secret_key # 修改为自己的sercet key
server_name = rdp_server
local_ip = 127.0.0.1
bind_port = 7001

最后使用Remote Desktop访问127.0.0.1:7001地址,然后填好账户名,输入密码后即可远程访问内网的主机。

注册为服务

如果要用systemctl管理frp服务端的话,需要建立文件/usr/lib/systemd/system/frp.service,然后添加服务:

[Unit]
Description=frp server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /usr/local/bin/frps.ini
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit

[Install]
WantedBy=multi-user.target

然后执行:systemctl daemon-reload重启即可。重启后,可以用systemctl start/restart/stop/enable等来管理服务。

如果想要要在Windows上开机自启动的话,可以使用winsw或者nssm,将frp注册为服务,然后就会开机自启动了。

winsw为例,下载了二进制包后,编写frp_rdp.xml

<service>
    <id>frp</id>
    <name>frp_0.38.0_windows_amd64</name>
    <description>frpc client, this computer will be visited by rdp</description>
    <executable>E:\frp_0.38.0_windows_amd64\frpc.exe</executable>
    <arguments>-c E:\frp_0.38.0_windows_amd64\frpc.ini</arguments>
    <onfailure action="restart" delay="60 sec"/>
    <onfailure action="restart" delay="120 sec"/>
    <logmode>append</logmode>
    <logpath>logs</logpath>
</service>

然后执行:

winsw.exe install frp_rdp.xml
winsw.exe start frp_rdp.xml

总结

只要搭建过一次内网穿透的服务,其他协议如ssh/http/ftp等的搭建都大同小异。为了安全起见,建议:

  • 除了frps的绑定端口,尽量不要在公网服务器上暴露端口,小心被扫
  • 尽量使用认证、鉴权,开启TLS等机制保障通信安全
  • 关注frp的最新发布包并及时更新,毕竟万一frp爆出个漏洞,内网的主机是存在很大风险的

相关链接