前言

今年计划参加大学生信息安全大赛作品赛,为了让评委老师更便捷地体验我的作品,故希望实现前后端分离,将软件的功能实现放在单独的服务端。

考虑到这次项目涉及的模型环境都较为复制,所以腾讯云/阿里云上出租的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的工作流程可以分为以下几个步骤:

  1. 配置FRP服务器: 在公共网络上的服务器上部署FRP服务。这个服务器将监听来自FRP客户端的连接,并将来自互联网的请求转发到正确的内网服务。
  2. 配置FRP客户端: 在需要进行内网穿透的内网设备上部署FRP客户端。这个客户端将与FRP服务器建立连接,并根据配置将内网服务通过服务器暴露给外网。
  3. 建立隧道: 当FRP客户端启动后,它会与FRP服务器建立一个隧道连接。这个隧道被用来转发请求和响应。
  4. 请求转发: 当外网的用户或服务请求特定的服务时,FRP服务器接收到这个请求后,通过建立的隧道将请求转发到FRP客户端,再由客户端转发到内网的目标服务。
  5. 响应返回: 内网服务处理完请求后,响应会通过相同的隧道返回给FRP服务器,然后由FRP服务器发送回原始请求者。

下载安装包

本次搭建的服务端及客户端环境如下

服务端:腾讯云上租的CPU云服务器(ubuntu系统)

客户端:学校实验室的工作站(ubuntu系统)

进入frp的github项目发行页,这里我选择的是稍微往前一点的稳定版本0.51.2

由于我的两个终端上的系统都是linux/X86_64,选择下载对应版本的压缩包amd64

解压后的目录结构如下

三个客户端文件以及三个服务端文件,还有个LICENSE

我们将对应文件上传到对应终端即可

这里服务端直接使用wget命令下载到并解压更加方便

1
2
3
wget https://github.com/fatedier/frp/releases/download/v0.51.2/frp_0.51.2_linux_amd64.tar.gz
tar -zxvf frp_0.51.2_linux_amd64.tar.gz
cd frp_0.51.2_linux_amd64

但是由于我的腾讯云服务器设在内地,也没搭VPN,所以通过使用xftp连接后从本地上传

记得传好后执行chmod指令给上次的frp文件夹提权

1
sudo chmod 777 frp_0.51.2_linux_amd64

frps配置

查看frps.ini服务端配置文件

这里我们主要设置一些与客户端连接的端口以及口令

初始情况下只设置了与客户端连接的端口7000

当然,frp还提供了仪表盘功能,我们只需在配置文件中设置仪表盘的端口、用户名和密码

1
2
3
4
5
6
[common]
bind_port = 7000
dashboard_port = 7001
dashboard_user = root
dashboard_pwd = 123456
token = 123456
  • bind_port:客户端和服务端连接的端口
  • dashboard_port:服务端仪表盘的端口
  • dashboard_user:仪表盘用户名
  • dashboard_pwd:仪表盘密码
  • token:用于客户端和服务端连接的口令,两个终端上需保持一致

启动frps

我们可以执行以下指令在服务端开启frps服务

1
./frps -c frps.ini

此时我们应该能在公网ip:仪表盘端口上访问frp服务端的仪表盘

frpc配置

同样,客户端则是配置frpc.ini文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
token = 123456

[ocr]
type = tcp
local_ip= 127.0.0.1
local_port = 6789
remote_port= 6001

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
  • 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
2
./frps -c frps.ini &
./frpc -c frpc.ini &

开机自启动

腾讯云服务器上的客户端进程运行之后就不需要去管了

我们主要是得将客户端工作站上的frpc进程转为开机自启服务,避免关机重启后frpc还需要我们再手动去启动

使用apt命令安装systemd,用于控制开机自启

1
apt install systemd

/etc/systemd/system路径下新建frpc.service文件

在其中写入如下规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
User = root
Type = simple
Restart = on-failure
RestartSec = 5s
ExecStart = /path/to/frpc -c /path/to/frpc.ini

[Install]
WantedBy = multi-user.target

其中ExecStart的值为启动frpc的命令,文件路径需要使用绝对路径

执行如下指令启动服务

1
2
3
4
# 配置 frpc 开机自启。
systemctl enable frpc.service
# 启动 frpc 服务
systemctl start frpc.service

我们可以执行如下指令查看frpc服务的状态

1
systemctl status frpc.service

悲报

很不幸,本人在学校工作站上搭建的内网穿透服务只存活了两周左右的时间,可能是frp的通信特征被学校网络中心侦测到了。以后测试软件只能用todesk远控哩😭