FRP服务配置实践
项目信息
官方文档: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。
stcp(secret tcp) 参照上述第二个proxies示例
使用stcp安全的暴露您的服务
配置secretKey选项,string类型
用户需使用访客端访问服务,访客端secretKey需要与客户端一致
xtcp
如果访客用户与应用客户端打洞连接成功,将提供P2P内网穿透服务,通信速率不再受到frps服务器性能限制。但穿透可能不成功。
配置secretKey选项,string类型
用户需使用访客端访问服务,访客端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的命令为: