前言
应用场景
- 远程(桌面)连接,办公与学习
- 游戏服务器搭建
- 个人网盘远程访问
- 内部服务公网访问
- 适用于公网设备配置不高,但有高带宽和稳定的IP
技术原理
服务端运行,监听一个主端口,等待客户端的连接; 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型; 服务端fork新的进程监听客户端指定的端口; 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端; 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
简单来说,就是一个客户端,一个服务端,客户端和服务端建立连接,同时告诉服务端说,你要监听XX端口XX服务,然后有人来访问服务端那个端口,就会把流量转给客户端处理
实现教程
清楚了你的需求和技术原理之后,我们就开始着手实现,首先来看一下我们需要准备的东西
- 带有公网IP的设备
- 运行服务的内网设备
- 内网穿透工具 frp
大概流程
- 打开github项目,下载对应的版本,每个版本的压缩文件中都会带有客户端和服务端,s为服务端(server),c为客户端(client)
- 将文件放在公网IP的设备上,解压编辑配置文件frps.toml后运行
- 在内网设备配置好客户端文件后运行
具体教程
以下只是本人根据自己的情况进行的配置,如果有问题,请结合官方文档操作——frp官方文档
- 下载文件
可以看到有各种版本的,包括安卓、Linux、Windows等等
我这里服务端是Linux,客户端是windows,所以需要下载两个版本的文件
- 配置服务端
下载解压之后,其中的frps和frps.toml是服务端文件运行所需要的,先不要急着运行,先编辑配置文件进行配置
# frps.toml
bindPort = 7000 # 服务端与客户端通信端口
auth.token = "填写你的token" # 身份验证令牌,frpc要与frps一致
vhostHTTPPort = 80 #配置HTTP端口,如果你想开启web服务的话,当然也可以配置https
# Server Dashboard,可以查看frp服务状态以及统计信息
webServer.addr = "0.0.0.0" # 后台管理地址,一定要写四个0地址,写127地址是无法打开的
webServer.port = 7500 # 后台管理端口
webServer.user = "admin" # 后台登录用户名
webServer.password = "admin" # 后台登录密码
以上是我的配置文件,当然,你也可以查看官方的配置文件,只不过我们不一定需要那么多,多配置不如少配置
官方配置文件——frp完整配置文件示例
服务端测试
配置文件填写完成后,使用命令./frps -c ./frps.toml
运行服务端,然后使用IP+端口打开后台,如果可以正常访问,则运行成功
- 配置客户端
客户端我用的是Windows版本,其他版本的操作方法都大同小异,不再演示
和服务端一样,保留frpc和fprc.toml,使用编辑器打开配置文件
serverAddr = "你的公网IP" #远程服务器IP
serverPort = 7000 #流量转发服务器端口
#认证秘钥
auth.token = "和服务端token保持一致"
#具体的连接配置
#http配置(需要服务端配置vhostHTTPPort或HTTPS)
[[proxies]]
name = "web1" #name随意,唯一
type = "http" #类型有tcp、udp、http、https等
localPort = 8088 #本地端口
customDomains = ["填写你的域名"] #将域名解析到公网IP,即可访问内网web服务
#配置多个网站,只需要要修改name,本地端口和域名,按照域名访问即可
#tcp连接测试
[[proxies]]
name = "test_tcp"
type = "tcp"
localPort = 8089
remotePort = 8099
配置文件填好之后,使用命令frpc.exe -c frpc.toml
运行,如果没有报错且出现success说明成功了
访问内网服务
我们可以打开服务端后台查看是否有连接
可以看到后台已经出现了tcp连接信息,说明我们已经可以通过互联网访问内网服务了
我们可以将端口改为3389或22等基于tcp协议的一些服务,这样就可以实现远程(桌面)连接
Frp桌面客户端
以上配置是使用命令行和修改配置文件实现的,这里给大家推荐一个可视化、跨平台的frp客户端工具
具体可以看图片
后话
由于服务端和客户端的运行和建立连接,都是通过所在的终端进程进行的,所以只要终端会话关闭,服务也就停止了,我们可以将启动方式改为服务启动从而实现后台运行
方案实现
我的方案是将服务端转入后台运行,这样只需要配置好服务端启动一次,客户端就可以随连随用
网络上的教程大多都是将frps添加为一个服务,使用systemctl进行管理,但是经过我的实际操作,问题很多而且也不够简单
我的方法是通过切换终端会话(类似tty切换)来保持后台运行,我使用的软件是tmux,当然你也可以使用其他软件,如screen等
使用tmux实现最简操作
tmux
./frps -c ./frps.toml
#快捷键Ctrl+B D 即可保留终端会话,转入后台运行
tmux的一些使用教程
#tmux帮助手册
#使用方法
输入'tmux'打开tmux窗口进入
输入'exit'或快捷键'ctrl+d'退出,不保留会话和进程
#创建会话
tmux new -s 会话名 (默认从0-n)
#分离会话
输入'tmux detach'或快捷键'ctrl+b d'
执行后退出tmux窗口,但会话和进程转入后台运行
#查看会话
tmux ls
#进入会话
tmux attach -t 会话名/编号
#杀死会话
tmux kill-session -t 编号/会话名
#切换会话
tmux switch -t 编号/会话
#重命名会话
tmux rename-session -t 编号/会话名
#快捷键
Ctrl+b d:分离当前会话
Ctrl+b s:列出所有会话
Ctrl+b $:重命名当前会话
#最简操作
新建会话tmux。
在 Tmux 窗口运行所需的程序。
按下快捷键Ctrl+b d将会话分离。
下次使用时,重新连接到会话tmux attach-session -t my_session。