FRP简介
FRP是公认最好用的内网穿透工具,开源免费且安全。只需要有同一台公网服务器搭建FRP的服务器既可以实现局域网设备的服务公网发现,局域网设备与另一个局域网设备联机游戏,ssh远程局域网群晖Linux系统。FRP服务器下面简称FRPS,FRP客户端下面简称FRPC。
FRP支持的协议有TCP/UDP/HTTP/HTTPS/P2P
FRPS搭建
要想使用FRP,我们需要一台有公网IP的服务器搭建FRP服务,可以去官网下载链接Releases · fatedier/frp下载对应的版本和符合自身系统架构的包。这里我下载frp_0.63.0_linux_amd64.tar.gz的包,我的是X86_64架构的系统,选择amd64的包。
1 | uname -m |
下载包到/opt目录下
1 | cd /opt |
进入解压好的目录,可以看到如下文件
这里面有frpc和对应客户端的toml配置文件,frps和对应的服务端toml配置文件,新版本的frp已经不推荐使用ini文件配置了。因为我们这里是搭建在服务器上,重点只看frps和他的配置文件。
FRPS配置
1 | vim frps.toml |
frps需要的配置内容不多。定义frp的监听端口bindport即可,web服务可选开启,一般不需要,web只是可视化状态而已。不需要开启可以删掉webserver的内容。
1 | bindPort = 7999 |
FRPS服务
还需要写一个frp的systemd服务,实现开机自启功能。
1 | vim /etc/systemd/system/frps.service |
以下内容写入文件
1 | [Unit] |
开启服务并设置开启自启
1 | systemctl start frps |
当看到绿色的active就表示正常启动运行了。
假设我的服务器IP是111.91.28.26,因为我在配置文件里开启了web服务,所以可以看看web服务有没有正常启动。浏览器访问111.91.28.26:7001,输入配置的账号密码,就可以打开他给的监控页面。
FRPC教程
服务器开启了,客户端怎么使用呢,我这里用安卓举例说明。我们需要到另一个项目里找到对应的包Releases · AceDroidX/frp-Android,该项目开发了适用于frp的apk,方便管理toml文件,也可以多开frp配置,下载安装以后添加配置文件。
tcp协议配置
当A想访问B的局域网服务时,A不需要配置FRPC,也不需要开启FRPC,只需要B开启和配置FRPC,而A只需要访问 FRP服务器的IP地址:映射端口 即可访问B的服务。
1 | serverAddr = "111.91.28.26" #服务器地址 |
例如,B的配置如上,开启本地的ssh服务,本地端口是22,映射到服务器的端口是6000,那么A只需要访问111.91.28.26:6001就可以访问到B的ssh服务,注意,服务器的6001要在防火墙开通,否则一样无法访问。
如果我们需要开通Java版本Minecraft局域网联机,也可以使用如下配置这样A就可以查询到B的minecraft服务,只需要在minecraft中填写服务器地址111.91.28.26:6000就可以找到服务器并加入局域网联机,当然,前提是minecraft游戏内要开通局域网联机。
1 | serverAddr = "111.91.28.26" #服务器地址 |
udp协议配置
udp的原理和访问逻辑与tcp一样,udp的配置与tcp相似,只需要type改成udp即可。
基岩版的minecraft使用的是udp协议,端口是19132,使用frp来穿透联机,配置如下。
1 | serverAddr = "111.91.28.26" #服务器地址 |
这样A就可以通过111.91.28.26:19132来访问B的游戏服务了。
P2P协议配置
P2P即点到点的服务,其作用是为 TCP 和 UDP 类型的服务提供一种安全访问的能力,避免让端口直接暴露在公网上导致任何人都能访问到。也因为是两台设备之间直接搭互联网桥梁,所以不需要经过frp服务器中转,不消耗FRP服务器的流量,速度也会快很多。也因为是点到点建立链接,所以需要AB都需要开启frpc。
P2P的xtcp/xudp
frp 提供了一种新的代理类型 xtcp
,用于在需要传输大量数据且不希望流量经过服务器的情况下实现内网穿透。xtcp
并不适用于所有类型的 NAT 设备,如果穿透失败,可以尝试使用 stcp
代理。
1 | serverAddr = "111.91.28.26" #服务器地址 |
secretKey是两者之间链接的密码,要一致才能链接上。
1 | serverAddr = "111.91.28.26" #服务器地址 |
完成后,AB都要此配置文件启动frpc,建立链接,开启局域网,这里以ssh服务为例,ssh -oPort=6000 test@127.0.0.1
- 启动设备 B 的 frpc,让它连接到 frps,注册服务。
- 启动设备 A 的 frpc,建立 visitor 连接,监听本地 6000 端口。
- 设备 A 本地访问
127.0.0.1:6000
,流量将 P2P 穿透后直连到设备 B 本地127.0.0.1:22
服务
P2P的stcp/sudp
某些内网服务,如果直接暴露在公网上,可能存在安全风险。使用 stcp(secret tcp)
类型的代理可以让您安全地将内网服务暴露给经过授权的用户,这需要访问者也部署 frpc 客户端。
1 | serverAddr = "111.91.28.26" #服务器地址 |
以Java版本的局域网联机,在B开启游戏局域网房间进行联机
1 | serverAddr = "111.91.28.26" #服务器地址 |
- 启动设备 B 的 frpc(Minecraft 所在主机)
- 启动设备 A 的 frpc(访问 Minecraft 的机器)
- 在设备 A 上打开 Minecraft,加入服务器
127.0.0.1:6000
即可访问设备 B 的游戏世界。