项目信息

项目地址:fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. (github.com)

官方文档:frp (gofrp.org)

FRP(Fast Reverse Proxy)是一个应用很广泛的内网穿透技术。网上也有很多成熟的FRP穿透方案,广泛提供于个人搭建游戏服务器、小规模内网映射等服务。本文将简单介绍自部署FRP进行服务映射的流程。

FRP官方文档非常详细,专业应用建议参考官方文档,本文将以简单明了的方式分享在一般端口映射规则下的配置实践。

自部署FRP分为服务端frps和客户端frpc两个部分,其中服务端需要搭建在有公网IP的服务器上用作穿透服务,客户端则运行在需要穿透服务的内网机器或访问者客户端中。项目由go语言编写,在项目release中下载二进制文件压缩包,解压直接放置在合理位置,并配置文件运行即可

务必注意:早期版本配置文件字段格式、ini文件等方式已被弃用,关注文档更新!

环境介绍

  • FRP版本:0.54.0

  • 服务器主机环境:Debian 11 x86 64位

  • 客户端:Debian 12 x86 64位

  • 访客环境:Windows 10 22H2

本文分三个部分讲解FRP配置过程:

  • FRP Server:有公网IP的机器

  • FRP Client:应用服务提供者,需要穿透的应用端

  • FRP Visitor:需要访问验证的用户终端

FRP Server

配置

服务器端的配置相当简单,仅需开放对应端口即可。

将对应版本的frps二进制文件和frps.toml配置文件放置在服务器合适目录下,编写frps.toml文件配置:

bindProt = 7000 # (必填)服务器连接端口

此外,服务端常用的配置还包括身份鉴权auth.token、端口白名单allowPorts

# 鉴权:客户端该值与服务端一致才能建立链接
auth.token = "abc" 
# 端口白名单,防止端口滥用
allowPorts = [
  { start = 2000, end = 3000 },
  { single = 3001 },
  { single = 3003 },
  { start = 4000, end = 50000 }
]

检查与启动

常用命令两条:

frps verify -c ./frps.toml # 检验配置文件是否正确编写
./frps -c ./frps.toml # 启动服务器程序

注册为systemd服务

/etc/systemd/system/ 目录下新建文件frps.service,写入内容:

[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 记得改为实际路径
ExecStart = /home/username/frps -c /home/username/frps.toml

[Install]
WantedBy = multi-user.target

设置自启动

sudo systemctl enable frps

完成后就可以使用systemd命令管理frps服务了。

FRP Client

客户端需要配置的内容稍微多一些,自定义程度也很高,但实际上我们需要关注的场景并不复杂。这里我以最常用的端口映射为例,分享一下我的时间过程。同样在合适路径传入frpc和frpc.toml配置文件。

serverAddr = "0.0.0.0"
serverPort = 7000

[[proxies]]
name = "service"
type = "tcp"
localIP = "127.0.0.1" 
localPort = 6000
remotePort = 6000

[[proxies]]
name = "secret_ssh"
type = "stcp"
# 只有与此处设置的 secretKey 一致的用户才能访问此服务
secretKey = "abcdefg"
localIP = "127.0.0.1"
localPort = 22

# 更多的服务把上面一段cv着改就行


服务器地址serverAddr和端口serverPort和frps端保持一致即可。

一个[[proxies]]表示一段代理服务配置,包括的内容和常见选项如下:

  • name:服务名称,随意

  • type:常见选项有:tcp/udp/stcp/xtcp

  • localIp:本地服务IP地址

  • localPort:需要丢出去的本地端口

其中,我们特别关注type的选项。tcp和udp不用多说,下面介绍stcp和xtcp。

  1. stcp(secret tcp) 参照上述第二个proxies示例

    1. 使用stcp安全的暴露您的服务

    2. 配置secretKey选项,string类型

    3. 用户需使用访客端访问服务,访客端secretKey需要与客户端一致

  2. xtcp

    1. 如果访客用户与应用客户端打洞连接成功,将提供P2P内网穿透服务,通信速率不再受到frps服务器性能限制。但穿透可能不成功。

    2. 配置secretKey选项,string类型

    3. 用户需使用访客端访问服务,访客端secretkey需要与客户端一致

官方文档推荐使用stcp的方式暴露服务。

FRP Visitor

这里以stcp形式展示访客端配置。访客机器上需要部署的应用也是frpc以及frpc.toml配置文件。

serverAddr = "0.0.0.0"
serverPort = 7000


serverAddr = "x.x.x.x"
serverPort = 7000

[[visitors]]
name = "secret_ssh_visitor"
type = "stcp"
# 要访问的 stcp 代理的名字
serverName = "secret_ssh"
secretKey = "abcdefg"
# 绑定本地端口以访问 SSH 服务
bindAddr = "127.0.0.1"
bindPort = 6000

# 更多的服务把上面一段cv着改就行


访客端同frpc客户端一致,一个[[visitors]]表示一段访客应用。需要关注的配置选项如下:

  • serverName:与frpc客户端一致

  • secretKey:与frpc客户端一致

  • bindAddr:需要访问服务的本地客户端IP

  • bindPort:本地绑定访问服务的端口

在本例中,访客本机访问ssh的命令为: