纪录一次FRP内网穿透搭建

打印 上一主题 下一主题

主题 550|帖子 550|积分 1650

媒介

今年计划到场大学生信息安全大赛作品赛,为了让评委老师更便捷地体验我的作品,故希望实现前后端分离,将软件的功能实现放在单独的服务端。
考虑到这次项目涉及的模型情况都较为复制,所以腾讯云/阿里云上出租的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
  2. tar -zxvf frp_0.51.2_linux_amd64.tar.gz
  3. 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. [common]
  2. bind_port = 7000
  3. dashboard_port = 7001
  4. dashboard_user = root
  5. dashboard_pwd = 123456
  6. token = 123456
复制代码


  • bind_port:客户端和服务端连接的端口
  • dashboard_port:服务端仪表盘的端口
  • dashboard_user:仪表盘用户名
  • dashboard_pwd:仪表盘密码
  • token:用于客户端和服务端连接的口令,两个终端上需保持同等
启动frps

我们可以执行以下指令在服务端开启frps服务
  1. ./frps -c frps.ini
复制代码

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

frpc配置

同样,客户端则是配置frpc.ini文件
  1. [common]
  2. server_addr = xxx.xxx.xxx.xxx
  3. server_port = 7000
  4. token = 123456
  5. [ocr]
  6. type = tcp
  7. local_ip= 127.0.0.1
  8. local_port = 6789
  9. remote_port= 6001
  10. [ssh]
  11. type = tcp
  12. local_ip = 127.0.0.1
  13. local_port = 22
  14. 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. ./frps -c frps.ini
  2. &./frpc -c frpc.ini
  3. &
复制代码
开机自启动

腾讯云服务器上的客户端进程运行之后就不需要去管了
我们主要是得将客户端工作站上的frpc进程转为开机自启服务,避免关机重启后frpc还需要我们再手动去启动
使用apt下令安装systemd,用于控制开机自启
  1. apt install systemd
复制代码
在/etc/systemd/system路径下新建frpc.service文件
在此中写入如下规则
  1. [Unit]
  2. Description = frp client
  3. After = network.target syslog.target
  4. Wants = network.target
  5. [Service]
  6. User = root
  7. Type = simple
  8. Restart = on-failure
  9. RestartSec = 5s
  10. ExecStart = /path/to/frpc -c /path/to/frpc.ini
  11. [Install]
  12. WantedBy = multi-user.target
复制代码
此中ExecStart的值为启动frpc的下令,文件路径需要使用绝对路径
执行如下指令启动服务
  1. # 配置 frpc 开机自启。
  2. systemctl enable frpc.service
  3. # 启动 frpc 服务
  4. systemctl start frpc.service
复制代码
我们可以执行如下指令查看frpc服务的状态
  1. systemctl status frpc.service
复制代码
悲报

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表