抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

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
2
3
4
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_linux_amd64.tar.gz
tar zxf frp* #解压下载frp包,模糊匹配
cd frp_0.63.0_linux_amd64

进入解压好的目录,可以看到如下文件

img

这里面有frpc和对应客户端的toml配置文件,frps和对应的服务端toml配置文件,新版本的frp已经不推荐使用ini文件配置了。因为我们这里是搭建在服务器上,重点只看frps和他的配置文件。

FRPS配置

1
vim frps.toml

frps需要的配置内容不多。定义frp的监听端口bindport即可,web服务可选开启,一般不需要,web只是可视化状态而已。不需要开启可以删掉webserver的内容。

frps.toml
1
2
3
4
5
6
7
8
bindPort = 7999

#web服务启动配置
webServer.addr = "0.0.0.0"
webServer.port = 7001
webServer.user = "admin"
webServer.password = "admin"

FRPS服务

还需要写一个frp的systemd服务,实现开机自启功能。

1
vim /etc/systemd/system/frps.service

以下内容写入文件

frps.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=frps
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
ExecStart=/opt/frp_0.63.0_linux_amd64/frps -c /opt/frp_0.63.0_linux_amd64/frps.toml
Restart=always

[Install]
WantedBy=multi-user.target

开启服务并设置开启自启

1
2
3
systemctl start frps
systemctl enable frps
systemctl status frps #查看是否启动成功

当看到绿色的active就表示正常启动运行了。

img

假设我的服务器IP是111.91.28.26,因为我在配置文件里开启了web服务,所以可以看看web服务有没有正常启动。浏览器访问111.91.28.26:7001,输入配置的账号密码,就可以打开他给的监控页面。

img

FRPC教程

服务器开启了,客户端怎么使用呢,我这里用安卓举例说明。我们需要到另一个项目里找到对应的包Releases · AceDroidX/frp-Android,该项目开发了适用于frp的apk,方便管理toml文件,也可以多开frp配置,下载安装以后添加配置文件。

tcp协议配置

当A想访问B的局域网服务时,A不需要配置FRPC,也不需要开启FRPC,只需要B开启和配置FRPC,而A只需要访问 FRP服务器的IP地址:映射端口 即可访问B的服务。

img

B的frpc.toml
1
2
3
4
5
6
7
8
9
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001

例如,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游戏内要开通局域网联机。

B的frpc.toml
1
2
3
4
5
6
7
8
9
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[[proxies]]
name = "mc-server"
type = "tcp"
localIP = "127.0.0.1"
localPort = 25565
remotePort = 6000 # 公网暴露端口,玩家A连接这个端口

udp协议配置

udp的原理和访问逻辑与tcp一样,udp的配置与tcp相似,只需要type改成udp即可。

基岩版的minecraft使用的是udp协议,端口是19132,使用frp来穿透联机,配置如下。

B的frpc.toml
1
2
3
4
5
6
7
8
9
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[[proxies]]
name = "mc-bedrock"
type = "udp"
localIP = "127.0.0.1"
localPort = 19132
remotePort = 19132 # 或其它未被占用的端口

这样A就可以通过111.91.28.26:19132来访问B的游戏服务了。

P2P协议配置

img

P2P即点到点的服务,其作用是为 TCP 和 UDP 类型的服务提供一种安全访问的能力,避免让端口直接暴露在公网上导致任何人都能访问到。也因为是两台设备之间直接搭互联网桥梁,所以不需要经过frp服务器中转,不消耗FRP服务器的流量,速度也会快很多。也因为是点到点建立链接,所以需要AB都需要开启frpc。

P2P的xtcp/xudp

frp 提供了一种新的代理类型 xtcp,用于在需要传输大量数据且不希望流量经过服务器的情况下实现内网穿透。xtcp 并不适用于所有类型的 NAT 设备,如果穿透失败,可以尝试使用 stcp 代理。

A的frpc.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[[visitors]]
name = "p2p_ssh_visitor"
type = "xtcp"
# 要访问的 P2P 代理的名称
serverName = "p2p_ssh"
secretKey = "abcdefg"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000
# 如果需要自动保持隧道打开,将其设置为 true
# keepTunnelOpen = false

secretKey是两者之间链接的密码,要一致才能链接上。

B 的frpc.toml
1
2
3
4
5
6
7
8
9
10
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[[proxies]]
name = "p2p_ssh"
type = "xtcp"
# 只有共享密钥 (secretKey) 与服务器端一致的用户才能访问该服务
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22

完成后,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 客户端。

A的frpc.toml
1
2
3
4
5
6
7
8
9
10
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[[visitors]]
name = "secret_minecraft_visitor"
type = "stcp"
server_name = "secret_minecraft"
secret_key = "abcdefg"
bind_addr = "127.0.0.1"
bind_port = 6000 # 本地暴露端口,连接这个端口即可

以Java版本的局域网联机,在B开启游戏局域网房间进行联机

B的frpc.toml
1
2
3
4
5
6
7
8
serverAddr = "111.91.28.26"  #服务器地址
serverPort = 7999 #服务器的FRP端口

[secret_minecraft]
type = "stcp"
secret_key = "abcdefg"
local_ip = "127.0.0.1"
local_port = 25565 # Minecraft 默认端口
  • 启动设备 B 的 frpc(Minecraft 所在主机)
  • 启动设备 A 的 frpc(访问 Minecraft 的机器)
  • 在设备 A 上打开 Minecraft,加入服务器 127.0.0.1:6000 即可访问设备 B 的游戏世界。

评论