记录一次FRP内网穿透搭建
前言
今年计划参加大学生信息安全大赛作品赛,为了让评委老师更便捷地体验我的作品,故希望实现前后端分离,将软件的功能实现放在单独的服务端。
考虑到这次项目涉及的模型环境都较为复制,所以腾讯云/阿里云上出租的CPU云服务器肯定达不到运行要求,而GPU云服务器费用又较贵,从现在租到六月份不太显示
最后综合考虑后,只能退而求其次,舍弃一部分并发处理的性能,直接将学校的工作站作为服务端,而由于工作站没有公网IP,所以就需要涉及到内网穿透技术
内网穿透技术,也被称为NAT穿透技术(Network Address Translation穿透),是一种允许互联网上的设备访问位于私有网络(例如家庭或办公网络)内部的设备或服务的技术。
原理
FRP(Fast Reverse Proxy)是github上的一个开源内网穿透项目。当然开源也是我选择它的主要原因。
项目地址:https://github.com/fatedier/frp?tab=readme-ov-file
FRP通过设置一个公共网络上的服务器(称为FRP服务器)和在内网设备上运行的客户端(称为FRP客户端)来工作。FRP的工作流程可以分为以下几个步骤:
- 配置FRP服务器: 在公共网络上的服务器上部署FRP服务。这个服务器将监听来自FRP客户端的连接,并将来自互联网的请求转发到正确的内网服务。
- 配置FRP客户端: 在需要进行内网穿透的内网设备上部署FRP客户端。这个客户端将与FRP服务器建立连接,并根据配置将内网服务通过服务器暴露给外网。
- 建立隧道: 当FRP客户端启动后,它会与FRP服务器建立一个隧道连接。这个隧道被用来转发请求和响应。
- 请求转发: 当外网的用户或服务请求特定的服务时,FRP服务器接收到这个请求后,通过建立的隧道将请求转发到FRP客户端,再由客户端转发到内网的目标服务。
- 响应返回: 内网服务处理完请求后,响应会通过相同的隧道返回给FRP服务器,然后由FRP服务器发送回原始请求者。
下载安装包
本次搭建的服务端及客户端环境如下
服务端:腾讯云上租的CPU云服务器(ubuntu系统)
客户端:学校实验室的工作站(ubuntu系统)
进入frp的github项目发行页,这里我选择的是稍微往前一点的稳定版本0.51.2
由于我的两个终端上的系统都是linux/X86_64,选择下载对应版本的压缩包amd64
解压后的目录结构如下
三个客户端文件以及三个服务端文件,还有个LICENSE
我们将对应文件上传到对应终端即可
这里服务端直接使用wget
命令下载到并解压更加方便
1 | wget https://github.com/fatedier/frp/releases/download/v0.51.2/frp_0.51.2_linux_amd64.tar.gz |
但是由于我的腾讯云服务器设在内地,也没搭VPN,所以通过使用xftp连接后从本地上传
记得传好后执行chmod
指令给上次的frp文件夹提权
1 | sudo chmod 777 frp_0.51.2_linux_amd64 |
frps配置
查看frps.ini
服务端配置文件
这里我们主要设置一些与客户端连接的端口以及口令
初始情况下只设置了与客户端连接的端口7000
当然,frp还提供了仪表盘功能,我们只需在配置文件中设置仪表盘的端口、用户名和密码
1 | [common] |
- bind_port:客户端和服务端连接的端口
- dashboard_port:服务端仪表盘的端口
- dashboard_user:仪表盘用户名
- dashboard_pwd:仪表盘密码
- token:用于客户端和服务端连接的口令,两个终端上需保持一致
启动frps
我们可以执行以下指令在服务端开启frps服务
1 | ./frps -c frps.ini |
此时我们应该能在公网ip:仪表盘端口
上访问frp服务端的仪表盘
frpc配置
同样,客户端则是配置frpc.ini
文件
1 | [common] |
- server_addr:服务端的ip。
- server_port:服务端配置的连接端口。
- token:服务端配置的token。
- [xxx]:表示一个规则的名称,可以自己定义。
- type:表示转发的协议类型,有tcp、udp等选项可以选择。
- local_ip:客户端的本地ip。
- local_port:客户端的本地端口号。
- remote_port:服务端开放的端口号。当我们通过访问
server_addr : remote_port
就能转发到客户端(frpc)的服务 local_ip : local_port
上。
启动frpc
我们可以执行以下指令在客户端开启frpc服务
1 | ./frpc -c frpc.ini |
我们可以用ssh连上刚刚配置的ip和端口号,测试下是否搭建成功
持久化frp服务
后台运行
我们可以在启动frps和启动frpc的指令后分别加上&
,让它们在后台运行,避免终端进程被我们不小心中断
1 | ./frps -c frps.ini & |
开机自启动
腾讯云服务器上的客户端进程运行之后就不需要去管了
我们主要是得将客户端工作站上的frpc进程转为开机自启服务,避免关机重启后frpc还需要我们再手动去启动
使用apt
命令安装systemd
,用于控制开机自启
1 | apt install systemd |
在/etc/systemd/system
路径下新建frpc.service
文件
在其中写入如下规则
1 | [Unit] |
其中ExecStart的值为启动frpc的命令,文件路径需要使用绝对路径
执行如下指令启动服务
1 | 配置 frpc 开机自启。 |
我们可以执行如下指令查看frpc服务的状态
1 | systemctl status frpc.service |
悲报
很不幸,本人在学校工作站上搭建的内网穿透服务只存活了两周左右的时间,可能是frp的通信特征被学校网络中心侦测到了。以后测试软件只能用todesk远控哩😭